begin process at 2010 02 10 01:16:51
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Système d'exploitation

 > 

Windows

 > 

Exploiter une dll c++ avec l'ASM


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Exploiter une dll c++ avec l'ASM

lundi 3 juillet 2006 à 17:48:23 | Exploiter une dll c++ avec l'ASM

frobinet

Bonjour,

Je souhaite utiliser une dll écrite sous forme de class à partir du C++ dans mon programme ASM:

Exemple :

class DLL_EXPORT NomDeClass
    {
    public:

        NomDeClass  (const char* pFilePath, ushort fFileOp, int &fStatus);
        ushort IsComplete (void);
    ....
    }

Merci pour votre aide !

frobinet.

jeudi 6 juillet 2006 à 21:22:58 | Re : Exploiter une dll c++ avec l'ASM

nightlord666

Membre Club
Pour lancer les fonctions, il faut que tu récupère le nom avec la décoration C++, lancer le constructeur statique(initialise tous les membres à 0), puis le constructeur, puis enfin les fonctions.
vendredi 7 juillet 2006 à 12:50:59 | Re : Exploiter une dll c++ avec l'ASM

frobinet

J'ai vu que ça ressemblait à l'utilisation d'un COM. Mais je ne sais pas comment faire le lien (dans un fichier COM il y a un CLSID qui fait le lien)

J'ai donc fais une Lib c++ avec le bout de code suivant :

class MonTest
    {
    public:

        MonTest(short Var1, short Var2)
        {
            return;
        }
        short Func1 ( void )
        {
            return(1);
        }
}

Dans mon programme assembleur je créer la structure

MonTest    STRUCT
    MonTest    DWORD ?
    Func1        DWORD ?
MonTest   ENDS

Mais comment je fais le lien avec ma lib ?





dimanche 9 juillet 2006 à 21:01:19 | Re : Exploiter une dll c++ avec l'ASM

ToutEnMasm

Réponse acceptée !

Salut,
La méthode me semblant la plus adaptée , est d'appeler normalement la fonction C et de demander a CL de produire un fichier assembleur.L'option a rajouter est /FAs .Publier le résultat içi (juste la ou les parties intéressantes) et je vous aiderais pour la suite.
Si c'est trop gros,publier le bout de code en c++ içi,je m'arrangerais pour la suite.
                        ToutEnMasm

 

lundi 10 juillet 2006 à 12:06:28 | Re : Exploiter une dll c++ avec l'ASM

frobinet

Salut,
J'ai donc fais ce que tu m'a dit, ci dessous les différents fichiers :

Ma librairie C++ :

class __declspec(dllexport) MonTest
    {
    public:

        MonTest(short Var1, short Var2)
        {
            return;
        }
        short Func1 ( void )
        {
            return(1);
        }
        short Func2 ( void )
        {
            return(2);
        }
        short Func3 (void)
        {
            return(3);
        }
       

    };

Mon applis :

#include "Test.h"

int main ()
{
    MonTest *TestVar = new MonTest (10, 10);
    return(TestVar->Func1());
}

Et les sources en assembleur :

    TITLE    C:\Sources\C++\TestL\TestL.cpp
    .386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT    SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT    ENDS
_DATA    SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA    ENDS
CONST    SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST    ENDS
_BSS    SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS    ENDS
$$SYMBOLS    SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS    ENDS
$$TYPES    SEGMENT BYTE USE32 'DEBTYP'
$$TYPES    ENDS
_TLS    SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS    ENDS
;    COMDAT _main
_TEXT    SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT    ENDS
FLAT    GROUP _DATA, CONST, _BSS
    ASSUME    CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC    _main
EXTRN    ??2@YAPAXI@Z:NEAR                ; operator new
EXTRN    ??3@YAXPAX@Z:NEAR                ; operator delete
EXTRN    ??0MonTest@@QAE@FF@Z:NEAR            ; MonTest::MonTest
EXTRN    ?Func1@MonTest@@QAEFXZ:NEAR            ; MonTest::Func1
EXTRN    __except_list:DWORD
EXTRN    __chkesp:NEAR
EXTRN    ___CxxFrameHandler:NEAR
;    COMDAT xdata$x
; File C:\Sources\C++\TestL\TestL.cpp
xdata$x    SEGMENT
__ehfuncinfo$_main DD 019930520H
    DD    01H
    DD    FLAT:__unwindtable$_main
    DD    2 DUP(00H)
    DD    2 DUP(00H)
    ORG $+4
