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^
Subscribe to:
Post Comments (Atom)
People should read this.