![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вызов DLL функции
str9nom © (2007-09-18 22:50:00)Пытаюсь вызвать из своего приложения функцию из своей 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.
Что я забыл?
Sairex (2007-10-08 12:47:00) [1]Упс да забыл о StdCall;
Сергей М. (2007-10-08 12:22:00) [2]
> Sairex © (08.10.07 12:12) [7]
В твоем коде та же самая грубая ошибка с использованием соглашения о вызове.
Sairex (2007-10-08 12:12:00) [3]Твой код:
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-09-19 10:36:00) [4]
> Угадай, в чьей книжке... :)
Э-э-э-э... А у меня два варианта! :)
evvcom (2007-09-19 09:46:00) [5]
> Ega23 © (19.09.07 09:14) [4]
Слава, богу мне не довелось ее читать, но я много лестных отзывов о ней слышал на этом форуме :)
Ega23 (2007-09-19 09:14:00) [6]
> В примере ж каком-нить стояло, вот он и поставил
Угадай, в чьей книжке... :)
evvcom (2007-09-19 08:48:00) [7]Видимо, мода. В примере ж каком-нить стояло, вот он и поставил, да не везде. Может в примере не разглядел или книжка такая "хорошая" попалась :)
Юрий Зотов (2007-09-19 00:56:00) [8]> str9nom (18.09.07 22:50)
Зачем использовать stdcall, если не понимаешь, что оно означает и для чего нужно?
Если бы этого слова не было, то все бы работало. А уж если это слово проставлено, то оно должно быть проставлено и в прототипе функции.
Инс (2007-09-18 22:54:00) [9]EXE:
type
Tz = function(Value: PChar): Boolean; stdcall;