IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

Utilisation d'une DLL Delphi en C++


Sujet :

C++/CLI

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    74
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 74
    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 : 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.

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    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)();
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    74
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 74
    Par d�faut
    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.

  4. #4
    Membre Expert
    Inscrit en
    Ao�t 2010
    Messages
    732
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2010
    Messages : 732
    Par d�faut
    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.

  5. #5
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    74
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 74
    Par d�faut
    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

  7. #7
    Membre Expert
    Inscrit en
    Ao�t 2010
    Messages
    732
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2010
    Messages : 732
    Par d�faut
    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*.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Utiliser une DLL Delphi avec C#
    Par h8ciz dans le forum Windows Forms
    R�ponses: 3
    Dernier message: 27/09/2007, 16h46
  2. R�ponses: 1
    Dernier message: 22/05/2007, 12h03
  3. Utilisation d'une DLL Delphi en ASP
    Par [DreaMs] dans le forum ASP
    R�ponses: 1
    Dernier message: 08/11/2006, 00h11
  4. R�ponses: 1
    Dernier message: 18/07/2006, 16h44
  5. Utilisation d'une dll �crite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    R�ponses: 4
    Dernier message: 05/08/2002, 09h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo