MASM dll выделение памяти в многопоточном приложении
Я спросил, как динамически распределять память в MASM, но получил еще 2 вопроса.
Как я могу выделить память для байтов?
.data
tab DB ?
result DB ?
.code
invoke GetProcessHeap
; error here
mov tab, eax ; I cannot do this because of wrong sizes, AL and AH are equal 0
INVOKE HeapAlloc, tab, 0, <size>
invoke GetProcessHeap
mov result, eax ; same here
INVOKE HeapAlloc, result, 0, <size>
Второй вопрос, могу ли я использовать этот метод выделения памяти в многопоточном приложении или я должен использовать GlobalAlloc?
1 ответ
HeapAlloc
Функция принимает 3 аргумента:
hHeap
- ручка кучи объекта
flags
- флаги о том, как должна быть выделена память
size
- Размер блока памяти вам нужен
Функция возвращает одно двойное слово в EAX
это указатель на выделенную память.
Вам не нужно звонить GetProcessHeap
на каждый звонок в HeapAlloc.
Переменные tab
а также result
должно быть двойным словом, потому что указатели имеют двойное слово long (eax)
К блокам памяти, указанным этими указателями, можно обращаться с любым размером данных, который вам нужен. Они просто блоки памяти.
Функции кучи Windows являются поточно-ориентированными, и вы можете использовать их в многопоточных приложениях.
Как это все будет выглядеть в сборке:
.data
tab dd ?
result dd ?
.code
invoke GetProcessHeap
mov ebx, eax ; the heap handle
invoke HeapAlloc, ebx, 0, <size>
mov tab, eax ; now tab contains the pointer to the first memory block
invoke HeapAlloc, ebx, 0, <size>
mov result, eax ; now result contains the pointer to the second block