__unwindtable$_main DD 0ffffffffH
    DD    FLAT:__unwindfunclet$_main$0
xdata$x    ENDS
;    COMDAT _main
_TEXT    SEGMENT
_TestVar$ = -16
$T293 = -20
$T294 = -24
__$EHRec$ = -12
_main    PROC NEAR                    ; COMDAT

; 5    : {

    push    ebp
    mov    ebp, esp
    push    -1
    push    __ehhandler$_main
    mov    eax, DWORD PTR fs:__except_list
    push    eax
    mov    DWORD PTR fs:__except_list, esp
    sub    esp, 80                    ; 00000050H
    push    ebx
    push    esi
    push    edi
    lea    edi, DWORD PTR [ebp-92]
    mov    ecx, 20                    ; 00000014H
    mov    eax, -858993460                ; ccccccccH
    rep stosd

; 6    :     MonTest *TestVar = new MonTest (10, 10);

    push    1
    call    ??2@YAPAXI@Z                ; operator new
    add    esp, 4
    mov    DWORD PTR $T294[ebp], eax
    mov    DWORD PTR __$EHRec$[ebp+8], 0
    cmp    DWORD PTR $T294[ebp], 0
    je    SHORT $L295
    push    10                    ; 0000000aH
    push    10                    ; 0000000aH
    mov    ecx, DWORD PTR $T294[ebp]
    call    ??0MonTest@@QAE@FF@Z            ; MonTest::MonTest
    mov    DWORD PTR -28+[ebp], eax
    jmp    SHORT $L296
$L295:
    mov    DWORD PTR -28+[ebp], 0
$L296:
    mov    eax, DWORD PTR -28+[ebp]
    mov    DWORD PTR $T293[ebp], eax
    mov    DWORD PTR __$EHRec$[ebp+8], -1
    mov    ecx, DWORD PTR $T293[ebp]
    mov    DWORD PTR _TestVar$[ebp], ecx

; 7    :     return(TestVar->Func1());

    mov    ecx, DWORD PTR _TestVar$[ebp]
    call    ?Func1@MonTest@@QAEFXZ            ; MonTest::Func1
    movsx    eax, ax

; 8    : }

    mov    ecx, DWORD PTR __$EHRec$[ebp]
    mov    DWORD PTR fs:__except_list, ecx
    pop    edi
    pop    esi
    pop    ebx
    add    esp, 92                    ; 0000005cH
    cmp    ebp, esp
    call    __chkesp
    mov    esp, ebp
    pop    ebp
    ret    0
_TEXT    ENDS
;    COMDAT text$x
text$x    SEGMENT
__unwindfunclet$_main$0:
    mov    eax, DWORD PTR $T294[ebp]
    push    eax
    call    ??3@YAXPAX@Z                ; operator delete
    pop    ecx
    ret    0
__ehhandler$_main:
    mov    eax, OFFSET FLAT:__ehfuncinfo$_main
    jmp    ___CxxFrameHandler
text$x    ENDS
_main    ENDP
END

lundi 10 juillet 2006 à 12:14:13 | Re : Exploiter une dll c++ avec l'ASM

frobinet

Salut,

Pour infos j'ai aussi fais le test en mettant la classe directement dans le source sans passer par une librairie mais le compilateur appel toujours les deux fonctions ci-dessous en externe :

EXTRN    ??2@YAPAXI@Z:NEAR                ; operator new
EXTRN    ??3@YAXPAX@Z:NEAR                ; operator delete


lundi 10 juillet 2006 à 17:29:05 | Re : Exploiter une dll c++ avec l'ASM

frobinet

Salut,

J'en ai déduis le code suivant qui fonctionne correctement :

includelib Test.lib

EXTRN syscall ?Func1@MonTest@@QAEFXZ:NEAR        ; MonTest::Func1

.data?
_This:DWORD

.code
start:

    lea ecx, _This
    call    ?Func1@MonTest@@QAEFXZ            ; MonTest::Func1

    PrintDec eax

    xor eax, eax
    ret

end start

