Главная страница
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.013 c
2-1191401258
User_0
2007-10-03 12:47
2007.10.28
Как записать путь к БД в *.ini(Interbase)


4-1177611920
Angakok
2007-04-26 22:25
2007.10.28
Перевод пикселей в миллиметры


2-1191323650
Denis_
2007-10-02 15:14
2007.10.28
Смена даты открытия файла.


2-1191430108
timekiller
2007-10-03 20:48
2007.10.28
Удаление динамических объектов / полная очистка формы


2-1191499151
два_программера
2007-10-04 15:59
2007.10.28
paradox, adoconnection,adoquery