我做了一个win32的DLL,在DLL中定义了一个全局变量g_hInst=NULL,在DllMain内将DLL的实例hInstance保存到全局变量中g_hInst,  在客户端::LoadLibrary后,发现该g_hInst的值仍为NULL, 何解?

解决方案 »

  1.   

    怎么会?看看是不是你什么地方写错了?
    检查一下你在DllMain的什么地方赋值的,会不会有问题,其他地方还有没有赋值,装载是否成功等等。
      

  2.   

    extern "C"
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
    g_hInstance = (HINSTANCE)hModule;
        switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
        }
        return TRUE;
    }
    在程序结束时,才FreeLibrary的.
      

  3.   

    应该在DLL_PROCESS_ATTACH时获取,这么写:
    HINSTANCE hinst = NULL; HWND hwndDLG = NULL; BOOL CALLBACK DlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam);BOOL CALLBACK AboutProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam);extern "C" __declspec(dllexport) void ShowDlg(); BOOL APIENTRY DllMain( HANDLE hModule,                        DWORD  ul_reason_for_call,                        LPVOID lpReserved                                    ){       switch(ul_reason_for_call)       {       case DLL_PROCESS_ATTACH:              hinst = (HINSTANCE)hModule;       case DLL_PROCESS_DETACH:              break;       }    return TRUE;}
      

  4.   

    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH: //进程调用LoadLibrary
                          g_hInst = (HINSTANCE)hModule;//在这里保存hinstance
    case DLL_THREAD_ATTACH:    //线程调用LoadLibrary
    case DLL_THREAD_DETACH:    //线程调用FreeLibrary
    case DLL_PROCESS_DETACH:   //进程调用FreeLibrary
    break;
        }
      

  5.   

    把这种要与外界通信的变量写道共享数据段就可以了。
    #pragma data_seg("Shared")HINSTANCE g_hIns = NULL;#pragma data_seg()#pragma comment(linker,"/Section:Shared,rws") //设置全局共享数据段的属性