Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

AV при вызове HeapAlloc [D5, NT4]


USAtyj ©   (2001-12-21 12:56:00) 

Пишу длл, которая в зависимости от pcCommand выдает результат в pcResult. Вот код экспортируемой функции:

function ExecCommand(pcCommand : PChar; var pcResult : PChar) : integer; stdcall;
var
sResult: String;
begin
pcResult := HeapAlloc(GetProcessHeap(), 0, 1023 + 1);
if (pcResult = nil) then
EXIT;
............
StrPCopy(pcResult, sResult);
end;

Так вот на первой же строчке, где пытаюсь выделить память в "куче" вылетает AV. (...Write of adress 00000000.)

Спасибо.


Digitman   (2001-12-21 16:10:00) [1]

из той же оперы - несоответствие способа передачи фактического аргумента описанию формального


USAtyj   (2001-12-21 15:50:00) [2]

Все спасибо за ответы...
Разобрался сам: ошибка была в описании функции в самой проге:
в DLL:
function ExecCommand(pcCommand : PChar; varpcResult : PChar) : integer; stdcall;
в проге:
function ExecCommand(pcCommand : PChar; pcResult : PChar) : integer; stdcall;


Digitman   (2001-12-21 15:16:00) [3]

проблема в передаче фактического параметра:

var pcResult : PChar

его адрес равен nil, вот и AV из за этого


Владислав   (2001-12-21 14:05:00) [4]

Извини, ошибочка вышла. Проверяй что возвращает GetProcessHeap(). Может там NULL...


Dimka Maslov   (2001-12-21 14:04:00) [5]

Выделяй необходимое количество памяти стандартными способами в вызывающей программе.

в вызывающей программе
var
Command, Result: string;
begin
Command:="Command";
SetString(Result, nil, 1024);
ExecCommand(PChar(Command), PChar(Result));
Result:=PChar(@Result[1]);
end;


в dll:
function ExecCommand(pcCommand, pcResult: PChar): Integer; stdcall;
var
sResult: string;
begin
.....
StrPCopy(pcResult, sResult);
end;


Владислав   (2001-12-21 13:59:00) [6]

Этим кодом ты не память выделяешь а кучу.


Наверх

Титульная страница Поиск, карта сайта Написать письмо