Comment GetModuleHandle travail dans Visual c++
Je suis novice en c++ et ce code renvoie toujours NULL même si je sais que le fichier existe:
HMODULE hModule = GetModuleHandle(TEXT("C:\\Users\\Steve\\Desktop\\stub.exe"));
Intéressant, si je copie stub.exe pour C:\Windows\system32 il trouve le module avec ce code:
HMODULE hModule = GetModuleHandle(TEXT("stub.exe"));
Ai-je raté quelque chose d'incroyablement de base?
notez que GetModuleHandle n'est pas une partie de C++, c'est une fonction API Win32. Vous pouvez l'appeler de toute autre langue qui prend en charge l'appel de l'OS directement l'API. Fixe des balises en conséquence.
Essayez d'appeler GetModuleFilename avec un hModule de 0; qui vous dira ce que Windows pense que le chemin d'accès à votre exécutable. Je soupçonne que c'est subtilement différent de la chaîne que vous êtes en passant d'une certaine façon.
Pourquoi avez-vous besoin de cette poignée de toute façon? Le cas le plus courant est avec
Vous en avez besoin pour
Essayez d'appeler GetModuleFilename avec un hModule de 0; qui vous dira ce que Windows pense que le chemin d'accès à votre exécutable. Je soupçonne que c'est subtilement différent de la chaîne que vous êtes en passant d'une certaine façon.
Pourquoi avez-vous besoin de cette poignée de toute façon? Le cas le plus courant est avec
GetProcAddress
, mais c'est pour les Dll ne sont pas Exe.Vous en avez besoin pour
LoadImage
, TaskDialogIndirect
etc., et en général tout ce qui veut charger une ressource. Mais vous avez tout à fait raison que GetModuleHandle(NULL) est plus probable que l'OP veut ici.OriginalL'auteur Steve Quezadas | 2011-07-18
Vous devez vous connecter pour publier un commentaire.
Vous pouvez uniquement appeler
GetModuleHandle(L"C:\\Users\\Steve\\Desktop\\stub.exe");
lorsque vous êtes en cours d'exécutionC:\Users\Steve\Desktop\stub.exe
.Mais en général, vous n'appelez pas
GetModuleHandle
pour votre nom de fichier EXE. Depuis il n'y a qu'un EXE par processus, il vous suffit d'appelerGetModuleHandle(0)
.OriginalL'auteur MSalters
Tout d'abord,
GetModuleHandle
nécessite de charger la dll dans le processus avant de la main.Windows a des chemins spécifiques qu'il utilise pour rechercher des modules, ainsi que certains commutateurs à force de " sûr " chargement des dll, vous voudrez peut-être chercher dans
SetDllDirectory
etAddDllDirectory
si vous souhaitez étendre les endroits recherchés. Voir cette pour une explication de la façon dont Windows recherche pour les fichiers binaires.OriginalL'auteur Necrolis
Voici une citation de MSDN:
Cela signifie que vous devez charger le module avec LoadLibrary premier. System32 pourrait bénéficier d'un traitement spécial, mais vous ne devrait vraiment pas être une copie. Le dossier est strictement pour le système d'exploitation d'usage.
OriginalL'auteur Don Reba