ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 9 juil. 2006 à 21:01
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
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 6 juil. 2006 à 21:22
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.
frobinet
Messages postés64Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention15 décembre 2006 10 juil. 2006 à 12:14
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
(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é !
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 10 juil. 2006 à 21:32
Salut,
Je ne voudrais pas jouer les rabats joies mais les noms décorés c++ c'est pas très lisible.
[mailto:?Func1@MonTest@@QAEFXZ ?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
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 10 juil. 2006 à 21:42
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
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 10 juil. 2006 à 22:12
Encore moi,
Le dbdao.H semble utilisé les ddao...lib,il y en a plusieurs.Mais la ou la chance te sourit,c'est que mon utilitaire donne tous les noms sans décorations avec la forme de l'appel.
Je n'ai pas trouvé de syscall,mais plutot des THISCALL et d'autres.
ToutEnMasm
frobinet
Messages postés64Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention15 décembre 2006 11 juil. 2006 à 10:22
Salut,
->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
Je pense que tu doit confondre, le nom de ma classe est MonTest, le "__declspec(dllexport)" signifie juste que cette classe peut-être exporté avec la méthode de mise en paramètre de type C.
Ma librairie ne contient rien d'autre, (créer un projet Win32 librairie vide, coller le texte et compilé !)
Test.h contient juste :
class MonTest
{
public:
MonTest(short Var1, short Var2);
short Func1 ( void );
short Func2 ( void );
short Func3 (void);
};
Je récupère ml8 et je fais un test, merci, j'étais resté à ml7 de Visual Studio 2003.