2008-09-23 11 views
13

Possible en double:
How do I get the HMODULE for the currently executing code?Comment obtenir le handle de module de mon propre code?

J'essaie de trouver une ressource dans mon propre module. Si ce module est un exécutable, c'est trivial - GetModuleHandle(NULL) retourne la poignée du module "principal".

Mon module, cependant, est une DLL qui est chargée par un autre exécutable. Donc GetModuleHandle(NULL) retournera le handle du module à cet exécutable, ce qui n'est évidemment pas ce que je veux.

Est-il possible de déterminer la poignée de module du module qui contient le code en cours d'exécution? Utiliser le nom de la DLL dans un appel à GetModuleHandle() me semble être un hack (et n'est pas facilement maintenable dans le cas où le code en question est transplanté dans une DLL différente).

Répondre

10

Stockez la poignée du module quand elle vous est donnée dans DllMain et utilisez-la plus tard quand vous en avez réellement besoin. Un grand nombre de cadres (par exemple, MFC) le font automatiquement.

+0

Pourriez-vous s'il vous plaît donner plus de détails au sujet de cette solution? J'ai le même problème en tant qu'auteur du thread mais je ne sais pas quel est le DllMain, quand est-il appelé et comment puis-je stocker les informations dont j'ai besoin. –

+0

@MarcinK. https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx - ceci explique ce qu'est DllMain. C'est un point d'entrée optionnel dans votre module que vous pouvez créer et faire des choses comme stocker le handle de module dans une variable globale. –

1

Comme cela a déjà été indiqué, cela peut être fait en sauvegardant la poignée du module transmise à la fonction DllMain.

Mais il existe d'autres raisons pour lesquelles vous devriez enregistrer la poignée. Par exemple, si vous décidez de lier des ressources à la DLL à l'aide de l'éditeur de ressources, vous aurez besoin de cette poignée de module pour accéder à ces ressources via l'API LoadResource.

5

Si DLL est liée à MFC alors il est un moyen d'obtenir instance de la DLL dans laquelle une fonction a été appelée:

void dll_function() 
    { 
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
    HINSTANCE dll_instance = AfxGetInstanceHandle(); 
    } 
+0

Merci pour la suggestion. Pour les DLL MFC, c'est une bonne solution. Mais environ la moitié de mes DLL ne le sont pas, alors j'avais aussi besoin d'autre chose. Je n'ai pas regardé le code source de MFC, mais ils stockent probablement le handle quand la DLL est chargée. – Pepor

Questions connexes