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.