DllMain pas appelé après l'utilisation de la fonction LoadLibrary
Je suis une C++ débutant (3-4 mois) et je suis en train de faire maigre à propos de windows accrochage. J'ai eu un bug avec une DLL que je suis en train d'injecter et après j'ai réalisé que mon DllMain n'est pas appelée! J'ai regardé presque tous les fils sur StackOverflow et ne peuvent pas comprendre mon problème. J'ai trouvé que par intializing une variable à 5, le changer pour 1 dans DllMain et j'ai sortie la variable dans une fonction. La variable ne change jamais. Voici le code:
int i = 5;
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
i=1;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hDll = (HINSTANCE) hModule;
break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break;
case DLL_PROCESS_DETACH: break;
}
return TRUE;
}
bool InstallHook(){
cout << "INSTALLING HOOK... " << endl;
cout << i << endl;
hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, hDll, 0);
return hHook != NULL;
}
Et voici mon chargement de la DLL...
typedef bool (*InstallHook)();
typedef void (*UninstallHook)();
InstallHook ih;
UninstallHook uh;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
uh();
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
//Bunch of code to initialize a simple window until this:
HINSTANCE hDll = LoadLibrary("e:\\projects\\DLL\\ToInject.dll");
ih = (InstallHook)GetProcAddress(hDll, "InstallHook");
uh = (UninstallHook)GetProcAddress(hDll, "UninstallHook");
if (!ih()){
cout << "SUCCESS" << endl;
}else{
cout << "FAILED" << endl;
}
//other stuff to create a window
return Msg.wParam;
}
La sortie:
INSTALLING HOOK...
5 //We can see here that the DLL never changed the value of i to 1.
SUCCESS
UNINSTALL HOOK...
Document de l'éditeur de liens de ligne de commande pour le projet de DLL.
Pour info, le premier argument de la fonction DllMain devrait être
Pour info, le premier argument de la fonction DllMain devrait être
HINSTANCE
, pas HANDLE
, mais comme ils sont tous les deux typedef void *
je ne pense pas que pourrait être la cause de votre problème. Est DllMain être exporté?OriginalL'auteur Michael Villeneuve | 2013-01-11
Vous devez vous connecter pour publier un commentaire.
Suivez ces étapes pour faire un exemple (C'est pour visual studio):
dllmain.cpp
Main.cpp
Il workes ici. Je reçois une MessageBox avec test et 1 fois avec chargés. Vous pouvez comparer ce code avec le vôtre. J'espère que vous trouverez le problème.
Étrange, mon DLL principale est appelée. - Je mettre à jour la réponse de sorte que vous pouvez voir mon DllMain.
OriginalL'auteur Laurence
Je vois un
WinMain
et uncout
dans le même programme.Expliquer les types de projet que vous avez créé.
Vous pouvez prendre un coup d'oeil à un exemple de crochet ici - http://www.codeproject.com/Articles/5002/Mousey-Roll-Over-and-Park
Merci, je vais jeter un oeil au projet. La raison pour laquelle j'ai un WinMain est parce que j'ai essayé de tester mon crochet pendant que la fenêtre est ouverte parce que j'ai lu dans un autre StackOverflow problème que parfois vous pouvez avoir un hardtime de débogage de la fonction DllMain à partir d'une application console. Mais avant que tout était dans ma fonction principale, mais le résultat était le même.
OriginalL'auteur Superman
Si vous compilez avec C++, vous devez ajouter " extern "C" " en face de la fonction DllMain
OriginalL'auteur GOMazk