Главная страница
    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.46 MB
Время: 0.042 c
2-1191565058
vlad0
2007-10-05 10:17
2007.10.28
Счетчик ссылок.


2-1191423908
Kolan
2007-10-03 19:05
2007.10.28
Как поймать клик по Табу в TabControl е?


4-1176882413
igornov
2007-04-18 11:46
2007.10.28
Как сделать сервис скрытым?


2-1191383815
Alex_Y
2007-10-03 07:56
2007.10.28
GetTextExtentPoint


11-1175206803
nester
2007-03-30 02:20
2007.10.28
БагРепорт: RegKeyGetValueNames съедает последнюю букву





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский