如何用GlobalAlloc分配内存?

api函数GlobalAlloc可以在堆中分配指定字节的内存。它的语法如下:

HGLOBAL WINAPI GlobalAlloc(
  _In_ UINT   uFlags,
  _In_ SIZE_T dwBytes
);

其中参数uFlags表示要分配的内存种类,参数 dwBytes表示要分配的内存字节大小。

GlobalAlloc可以分配可移动内存,也可以分配固定内存。

如果分配可移动内存,它的返回值是内存对象的句柄。如果要把可移动内存对象的句柄转化为实际的内存块的第一个字节的内存地址,需要用GlobalLock函数。

如果分配固定内存,它的返回值是分配的内存块的第一个字节的内存地址。

对于分配的内存,可以使用GlobalFree函数释放。

对于分配的内存,如果要获取它实际使用的大小,可以用GlobalSize函数获取。

以下是在vba中使用上述函数的一个示例:

Declare Function GlobalAlloc Lib "kernel32" (ByVal Flags As Long, ByVal length As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Enum MemoryAllocationAttributes
    GHND = &H42
    GMEM_FIXED = &H0
    GMEM_MOVEABLE = &H2
    GMEM_ZEROINIT = &H40
End Enum
Sub QQ1722187970()
    Dim hMem As Long
    hMem = GlobalAlloc(GHND, 10)
    Dim lHwnd As Long
    lHwnd = GlobalLock(hMem)
    Dim lSize As Long
    lSize = GlobalSize(hMem)
    GlobalFree (hMem)
    Debug.Print hMem, lHwnd, lSize
End Sub

 

       

发表评论