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. 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. 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