Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

вызов 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
2-1191912772
Scarllett
2007-10-09 10:52
2007.10.28
? OnClick event для страницы в MS EI


2-1191432426
artkil
2007-10-03 21:27
2007.10.28
Строки TListView


15-1190888082
Cyrax
2007-09-27 14:14
2007.10.28
Авторское право на схему города: пара тонких вопросов...


3-1182311007
O.O
2007-06-20 07:43
2007.10.28
Исправить ХП из программы


15-1190881952
Vlad Oshin
2007-09-27 12:32
2007.10.28
Как забросить Cookie на определенное время? Не получается