Reconstituer les headers d'un DLL

Salut, je débute en programmation windows, et je me demandais si c’est possible de reconstituer les headers à partir d’un fichier DLL…

Pour etre realiste dans des cas non triviaux: nop :stuck_out_tongue:

+1, il te faut au minimum les prototypes de la DLL pour pouvoir aller pointer vers les bonnes fonctions ou bons objets.

Il y a un moyen de le faire, mais necessite pas mal d’investigation.
Jette un oeil sur le dependency walker pour recuperer les prototypes de tes fonctions et sur la methode getprocaddress de windows pour les remapper…

mais quickview l’utilitaire de windows il ne le faisait pas ?

Mmh non, y’a moyen de retrouver la liste des exports d’une dll “dumpbin /exports trucmuche.dll”, mais pas la liste des paramètres. Du coup, getprocaddress va pas aider. Voir ici pour le “runtime dynamic linking” : http://msdn.microsoft.com/library/default…mic_linking.asp

Si tu débutes en programmation windows, et que tu as besoin de faire ça, c’est qu’il doit y avoir une incompréhension quelque part. Explique dans quel contexte tu voudrais faire ça, et on t’aidera à trouver comment t’y prendre autrement.

Normalement la convention de passage de paramètres est __stdcall, ce qui implique que la dernière instruction des fonctions exportées est de type retn xxx, te donnant ainsi le nombre de paramètres x la taille d’un pointeur sur ta plate-forme (4 octets sur IA32). S’il s’agit de fonctions C++, le mangling peut t’indiquer également le nombre de paramètres.

En revanche le type des paramètres ne peut être obtenue que par intuition et déduction, ce qui me mène à…

idem.

J’ai failli préciser ça, mais en fait ça peut varier : dans certains cas de passage de structures par valeur, cette règle peut ne pas être d’application.

Merci à tous, il semble que j’aie encore énormément de choses à apprendre dans ce domaine…

Si ça peut t’aider à clarifier un peu les choses, voici une mini explication du machin:

Une lib statique, on la link, et hop tout ou partie du code de la librairie se retrouve intégré dans le exe. C’est le plus simple, mais ça fait des gros exe, et si on a 35 programmes qui utilisent la même lib on a 35 copies de la lib. Pour finir y’a pas moyen de mettre la lib à jour sans relinker le tout. C’est pour ça qu’on a inventé les librairies dynamiques, les DLL.

Pour utiliser une lib dans un environnement windows, y’a trois possibilités:

a. lib statique : on link et zou
b. dll avec sa lib d’exports : on link une mini lib statique qui sert « d’interface » pour la DLL, et au final ça s’utilise de la même façon qu’une lib statique.
c. dll avec getprocaddress : on link rien du tout, mais on va récupérer à la main les pointeurs vers les fonctions contenues dans la DLL. C’est la façon la plus flexible et puissante de faire, mais c’est pas très pratique.

Au fait, une DLL contient des parties internes, et une interface. Ce qu’on appelle export, c’est l’exposition de cette interface.

Ou tout simplement que tes fonctions peuvent être __cdecl ou __fastcall…