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 :

Visualiser les paramètres d'une DLL C++


Sujet :

C++Builder

  1. #1
    Membre averti
    Inscrit en
    Août 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 11
    Par défaut Visualiser les paramètres d'une DLL C++
    Bonjour,
    J'ai développé une DLL qui pilote un logiciel TestStand (NS). Cette DLL n'est pas reconnue car elle ne contient pas les informations des paramètres.
    Quand j'utilise "Dependency Walker" pour visualiser ma DLL, on voit qu'elle est au format "C" avec l'affichage :
    affichage = @ANumMasterOpen$qqscpc

    Quand j'utilise "Dependency Walker" pour visualiser une DLL construite sous Visual, on voit qu'elle est au format "C++" :
    affichage = ?DiagCmd@@YGXPAD0PAJ@Z

    .. et on peut visualiser les paramètres en utilisant la fonction "Undecorate C++ functions" :
    void DiagCmd(char *,char *,long *)

    La déclaration de ma fonction est je pense correcte :
    extern "C++" char __declspec(dllexport) __stdcall ANumMasterOpen(char index, char *programme);

    J'ai essayé de changer les options de compilations dans les options du projet mais sans + de résultats.

    Qui aurait une idée ?

  2. #2
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    est tu sur de ta syntaxe
    extern c++
    je pense qu'il sahit plutôt de extern c
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Par défaut
    cela existe chez Microsoft: "C++" mais sur BCB, je suis pas sur:
    In C++, when used with a string, extern specifies that the linkage conventions of another language are being used for the declarator(s). C functions and data can be accessed only if they are previously declared as having C linkage. However, they must be defined in a separately compiled translation unit.

    Microsoft C++ supports the strings "C" and "C++" in the string-literal field. All of the standard include files use the extern "C" syntax to allow the run-time library functions to be used in C++ programs.
    en "C":
    La forme d'une décoration pour une fonction C dépend de la convention d'appel utilisée dans sa déclaration, conformément à ce qui est indiqué ci-dessous.

    Convention d'appel Décoration
    __cdecl (par défaut) Trait de soulignement à gauche (_)
    __stdcall Trait de soulignement à gauche (_) et signe @ à droite suivi d'un nombre représentant le nombre d'octets dans la liste des paramètres
    __fastcall Même chose que pour __stdcall, mais précédé d'un signe @ au lieu d'un trait de soulignement
    en C++:

    Le nom décoré d'une fonction C++ contient les informations suivantes :

    le nom de la fonction ;
    la classe dont la fonction est membre, s'il s'agit d'une fonction membre ; éventuellement la classe qui contient la classe de la fonction, etc. ;
    l'espace de noms auquel appartient la fonction (si elle fait partie d'un espace de noms) ;
    les types des paramètres de la fonction ;
    la convention d'appel ;
    le type de retour de la fonction.
    Les noms de la fonction et de la classe sont codés dans le nom décoré. Le reste du nom décoré consiste en un code qui a une signification interne uniquement pour le compilateur et l'éditeur de liens. Vous trouverez ci-dessous des exemples de noms C++ non décorés et décorés.

    Nom non décoré Nom décoré
    int a(char){int i=3;return i;}; => ?a@@YAHD@Z
    void __stdcall b::c(float){}; => ?c@b@@AAGXM@Z

  4. #4
    Membre averti
    Inscrit en
    Août 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 11
    Par défaut Noms de fonctions décorées sous Borland C++
    Merci pour ces réponses.

    La déclaration extern "C++" est necessaire pour forcer le mode C++. On peut aussi le faire dans les propriétés du projet. Mais cela n'est pas suffisant.

    J'en sais un peu plus maintenant sur la décoration des noms de fonctions.
    Il existe une utilitaire Microsoft "undname.exe" qui permet de convertir nom décoré -> nom non décoré.

    Par contre, je ne sais toujours pas comment faire sous Borland pour qu'elles apparaissent telles quelles dans la DLL.

  5. #5
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    bonjour,

    tu dis que
    a déclaration extern "C++" est necessaire pour forcer le mode C++. On peut aussi le faire dans les propriétés du projet. Mais cela n'est pas suffisant.
    ceci est peut être vrai pour les compilateurs Visual C++ mais cela ne l'est pas sous Borland

    encore une fois le compilateur Borland ne supporte pas la syntaxe "extern c++"

    extrait de l'aide Borland
    Utilisez extern "c" pour empêcher que les noms de fonction soient substantypés dans des programmes C++.
    la déclaration correcte pour ta fonction est donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern "C" char __declspec(dllexport) __stdcall ANumMasterOpen(char index, char *programme);
    le résultat dans le DependencyWalker est le suivant
    ANumMasterOpen

    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  6. #6
    Membre averti
    Inscrit en
    Août 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 11
    Par défaut
    DjmSoftware,
    je suis formel : on peut mettre "extern C++" sous BCB6. Cela ajoute la description des paramètres de la fonction.
    Par contre, cette description (qui est utilisée par le linker) n'est pas compatible avec celle de Visual C++ (en tous cas, c'est ce que j'ai pu conclure au bout d'une semaine de lecture de forums sur le Web).
    Ma seule solution est de faire ma DLL sous Visual C++ (beurk !).

    Sur le net, on trouve plein d'infos pour utiliser une DLL Borland avec un programme Visual et inversement. Mais cela n'est possible que si tu connais les paramètres des fonctions.
    Dans mon cas, en occurrence, il faut absolument que ces informations soient visibles.
    Et Dieu sait que j'ai essayé, même en linkant en ligne de commande !

    Si personne ne répond à ce message, je le marquerais comme résolu.

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Le principe même d'une DLL est d'être programmée avec un outil et de pouvoir être réutiliser par d'autres...
    Donc ce que tu veux faire doit être faisable...maintenant je n'ai jamais vu de DLL dont les noms de fonction n'étaient pas décorés.
    Il suffit de fournir un .het un .lib (et encore le .lib on peut le faire avec implib).

    Si ce n'est pas indiscret, pourquoi à tu tant besoin de ne pas avoir de "décoration" ?

  8. #8
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    bonsoir
    j'ai essayé de créer plusieurs Dll avec C++ Builder 6 et Visual C++ mes constatations sont les suivantes

    Fonction exportée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char __stdcall  ANumMasterOpen(char index, char *programme);
    sous C++ Builder
    comme indiqué dans mes précédents Post C++ Builder ne reconnait pas la syntaxe
    j'ai déclaré de la manière suivante la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    __declspec(dllexport) char __stdcall  ANumMasterOpen(char index, char *programme);
    avec la case a cocher Forcer la Compilation C++ dans la page Option C++

    avec le tools Microsoft Dependency Walker le réseultat est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         @ANumMasterOpen$qqscpc
    la fonctionalité Undecorate est inopérante

    en utilisant le tools borland Impdef le résultat est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    LIBRARY     PROJECT1.DLL
     
    EXPORTS
        @ANumMasterOpen$qqscpc         @1   ; __stdcall ANumMasterOpen(char, char *)
    constatations les paramétres sont visibles mais le type de retour de la fonction reste inconnu

    sous Visual C++

    j'ai déclaré de la manière suivante la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern "C++"__declspec(dllexport) char __stdcall  ANumMasterOpen(char index, char *programme);
    avec le tools Microsoft Dependency Walker le réseultat est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         ?ANumMasterOpen@@YGDDPAD@Z
    en utilisant la fonction undecorate c++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char ANumMasterOpen(char,char *)
    en utilisant le tools borland Impdef le résultat est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    LIBRARY     TEST.DLL
     
    EXPORTS
        ?ANumMasterOpen@@YGDDPAD@Z     @1   ; ?ANumMasterOpen@@YGDDPAD@Z

    constatations:

    les DLL compilées sous Visul C++ avec l'option extern "c++" donnent les résultats attendus avec les outils Microsoft, mais malheureusement pas avec le outils Borland qui eux sont compatibles avec les dll compilées avec d'autre compilateurs que ceux de Borland

    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/02/2009, 11h51
  2. [Débutant] Problème avec les paramètres d'une proc stockée
    Par babulior dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/06/2005, 15h38
  3. Comment connaître les fonctions d'une DLL ?
    Par bencot dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 15/06/2005, 09h25
  4. [Débutant] Récupérer les paramètres d'une routine
    Par nifty dans le forum Assembleur
    Réponses: 5
    Dernier message: 18/04/2005, 14h35
  5. Extraire les icônes d'une DLL
    Par Globus dans le forum MFC
    Réponses: 6
    Dernier message: 13/09/2002, 13h44

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