Dear All, Buat VB coder yang budiman mungkin sedikit tulisan saya ini dapat membantu anda memahami dan mendapatkan pencerahan bagaimana melakukan alokasi dan membaca data dalam memory.
Salah Satu alasan para programmer untuk menggunakan Windows API dapat melakukan memanipulasi memory, untuk dapat memanipulasi memory kita dapat menggunakan Fungsi API Globalalloc (mengalokasikan memori), Globallock (mengunci memori dan mendapatkan pointernya), Globalunlock ( membuka kunci memori), dan Globalfree ( Disalokasikan memori) Sekarang kita lihat bagaimana cara mengcopy data kedalam memory. untuk itu kita perlu satu fungsi API lagi untuk mengcopy memori yaitu MoveMemory (memindah posisi memory) Sebelum kita dapat menggunakan Fungsi API kita harus mendeklarasikan fungsi API tersebut, sekarang kita deklarasikan dulu fungsi API-nya. Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long jika anda bingung menggunakan wFlags pada fungsi Globalalloc ini daftar constant value untuk wFlags Globalalloc: GMEM_FIXED&H0 GMEM_MOVEABLE&H2 GMEM_NOCOMPACT&H10 GMEM_NODISCARD&H20 GMEM_ZEROINIT&H40 GMEM_MODIFY&H80 GMEM_DISCARDABLE&H100 GMEM_NOT_BANKED&H1000 GMEM_SHARE&H2000 GMEM_DDESHARE&H2000 GMEM_NOTIFY&H4000 GMEM_LOWERGMEM_NOT_BANKED GMEM_VALID_FLAGS&H7F72 GMEM_INVALID_HANDLE&H8000 Selain wFlags anda juga anda juga harus menentukan dwBytes yang merupakan jumlah byte yang diminta dari memory. Untuk mendapatkan pointer dari memory anda dapat menggunakan Globallock yang akan mengunci memory yang telah di alokasikan dari Globalalloc. Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long Selain GlobalAlloc dan GlobalLock anda juga dapat memindah data yang ada didalam memory dengan menggunakan Fungsi MoveMemory. Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal dest As Any, ByVal src As Any, ByVal length As Long) Ini argumen untuk MoveMemory: destPointer pada buffer tujuan srcPointer pada buffer sumber lengthjumlah byte memory yang akan dipindah Untuk mengalokasikan memory kota gunakan Globalalloc, untuk mengunci dan mengambil pointer dari memory kita gunakan Globallock dan untuk membukanya kembali kita gunakan fungsi API Globalunlock. Deklarasi untuk fungsi API ini adalah: Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long Dimana hMem adalah pointer dari memory yang telah terkunci. Selain itu kita juga perlu melakukan pembersihan dan mendisalokasikan data memory dengan menggunakan fungsi API Globalfree Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long Dimana hMem adalah buffer dari memory yang dialokasikan. OK sekarang kita coba buat sample programnya, bagaimana menimpan string yang yang dimasukkan oleh user kedalam textbox kedalam memory dan memindahkannya. Dengan sample ini diharapkan anda dapat memahami perpindahan data dalam memory. Kita mulai dengan memasukkan 40 karakter long buffer untuk string yang anda didalam form. Const DataLength = 40 Dim outbuffer As String * DataLength Dim hMemory As Long Dim hMemoryPointer As Long Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long rivate Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal dest As Any, ByVal src As Any, ByVal length As Long) Const GMEM_MOVEABLE = &H2 Pada bagian Form design kita membutuhkan 2 object Textbox dan 2 CommandButton, tambahkan object tersebut pada form dan tambahkan kode berikut ini pada CommandButton: Private Sub Command1_Click() outbuffer = Text1.Text ` mengambil text dari Text1 hMemory = GlobalAlloc(GMEM_MOVEABLE, DataLength) ` mengalokasikan memori yang akan kita gunakan (outbuffer) hMemoryPointer = GlobalLock(hMemory) ` Mengunci dan mendapatkan pointer dari memory. Call MoveMemory(hMemoryPointer, outbuffer, DataLength) ` Memindahkan data outbuffer kedalam ke memory yang lain End Sub Kode diatas berfungsi untuk mengalokasikan isi dari dari Text1 dan memindahkannya buffer ke memory yang telah dialokasikan. Sekarang kita buat kode untuk melepaskan buffer dari dari memory dan memindahkannya kedalam text2. Private Sub Command2_Click() Call MoveMemory(inbuffer, hMemoryPointer, DataLength) Text2.Text = inbuffer GlobalUnlock (hMemoryPointer) GlobalFree (hMemory) End Sub Ok cukup sekian tulisan dari Aiska semoga tulisan ini bisa bermanfaat bagi teman-teman yang membaca dan terutama bagi saya sendiri yang sering lupa :) Terima Kasih Salam, ^Aiska Hendra^ Freelance Programmer
