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
Другие вопросы по тегам