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 : 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;
ensuite ma fonction C++ qui load la dll, et lance la fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
typedef char* (*TestPCharFunc)();
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);
				}
			 }
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Function test:Integer;stdcall;
begin
  Result:=9;
end;
la fonction C++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
typedef int (*TestFunc)();
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);
				}
			 }
Ceci ne compil pas, et me donne une erreur
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.