(bien penser à "syscall" si on utilise la convention d'appelle "stdcall" pour le programme complet, je le marque car j'ai encore perdu beaucoup de temps à cause de cette bétise)

Je pense que la solution la propre est de refaire une librairie tampon en C.

Merci pour l'astuce : par contre la compilation d'une classe est totalement zappé !







lundi 10 juillet 2006 à 17:33:45 | Re : Exploiter une dll c++ avec l'ASM

frobinet

c'est remoi,
le code ci-dessous ne fonctionne qu'en mode RELEASE en mode DEBUG le linkage ne passe pas.

lundi 10 juillet 2006 à 21:32:48 | Re : Exploiter une dll c++ avec l'ASM

ToutEnMasm

Salut,
Je ne voudrais pas jouer les rabats joies mais les noms décorés c++ c'est pas très lisible.
?Func1@MonTest@@QAEFXZ mérite une traduction.

Ton source ne donne pas les librairies ni les headers utilisés,dommage.
J'ai quand même trouvé que la classe dllexport est décrite dans dbdao.h
Pour transcrire les noms décorés C++,ml 8 le fait très bien.Mais il faut avoir la version express C++ 5 téléchargeable chez microsoft,puis télécharger ml 8.0.
Voir première page de  mon site pour obtenir les infos nécessaires.
Si tu connais la librairie utilisé par ton code,tu peux aussi télécharger un utilitaire a la page beta de mon site,c'est protolib.Quand il détecte une fonction dans la définition qu'en donne le pecoff.doc (référence microsoft),il enlève la décoration C++ et fait apparaitre la définition en claire.
Après une petite recherche il n'y a pas de lib de ce nom (dbdao),une autre doit contenir les définitions.
Autre astuce,un petit coup de debugger et on voie quels sont les modules chargées,ça aide.

                ToutEnMasm

  








 

lundi 10 juillet 2006 à 21:42:34 | Re : Exploiter une dll c++ avec l'ASM

ToutEnMasm

J'allais oublier le plus important , avec les noms traduits et le header en main,on peut voir les décalages d'appels indirects (call [eax+N]) tel qu'ils apparaissent dans le source asm,et surtout s'offrir la réécriture de la classe.
                               ToutEnmasm


1 2

Cette discussion est classée dans : class, dll, exploiter, asm, nomdeclass


Répondre à ce message

Sujets en rapport avec ce message

Compileur ASM [ par fabiin ] SalutQuel compileur ASM me conseillez-vous ???Merci @+Fabs Besoin de conseils en livre sur l'asm! [ par BlackWizzard ] je voudrais m'acheter un livre sur l'asm sans trop de blabla et pas trop cher...qqun a qqchose a me conseiller? virgule flotante en asm [ par webfish ] Bonjour, Je fais de l'assembleur depuis pas longtemps, et j'aimerais savoir comment on fait des calculs avec des nombres à virgule flotante... Probleme de dll! (arguments...) [ par BlackWizzard ] salut les pro!voila, G une fonction contenu dans une dll mais cette fonction, je ne sait pas comment lui ajouter des arguments...voici un extrait du c [URGENT] Passer des arguments a une DLL [ par BlackWizzard ] Bonjours, je voudrai creer un dll en asm (ce qui est fait) mais je n'arrive pas a passer des arguments a la seul fonction de cette dll.imaginons le co asm [ par damien174 ] bonjour je viens de commencer a faire de l ASM sur PC, car je connais tres bien sur 68HC11.Avez vous des cours et un logiciel pour assembler et compil ASM pour 68hc11 [ par Sphaxs ] SphaxsSalut tout le monde,J'ai fait une plaque de test pour utiliser un 68hc11 mais je n'arrive pas à le programmer (pb de logiciel???), si quelqu'un passage de paramétres entre VCpp et ASM [ par orchis ] bjr a tous,j'ai ecris un programme en VCpp dont un module est en assembleur, mais je ne sais faire passer des paramétres entre les deux !! pourriez vo Routine asm dans gcc [ par Juke ] quelqu'un connait t'il un txt en francais qui explik comment incorporer de l'asm dans du c++ avec gcc ou dev-c++ ? Reboot de la machine en c/c++ ou asm [ par Juke ] quelqu'un sait t'il comment rebooter ou éteindre l'ordinateur en c/c++ ou en asm ?merci de votre aide.juke


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,359 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales