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

  1. #1
    Nouveau membre du Club
    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
    Points : 37
    Points
    37
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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
    Nouveau membre du Club
    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
    Points : 37
    Points
    37
    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 expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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
    Nouveau membre du Club
    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
    Points : 37
    Points
    37
    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 expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    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*.

  8. #8
    Nouveau membre du Club
    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
    Points : 37
    Points
    37
    Par défaut
    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.

+ 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