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

Assembleur Discussion :

Exporter des fonctions contenues dans des DLLs de programmes assembleur


Sujet :

Assembleur

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 76
    Points : 31
    Points
    31
    Par défaut Exporter des fonctions contenues dans des DLLs de programmes assembleur
    Bonjour,
    Je suis débutant mais je pratique un peu le langage Assembleur avec Tasm32 ou Masm32 et je souhaiterais savoir comment ça marche pour exporter des fonctions contenues dans une DLL en assembleur avec ces deux outils.
    Afin d'appeler cette DLL dans un autre langage VB ou Delphi par ex.
    Merci de m'aider...

    Monromero1
    e-mail : <NdlM : merci d'utiliser les messages privés>
    Version Delphi utilisé : Rad Studio Alexandria.

  2. #2
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    La méthode pour exporter des fonctions figurant dans une DLL compilée par TASM est très simple.

    Il suffit d'insérer dans le code assembleur de la DLL les lignes suivantes ( une ligne par fonction à exporter ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public          MaFonction1
    public          MaFonction2
    ...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 76
    Points : 31
    Points
    31
    Par défaut Bonjour,
    Citation Envoyé par Prof Voir le message
    Bonjour.

    La méthode pour exporter des fonctions figurant dans une DLL compilée par TASM est très simple.

    Il suffit d'insérer dans le code assembleur de la DLL les lignes suivantes ( une ligne par fonction à exporter ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public          MaFonction1
    public          MaFonction2
    ...
    Bonjour,
    désolé mais je ne me suis pas bien fait comprendre.
    En fait
    je voudrai connaître l'instruction qu'il me faut insérer dans mon code assembleur
    Tasm par ex afin de pouvoir exporter une fonction
    en indiquant au compilateur que l'on souhaite exporter une fonction.
    Par ex : en langage C la clée qui permet cela est : __declspec(dllexport).
    Il suffit de l'insérer dans le code avant la déclaration de fonction et cette dernière peut être exportée
    et appelée par un autre langage éventuellement.
    Moi, je voudrai faire la même chose avec l'assembleur TASM par ex :
    Je pense par ailleurs
    qu'avec Masm32 on peut indiquer au compilateur que l'on souhaite exporter une fonction avec un fichier .def.
    Puis on le passe au linquer.

    A propos, pouvez-vous me revenir en m'indiquant à quel endroit du code dois-je insérer
    le code :
    Public Mafonction ?

    Merci
    Version Delphi utilisé : Rad Studio Alexandria.

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    Salut,
    Pour exporter une fonction, il faut créer un fichier texte:
    nomdll.def

    Y mettre les instructions suivantes:
    LIBRARY nomdll
    EXPORTS nameproc1
    EXPORTS nameproc2

    Le linker doit connaître l'existence du fichier:
    link /DLL /DEF:nomdll.def + autres options

  5. #5
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Effectivement, il y a deux choses à faire et non une comme je l'ai écrit à tort plus haut.

    1) Insérer dans le code assembleur de la DLL les lignes qui indiquent au compilateur les fonctions à rendre publiques.
    Ces lignes peuvent être placées n'importe où, mais cela sera plus clair si on les met au début du code, dans la zone des déclarations diverses.

    2) Comme l'a dit ToutEnMasm, prévenir le Linker que certaines fonctions sont à exporter.
    Cela se fait par la déclaration EXPORTS qui doit être insérée dans le fichier .DEF de la DLL.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 76
    Points : 31
    Points
    31
    Par défaut Export de fonction
    Citation Envoyé par Prof Voir le message
    Effectivement, il y a deux choses à faire et non une comme je l'ai écrit à tort plus haut.

    1) Insérer dans le code assembleur de la DLL les lignes qui indiquent au compilateur les fonctions à rendre publiques.
    Ces lignes peuvent être placées n'importe où, mais cela sera plus clair si on les met au début du code, dans la zone des déclarations diverses.

    2) Comme l'a dit ToutEnMasm, prévenir le Linker que certaines fonctions sont à exporter.
    Cela se fait par la déclaration EXPORTS qui doit être insérée dans le fichier .DEF de la DLL.

    Dans votre réponse précédente :
    Public MaFonction1
    Public MaFonction2
    Ok d'où les instructions :
    Public MaFonction dans mon code asm compilé avec TASM ?
    si j'ai bien tout compris.
    Es-ce bien cela dont il s'agit ?

    Merci encore.

    Pouvez-vous me revenir pour me donner la syntaxe
    qui permet de lier un .def avec le linquer TLINK32 s.v.p...
    mon exemple : TLINK32 /Tpd /aa /c test.obj,test.def,,import32.lib
    ma question est es-ce que cela est correcte ?

    Merci
    Version Delphi utilisé : Rad Studio Alexandria.

  7. #7
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour

    mon exemple : TLINK32 /Tpd /aa /c test.obj,test.def,,import32.lib
    ma question est es-ce que cela est correcte ?
    Non, ce n'est pas la bonne syntaxe avec TLIKNK32.

    La syntaxe correcte est : TLINK32 options objfile, exefile, mapfile, library, deffile, resfile

    Le fichier de ressource resfile peut être omis s'il n'y a pas de ressource.

    Donc ici, il faut écrire : TLINK32 /Tpd /aa /c test.obj, test.dll, test.map, import32.lib, test.def

    Et dans le fichier test.def, il faut entrer les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NAME            Test
    DESCRIPTION  'Win32 DLL'
    CODE            PRELOAD MOVEABLE DISCARDABLE
    DATA            PRELOAD MOVEABLE SINGLE SHARED
    EXETYPE       WINDOWS
    HEAPSIZE      65536
    STACKSIZE    65536
    EXPORTS       MaFonction

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 76
    Points : 31
    Points
    31
    Par défaut Bonjour, merci pour votre réponse cela répond bien à mon problème du départ.
    Citation Envoyé par Prof Voir le message
    Bonjour



    Non, ce n'est pas la bonne syntaxe avec TLIKNK32.

    La syntaxe correcte est : TLINK32 options objfile, exefile, mapfile, library, deffile, resfile

    Le fichier de ressource resfile peut être omis s'il n'y a pas de ressource.

    Donc ici, il faut écrire : TLINK32 /Tpd /aa /c test.obj, test.dll, test.map, import32.lib, test.def

    Et dans le fichier test.def, il faut entrer les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NAME            Test
    DESCRIPTION  'Win32 DLL'
    CODE            PRELOAD MOVEABLE DISCARDABLE
    DATA            PRELOAD MOVEABLE SINGLE SHARED
    EXETYPE       WINDOWS
    HEAPSIZE      65536
    STACKSIZE    65536
    EXPORTS       MaFonction



    Bonjour,
    merci pour votre réponse cela répond bien à mon problème du départ.

    Encore une question :
    Y-a-t-il un prototype précis afin de réaliser une dll simple pour compiler avec TASM32 ?
    Par ex :
    avec Masm32 il y a
    DllEntry proc hInstDll:HINSTANCE,REASONWORD,reservedWORD
    que je clôture avec DllEntry endp
    mais cette syntaxe avec Masm n'est pas compilable avec TASM32 car il y a des erreurs.
    A commencer par HINSTANCE mansioné par le compilateur qui n'est pas référencé.
    Donc, pour une bonne équivalence avec Tasm, auriez-vous par hasard une syntaxe équivalente à me proposer ?

    pour votre aide.
    Version Delphi utilisé : Rad Studio Alexandria.

  9. #9
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour,

    Le plus simple est de remplacer HINSTANCE par DWORD dans le prototype de la fonction DllEntry..

    D'ailleurs, dans le fichier Windows.inc accompagnant Masm32, il y a la définition :
    HINSTANCE typedef DWORD

    Et n'oubliez pas de sauvegarder les registres ebx,esi,edi avant leur utilisation.

    Avec TASM, on aura donc ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DLL_Entree      proc
     
            ARG     hinstDLL:DWORD, reason:DWORD, reserve:DWORD
            USES    ebx, edi, esi
     
            ....
            ....
     
            ret
     
    DLL_Entree      endp
    L'important pour une DLL, c'est de gérer correctement les deux appels de la fonction DllEntry.
    Cela se fait suivant la valeur du paramètre reason qui vaut soit DLL_PROCESS_ATTACH, soit DLL_PROCESS_DETACH, sachant que DLL_PROCESS_ATTACH = 1 et DLL_PROCESS_DETACH = 0.

    Sinon, le reste du code est celui de n'importe quel programme écrit en assembleur.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 76
    Points : 31
    Points
    31
    Par défaut Export de fonctions contenues dans une dll
    Citation Envoyé par ToutEnMasm Voir le message
    Salut,
    Pour exporter une fonction, il faut créer un fichier texte:
    nomdll.def

    Y mettre les instructions suivantes:
    LIBRARY nomdll
    EXPORTS nameproc1
    EXPORTS nameproc2

    Le linker doit connaître l'existence du fichier:
    link /DLL /DEF:nomdll.def + autres options


    Bonjour,
    merci beaucoup pour votre réponse
    cela m'a été très util et j'en tiendrai compte pour mes futures dlls faites avec MASM32.
    Merci encore.
    Version Delphi utilisé : Rad Studio Alexandria.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/08/2011, 18h23
  2. Réponses: 2
    Dernier message: 19/09/2006, 19h06
  3. Réponses: 13
    Dernier message: 30/08/2006, 17h46
  4. Utiliser des fonctions contenues dans un fichier .bas
    Par usbeck dans le forum Visual C++
    Réponses: 4
    Dernier message: 11/08/2006, 12h03
  5. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33

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