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++Builder Discussion :

[Builder 5] Comment utiliser des fonctions d'une DLL (Delphi) ?


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut [Builder 5] Comment utiliser des fonctions d'une DLL (Delphi) ?
    Je développe principalement en Delphi. Mais, j'ai été amené à créer une DLL.
    J'essais de me rappeller mes lointains souvenir de C++, pour faire un petit exe qui fera appel aux fonction de ma DLL. Le but est de s'assurer que ma DLL peut être appellée depuis n'importe quel langage.

    Je suis sous C++Builder 5 Pro, et je coince dès le début pour inclure ma DLL à mon projet. Je pensais qu'un simple #include "MaDLL.dll" suffirait, mais apparemment non.
    J'ai fait une petite recherche dans la FAQ, mais rien sur les DLL.
    J'ai bien trouvé ce post (http://www.developpez.net/forums/sho...&highlight=dll), mais quand j'essais d'inclure le *.lib généré, j'ai les mêmes erreurs que pour la DLL :
    Caractère 'ÿ' (0x0) incorrect
    Caractère '@' (0x0) incorrect
    ...
    Si quelqu'un pouvait m'indiquer la marche à suivre ...
    Merci d'avance.

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il faut inclure le ou les en-têtes (.) contenant les déclarations des fonctions / classes de ta bibliothèque.
    Il faut ajouter le fichier bibliothèque (.lib) dans les options de l'éditeur de liens.

  3. #3
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par Laurent Gomila
    Il faut inclure le ou les en-têtes (.) contenant les déclarations des fonctions / classes de ta bibliothèque.
    C'est à dire ?
    Je n'ai plus fait de C++ depuis 2002.

    Citation Envoyé par Laurent Gomila
    Il faut ajouter le fichier bibliothèque (.lib) dans les options de l'éditeur de liens.
    Ca ne change rien. J'ai les mêmes erreurs.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Hmm... Est-ce que tu as des en-têtes (.h) qui vont avec ta bibliothèque ? Si ce n'est pas le cas il faudra procéder autrement (charger la DLL dynamiquement).

  5. #5
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par Laurent Gomila
    Hmm... Est-ce que tu as des en-têtes (.h) qui vont avec ta bibliothèque ?
    Non. Ca n'existe pas en Delphi. Ca doit être propre au C++.

    Citation Envoyé par Laurent Gomila
    Si ce n'est pas le cas il faudra procéder autrement (charger la DLL dynamiquement).
    Bon, j'ai essayé :
    - Dans le *.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef void (WINAPI *DLL_InitDemandeExtDLL) (int HandleApp, Pointer pSession, PChar sSociete, PChar sSite, PChar sLibelleAtelier, PChar sUtilisateur);
    typedef LongBool (WINAPI *DLL_AffDemandeExt) (int Mode, PChar sNumDemande, int nQuantite, Pointer pInfoDemande);
    - Dans le *.cpp :
    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
    27
       HMODULE hDLL = LoadLibrary("DemandeExt.dll");
       if(!hDLL)
       {
          ShowMessage("Erreur :  LoadLibrary !");
          return;
       }
     
       DLL_InitDemandeExtDLL pfn_InitDemandeExtDLL;
       DLL_AffDemandeExt pfn_AffDemandeExt;
     
       pfn_InitDemandeExtDLL = (DLL_InitDemandeExtDLL)GetProcAddress(hDLL, "InitDemandeExtDLL");
       if(!pfn_InitDemandeExtDLL)
       {
          ShowMessage("Erreur :  GetProcAdress InitDemandeExtDLL !");
          return;
       }
       pfn_AffDemandeExt = (DLL_AffDemandeExt)GetProcAddress(hDLL, "AffDemandeExt");
       if(!pfn_AffDemandeExt)
       {
          ShowMessage("Erreur :  GetProcAdress AffDemandeExt !");
          return;
       }
     
       pfn_InitDemandeExtDLL(0, &Session, "", "", "", "");
       pfn_AffDemandeExt(1, "", 1, NULL);
     
       FreeLibrary(hDLL);
    J'ai encore des erreurs, mais à l'exécution. Je pense que ça viens de ma DLL, qui ne respecte pas les standards Windows (trop pure Delphi).
    Est-ce que le code semble juste (du point de vue du C++) ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut
    Salut,
    J'ai déjà fait une telle chose (appeler une dll delphi depuis un programme C++)

    Tu dois tou d'abord éviter les type string dans delphi et utiliser plutot le type PChar, en plus dans C++ tu dois déclarer un pointeur sur type de la fonction qui a la meme signature que celle que t'as en delphi, la charger et enfin l'appeler.

  7. #7
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par bouzaidi
    Tu dois tou d'abord éviter les type string dans delphi et utiliser plutot le type PChar
    Effectivement. Je l'avais lu aussi. J'y ai fait attention.
    Par contre, pour les entiers et les booléens, quels sont les types possibles à utiliser ?

    Voici les prototypes en Delphi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       procedure InitDemandeExtDLL(HandleApp: HWND; pSession: Pointer; const sSociete, sSite, sLibelleAtelier, sUtilisateur: PChar);   stdcall;
       function AffDemandeExt(Mode: TMode; sNumDemande: PChar; nQuantite: Longint; pInfoDmd: PInfoDemande = nil): LongBool;   stdcall;
    Citation Envoyé par bouzaidi
    en plus dans C++ tu dois déclarer un pointeur sur type de la fonction qui a la meme signature que celle que t'as en delphi, la charger et enfin l'appeler.
    C'est pas ce que j'ai essayé de faire dans le code posté au-dessus (http://www.developpez.net/forums/sho...61&postcount=5) ?
    J'ai oublié des choses ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

Discussions similaires

  1. Utiliser des fonctions d'une DLL C++
    Par ced001 dans le forum Delphi
    Réponses: 2
    Dernier message: 09/02/2007, 16h03
  2. comment utiliser les fonctions d'une dll
    Par sebled dans le forum MFC
    Réponses: 3
    Dernier message: 24/02/2006, 16h59
  3. utilisation des fonctions d'une dll
    Par jackk dans le forum C++
    Réponses: 14
    Dernier message: 15/06/2005, 16h50
  4. Réponses: 14
    Dernier message: 15/01/2004, 01h15

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