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_LOWER—GMEM_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:
•       dest—Pointer pada buffer tujuan
•       src—Pointer pada buffer sumber
•       length—jumlah 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



Kirim email ke