2010-04-09 5 views
0

Au-delà de la création d'une DLL avec toutes les mêmes fonctions avec la même interface et les mêmes conventions d'appel, la DLL de remplacement doit-elle reproduire exactement la carte d'exportation, y compris les numéros ordinaux de l'original? Donc, non seulement le chargement explicite via GetProcAddress fonctionne, mais aussi les liens implicites?Comment créer un remplacement direct pour une DLL existante?

(edit: ceci est un non géré, c/C++ windows dll dont je parle, pas .net)

Répondre

1

Vous aurez besoin d'imiter toutes les exportations que tout autre client utilise, vous n'avez pas besoin pour imiter les exportations "mortes" que personne n'utilise. Vous devez conserver les ordinaux uniquement si d'autres clients sont liés en utilisant un nom ordinal au lieu du nom d'exportation (ce qui est assez rare).

Il a quelque chose que vous devez garder à l'esprit: Si la dll contient des classes C++ et il n'utilise pas extern « C », alors vous devez maintenir la comparabilité binaire, ce qui signifie les classes dans le dll de remplacement doit avoir les mêmes champs dans le même ordre que les classes d'origine. Si vous utilisez des interfaces dont vous avez besoin pour conserver la vtable avec les mêmes arguments pour chaque méthode.

+0

Merci! Je n'avais pas pensé aux cours. Je pense que mon cas particulier est juste "C" fonctions si juste en spécifiant ordinal dans le fichier .def devrait le faire. J'ai remarqué dans "dumpbin/exports" qu'il y a aussi une colonne "hint", est-ce que cela doit aussi être conservé, ou cela peut-il différer sans casser la compatibilité? – Bogatyr

+0

Oh, encore une chose. Le "dumpbin/exports original.dll" contient plusieurs entrées pour le même entrypoint: "foo" et "foo @ 4", à différents nombres ordinaux, mais entrypoint identique. Comment créer ces alias "@n" supplémentaires dans la carte d'exportation? – Bogatyr

+0

@Bogatyr est la taille des paramètres, foo signifie pas de paramètres foo @ 4 est foo (int), foo @ 8 signifie foo (int, int) –

Questions connexes