J'ai un programme auquel j'ajoute des effets de post-traitement en plein écran. Je n'ai pas la source pour le programme (c'est propriétaire, bien qu'un développeur m'envoie une copie des symboles de débogage, format .map). J'ai le code pour les effets écrits et fonctionnels, pas de problèmes.Éviter les débordements de pile dans les DLL d'encapsulation
Mon problème est maintenant de relier les deux.
J'ai essayé deux méthodes à ce jour:
Utilisez pour modifier Detours la table d'importation de programme original. Cela fonctionne très bien et est stable, mais l'utilisateur à qui j'ai parlé n'est pas à l'aise, il nécessite une installation (au-delà de l'extraction d'une archive), et il y a des doutes sur le fait que le programme Detours est valide du CLUF. Donc, cette option est sortie.
L'autre option est le remplacement de DLL traditionnel. J'ai enveloppé OpenGL (opengl32.dll), et j'ai besoin du programme pour charger ma DLL au lieu de la copie du système (il suffit de le déposer dans le dossier du programme avec le bon nom, c'est facile). J'ai alors besoin de ma DLL pour charger le framework Cg et le runtime (qui repose sur OpenGL) et quelques autres choses. Quand Cg se charge, il appelle certaines de mes fonctions, qui appellent des fonctions Cg, et j'ai tendance à avoir des débordements de pile et des boucles infinies. Je dois être capable d'inclure les DLL Cg dans un sous-répertoire et d'utiliser leurs fonctions (je ne sais pas s'il est possible que mes DLL importent la table pointent vers une DLL dans un sous-répertoire) ou je dois les lier dynamiquement d plutôt ne pas faire, juste pour simplifier le processus de construction), quelque chose pour les forcer à se référer au fichier du système (pas mon remplacement personnalisé).
La chaîne entière est: Le programme charge la DLL A (appelée opengl32.dll). DLL A charge Cg.dll et lie dynamiquement (GetProcAddress) à sysdir/opengl32.dll. J'ai maintenant besoin de Cg.dll pour se référer également à sysdir/opengl32.dll, pas DLL A.
Comment cela serait-il fait? Modifier: Comment cela serait-il fait facilement sans utiliser GetProcAddress? Si rien d'autre ne fonctionne, je suis prêt à y revenir, mais je préfère ne pas le faire du tout.
Édition2: Je viens de trébucher sur la fonction SetDllDirectory dans les documents MSDN (sur une recherche totalement indépendante). À première vue, cela ressemble à ce dont j'ai besoin. Est-ce exact, ou est-ce que je mésestime? (off pour le tester maintenant)
Édition3: J'ai résolu ce problème en faisant quelque chose d'un peu différemment. Au lieu de supprimer un OpenGL32.dll, j'ai renommé ma DLL en DInput.dll. Non seulement cela a l'avantage de devoir exporter une fonction au lieu de bien au-delà de 120 (pour le programme, Cg et GLEW), mais je n'ai pas à m'inquiéter des fonctions qui retournent (je peux lier OpenGL comme d'habitude) . Pour entrer dans les appels que j'ai besoin d'intercepter, j'utilise Detours. Dans l'ensemble, cela fonctionne beaucoup mieux. Cette question, cependant, est toujours un problème intéressant (et j'espère sera utile pour quelqu'un d'autre qui essaie de faire des choses folles à l'avenir). Les deux réponses sont bonnes, donc je ne suis pas encore sûr lequel choisir ...
Pour tous ceux qui parcourent cette question à l'avenir, les meilleures options (que j'ai fini par utiliser plus tard) sont ** n'utilisez pas Detours **. Il est buggé, en particulier dans WoW64, et il manque des fonctionnalités de base comme la prévention de la récursivité. [EasyHook] (http://easyhook.codeplex.com/) est de loin supérieur dans les caractéristiques, la stabilité/performance, et la manipulation générale. – ssube