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
发表评论