Alokasi Memory

Posted by Aiska Hendra

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^

1 comments:

  1. Anonymous said...

    People should read this.

Post a Comment