Comment obtenir le descripteur de module de mon propre code? [dupliquer]
Question
Double possible:
Comment obtenir le HMODULE pour l'exécution en cours code?
J'essaie de trouver une ressource dans mon propre module. Si ce module est un exécutable, c’est trivial - GetModuleHandle (NULL)
renvoie le descripteur de la commande "main". module.
Mon module, cependant, est une DLL chargée par un autre exécutable. Ainsi, GetModuleHandle (NULL)
renverra le descripteur de module à cet exécutable, ce qui n'est évidemment pas ce que je veux.
Est-il possible de déterminer le descripteur de module du module contenant 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 si le code en question est transplanté dans une autre DLL).
La solution
Stockez le module à distance quand il vous est donné dans DllMain, puis utilisez-le plus tard, lorsque vous en aurez réellement besoin. De nombreux frameworks (par exemple, MFC) le font automatiquement.
Autres conseils
Si la DLL est liée à MFC, il existe un moyen d'obtenir une instance de la DLL dans laquelle une fonction a été appelée:
void dll_function()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HINSTANCE dll_instance = AfxGetInstanceHandle();
}
Comme cela a déjà été dit, cela peut être fait en enregistrant le descripteur de module transmis à la fonction DllMain.
Mais il existe d'autres raisons pour lesquelles vous devriez enregistrer le descripteur.
Par exemple, si vous décidez de lier des ressources à la DLL à l'aide de l'éditeur de liens, vous aurez besoin de ce descripteur de module pour accéder à ces ressources via l'API de fonction LoadResource .