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

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

вызов 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;


Наверх

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