Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++ > Visual C++ > C++/CLI
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/08/2012, 15h01   #1
vin100H
Candidat au titre de Membre du Club
 
Inscription : août 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 74
Points : 13
Points : 13
Par défaut 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.
vin100H est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2012, 15h05   #2
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 553
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 553
Points : 4 109
Points : 4 109
Bonjour,

le message d'erreur est plutôt explicite : tu essayes de mettre dans un int un pointeur pour fonction.

fntest c'est un pointeur sur fonction, resulttest c'est un int, pas besoin d'aller plus loin pour voir que ça match pas.

Pour appeler la fonction, il faudrait quelque chose comme (*pfntest)();
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2012, 15h17   #3
vin100H
Candidat au titre de Membre du Club
 
Inscription : août 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 74
Points : 13
Points : 13
Citation:
Envoyé par Bousk Voir le message
Bonjour,

le message d'erreur est plutôt explicite : tu essayes de mettre dans un int un pointeur pour fonction.

fntest c'est un pointeur sur fonction, resulttest c'est un int, pas besoin d'aller plus loin pour voir que ça match pas.

Pour appeler la fonction, il faudrait quelque chose comme (*pfntest)();
Bien vu ... pfff je savais que c'était une connerie ..

Bon, l'utilisation de la fonction qui retourne un int est OK.

Par contre, j'ai toujours mon soucis avec la fonction qui retourne une chaine de caractère.
vin100H est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2012, 15h23   #4
Hibernatus34
Membre émérite
 
Inscription : août 2010
Messages : 531
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 531
Points : 998
Points : 998
Citation:
Envoyé par vin100H Voir le message
Par contre, j'ai toujours mon soucis avec la fonction qui retourne une chaine de caractère.
Ca serait pas juste une histoire de wide char ?
Essaie avec std::wstring à tout hasard.
Hibernatus34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2012, 15h28   #5
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 553
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 553
Points : 4 109
Points : 4 109
http://reisubar.developpez.com/tutor...trings-pchars/ ?
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2012, 15h29   #6
vin100H
Candidat au titre de Membre du Club
 
Inscription : août 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 74
Points : 13
Points : 13
Citation:
Envoyé par Hibernatus34 Voir le message
Ca serait pas juste une histoire de wide char ?
Essaie avec std::wstring à tout hasard.
celà doit être un truc du genre mais ????

Que dois-je donner comme typedef à ma fonction pour qu'elle me retourne un wchar ?

typedef wstring (*TestPCharFunc)(); ==> plantage à l'exécution
typedef wstring* (*TestPCharFunc)(); ==>erreur de compil
vin100H est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2012, 15h35   #7
Hibernatus34
Membre émérite
 
Inscription : août 2010
Messages : 531
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 531
Points : 998
Points : 998
Citation:
Envoyé par vin100H Voir le message
celà doit être un truc du genre mais ????

Que dois-je donner comme typedef à ma fonction pour qu'elle me retourne un wchar ?

typedef wstring (*TestPCharFunc)(); ==> plantage à l'exécution
typedef wstring* (*TestPCharFunc)(); ==>erreur de compil
Non.
J'ai vu dans ton code que tu passais par une std::string, donc j'ai proposé std::wstring.
Mais pour remplacer ton char*, tu dois mettre wchar_t*.
Hibernatus34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2012, 15h48   #8
vin100H
Candidat au titre de Membre du Club
 
Inscription : août 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 74
Points : 13
Points : 13
Citation:
Envoyé par Hibernatus34 Voir le message
Non.
J'ai vu dans ton code que tu passais par une std::string, donc j'ai proposé std::wstring.
Mais pour remplacer ton char*, tu dois mettre wchar_t*.
Niquel.

ça marche.


@Bousk, merci pour le lien ... très instructif, même si pas forcément évident à assimiler en 5 min.


le C++ à l'air plus "tordu" que delphi, mais j'ai l'impression que c'est vachement plus structuré et logique une fois qu'on s'y connait un peu.

Je note comme résolu.
vin100H est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h55.


 
 
 
 
Partenaires

Hébergement Web