Bonjour à tous,
J'ai besoin d'utiliser une dll faite en delphi dans un projet C++.
Je fais quelques test avec une dll bidon et un projet bidon, juste pour avoir le principe de base, mais je rencontre différents problèmes.
Visiblement le load de la DLL, et le load des fonctions de passe correctement, par contre la récupération des résultat ce n'est pas pareil.
Tout d'abord, une fonction delphi qui me retourne une variable de type PChar (on m'a dit qu'il fallait du pchar pour le C++, mais je n'en suis pas plus certain)
ensuite ma fonction C++ qui load la dll, et lance la fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Function testpchar:pchar;stdcall; var res : pchar; begin StrPCopy(res,'zRésultat de testpchar'); Result:= res; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef char* (*TestPCharFunc)();Celà me donne comme résultat "z" ... soit, la 1ère lettre de ce que me retourne la fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 private: System::Void DelphiTestPChar() { std::string resultpchar ; String^ resultpchar2; TestPCharFunc fntestpchar; // Load DLL file HINSTANCE hInstLibrary = LoadLibrary((LPCWSTR)L"Project4.dll"); if (hInstLibrary){ // Get function pointer fntestpchar = (TestPCharFunc)GetProcAddress(hInstLibrary, "testpchar"); // Call function. if (fntestpchar){ resultpchar = fntestpchar(); resultpchar2 = gcnew String(resultpchar.c_str()); MessageBox::Show(resultpchar2,"msg",MessageBoxButtons::OK,MessageBoxIcon::Question); } // Unload DLL file FreeLibrary(hInstLibrary); }else{ MessageBox::Show("DLL Failed To Load!","msg",MessageBoxButtons::YesNo,MessageBoxIcon::Question); } }
J'ai un soucis également avec une fonction de même type, mais qui retourne de l'integer.
la fonction delphi
la fonction C++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4Function test:Integer;stdcall; begin Result:=9; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef int (*TestFunc)();Ceci ne compil pas, et me donne une erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 private: System::Void DelphiTest() { int resulttest; TestFunc fntest; // Load DLL file HINSTANCE hInstLibrary = LoadLibrary((LPCWSTR)L"Project4.dll"); if (hInstLibrary){ // Get function pointer fntest = (TestFunc)GetProcAddress(hInstLibrary, "test"); // Call function. if (fntest){ resulttest = fntest; } // Unload DLL file FreeLibrary(hInstLibrary); }else{ MessageBox::Show("DLL Failed To Load!","msg",MessageBoxButtons::YesNo,MessageBoxIcon::Question); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part Error 1 error C2440: '=' : cannot convert from 'test_apidll::Form1::TestFunc' to 'int'
Je suis sur qu'il n'y a pas grand chose à faire pour que celà tourne, mais vu le nombre d'années qui me séparent de ma courte pratique du C++ ... je ne trouve pas.
Quelqu'un peut-il m'aiguiller, ou mieux, me corriger ce bout de code ?
Merci d'avance.
Partager