![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GetProcessHeaps
alex134 © (2003-04-05 18:13:00)Помогите плз разобраться со вторым параметром этой функции ! Если можно, маленький примерчик )
Morfein (2003-04-07 22:53:00) [1]Функция GetLastError(), вызванная сразу после GetProcessHeaps(), возвращает значение 120. Это соотв. ошибке ERROR_CALL_NOT_IMPLEMENTED.
ERROR_CALL_NOT_IMPLEMENTED
The Application Program Interface (API) entered will only work in WindowsNT mode.
boozook (2003-04-07 21:45:00) [2]1.
alex134 © (06.04.03 00:29)
P.S В коде счетчик цикла от 1 до number, хотя это на дело не влияет...
==> видимо его это не настораживает
2.
А можно туда пометить значение какой-либо переменной, скажем в Buffer[1] содержится указатель на другую область памяти. Просто интересно.
MBo (2003-04-07 06:39:00) [3]>array [ 1..100]
>for i:= 0to (number-1)
Не настораживает? ;))
>boozook
В Паскале будет именно так, как я написал
var-параметр функции GetProcessHeaps разруливается компилятором как адрес начала буфера.
boozook (2003-04-07 02:14:00) [4]В Паскалях не шарю, но осмелюсь предположить, что это все не правельные записи.
Возможно будет правильно так:
var
Buffer : array [1..100] of Handle;
...
begin
number:=GetProcessHeaps(100, @Buffer);
...
???
THandle, Handle или DWORD - это все двойные слова, а второй параметр - указатель на массив из них.
На сколько я помню со школы Buffer[1] - это не указатель, а само значение.
P.S. и на Си и на Асме у меня выдается 4.
alex134 (2003-04-06 00:29:00) [5]P.S В коде счетчик цикла от 1 до number, хотя это на дело не влияет...
alex134 (2003-04-06 00:27:00) [6]И вот такая радость вдобавок:
procedure TForm1.Button1Click(Sender: TObject);
var
Buffer : array [1..100] of THandle;
i : integer;
number : DWORD;
begin
number:=GetProcessHeaps(100, Buffer[1]);
ShowMessage(IntToStr(number));
for i:=0 to (number-1) do
Memo1.Lines.Add(IntToStr(Buffer[i]));
end;
Выдает всегда 0. Это как понимать? Типа 0 куч? В хэлпе сказано, что если функция возвращает 0 значит полюбому ошибка, потому что у любого процесса как минимум 1 куча.
alex134 (2003-04-05 23:57:00) [7]Спасибо, понял. Еще вопрос: Например у процесса 5 куч - я получил 5 хэндлов. А как теперь узнать фактическое расположение этих куч ? Т.е. по какому адресу находится каждая из них? Или хэндлы это и есть их адреса?
MBo (2003-04-05 18:33:00) [8]выделяешь память под буфер, который будет содержать дескрипторы куч, вызываешь функцию с параметром-первым элементом массива. Он может быть динамическим, возвращаемое значение - истинное количество куч. Если оно больше, чем запросил в первом параметре, реаллоцируй память и заново вызови.
Простейший случай:
var HeapHandles:array[1..100] of THandle;
n:integer;
begin
n:=GetProcessHeaps(100,HeapHandles[1]);