Utilisation d'une DLL Delphi en C++
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)
Code:
1 2 3 4 5 6
| Function testpchar:pchar;stdcall;
var res : pchar;
begin
StrPCopy(res,'zRésultat de testpchar');
Result:= res;
end; |
ensuite ma fonction C++ qui load la dll, et lance la fonction.
Code:
typedef char* (*TestPCharFunc)();
Code:
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);
}
} |
Celà me donne comme résultat "z" ... soit, la 1ère lettre de ce que me retourne la fonction.
J'ai un soucis également avec une fonction de même type, mais qui retourne de l'integer.
la fonction delphi
Code:
1 2 3 4
| Function test:Integer;stdcall;
begin
Result:=9;
end; |
la fonction C++
Code:
typedef int (*TestFunc)();
Code:
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);
}
} |
Ceci ne compil pas, et me donne une erreur
Code:
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.