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 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