Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
Внизвызов DLL функции Найти похожие ветки
← →
str9nom (2007-09-18 22:50) [0]Пытаюсь вызвать из своего приложения функцию из своей dll, передав ей в качестве параметра PChar.
DLL:
function z(Value: PChar): Boolean; stdcall;
begin
ShowMessage(Value);
end;
exports z;
EXE:
type
Tz = function(Value: PChar): Boolean;
procedure TForm1.Button4Click(Sender: TObject);
var
MyHandle: THandle;
MyZ: Tz;
begin
MyHandle := LoadLibrary(PChar("ProjectDll.dll"));
@MyZ := GetProcAddress(MyHandle, "z");
if Assigned(@MyZ) then
begin
MyZ(PChar("zzz"));
end;
При попытке вызвать происходит MessageBox с мусором, а потом AV.
Что я забыл?
← →
Инс © (2007-09-18 22:54) [1]EXE:
type
Tz = function(Value: PChar): Boolean; stdcall;
← →
Юрий Зотов © (2007-09-19 00:56) [2]> str9nom (18.09.07 22:50)
Зачем использовать stdcall, если не понимаешь, что оно означает и для чего нужно?
Если бы этого слова не было, то все бы работало. А уж если это слово проставлено, то оно должно быть проставлено и в прототипе функции.
← →
evvcom © (2007-09-19 08:48) [3]Видимо, мода. В примере ж каком-нить стояло, вот он и поставил, да не везде. Может в примере не разглядел или книжка такая "хорошая" попалась :)
← →
Ega23 © (2007-09-19 09:14) [4]
> В примере ж каком-нить стояло, вот он и поставил
Угадай, в чьей книжке... :)
← →
evvcom © (2007-09-19 09:46) [5]
> Ega23 © (19.09.07 09:14) [4]
Слава, богу мне не довелось ее читать, но я много лестных отзывов о ней слышал на этом форуме :)
← →
Инс © (2007-09-19 10:36) [6]
> Угадай, в чьей книжке... :)
Э-э-э-э... А у меня два варианта! :)
← →
Sairex © (2007-10-08 12:12) [7]Твой код:
function z(Value: PChar): Boolean; stdcall;
begin
ShowMessage(Value);
end;
exports z;
EXE:
type
Tz = function(Value: PChar): Boolean;
procedure TForm1.Button4Click(Sender: TObject);
var
MyHandle: THandle;
MyZ: Tz;
begin
MyHandle := LoadLibrary(PChar("ProjectDll.dll"));
@MyZ := GetProcAddress(MyHandle, "z");
if Assigned(@MyZ) then
begin
MyZ(PChar("zzz"));
end;
Тоже самое только написаный мной
DLL:
function z(Value: PChar): Boolean; stdcall;
begin
ShowMessage(Value);
end;
exports z index 0;
EXE:
type
Tz = function(Value: PChar): Boolean;
procedure TForm1.Button4Click(Sender: TObject);
var MyHandle: THandle;
MyZ: Tz;
begin
try
MyHandle := LoadLibrary(PChar("ProjectDll.dll"));
if MyHandle>32 then
begin
@MyZ := GetProcAddress(MyHandle, "z");
if Addr(MyZ)<>nil then MyZ(PChar("zzz"))
else ShowMessage("Error Get address function");
end else ShowMessage("Error dll not found");
Finnaly
FreeLibrary(MyHandle);
End; // try finnaly
End;
Сравни...
← →
Сергей М. © (2007-10-08 12:22) [8]
> Sairex © (08.10.07 12:12) [7]
В твоем коде та же самая грубая ошибка с использованием соглашения о вызове.
← →
Sairex © (2007-10-08 12:47) [9]Упс да забыл о StdCall;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c