如何防止DLL被使用它的应用程序卸载?

时间:2015-04-13 04:46:50

标签: c++ dll

我在C ++中创建了一个名为MyDLL.dll的DLL。 MyDLL.dll导出外部接口如下: 这是我的dll代码:

 CMyAdapter g_DllImp;

 BOOL APIENTRY DllMain(
    HMODULE hModule,
    DWORD  dwReason,
    LPVOID pReserved
)
{
    if (DLL_PROCESS_ATTACH == dwReasonForCall)
        g_DllImp.m_hModule = hModule;
    else if (DLL_PROCESS_DETACH == dwReasonForCall)
        g_DllImp.m_hModule = NULL;

    return TRUE;
}
 __declspec(dllexport) HRESULT GetVersion(
    tVersion* pVersion
)
{
    return g_DllImp.GetApiVersion(
                pVersion);
}

以下是主应用程序的示例:

int _tmain(int argc, _TCHAR* argv[])
{
  HMODULE module = LoadLibrary(L"MyDLL.dll");
....
  // call the interface of MyDLL.dll
  GetVersion(&pVersion);
  return 0;
}

不幸的是,我的主应用程序由于未知原因而崩溃。但根据Dump Crash File,崩溃是MyDLL被卸载:

0289cc24 52e4577e <Unloaded_MyDLL.dll>+0x15728

我必须使用代码来捕获异常:

__try{} 
 __except(EXCEPTION_EXECUTE_HANDLER)

我的问题是:

我应该在MyDLL界面或主应用程序中使用__try {} __except()吗?  哪一个更好?

你能帮帮我吗? 在此先感谢您的支持。

2 个答案:

答案 0 :(得分:0)

也许您没有成功加载dll,在使用之前必须确保DLL的模块符合条件。

答案 1 :(得分:0)

这不是你的DLL的责任。 DLL的所有用户都有责任匹配LoadLibraryFreeLibrary个来电。

要调试损坏的可执行文件,请尝试使用Dependency Walker。