C ++ DLL函数导出。 DLL不会保持加载状态

| 嗨,我遇到了以下问题,但我不知道发生了什么。 DLL代码mylib.cpp(mylib.dll):
#include <Windows.h>
#include <tchar.h>

__declspec(dllexport) LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) {
    return CallNextHookEx(NULL, nCode, wParam, lParam);
    }

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserverd){

// Perform actions based on the reason for calling.
switch( fdwReason ) 
{ 
    case DLL_PROCESS_ATTACH:
     // Initialize once for each new process.
     // Return FALSE to fail DLL load.
        MessageBox(NULL,
        _T(\"DLL Loaded\"),
        _T(\"DLL Loaded\"),
        NULL);
        break;

    case DLL_THREAD_ATTACH:
     // Do thread-specific initialization.
        MessageBox(NULL,
        _T(\"DLL Unloaded\"),
        _T(\"DLL Unloaded\"),
        NULL);
        break;
    }
    return TRUE;
}
程序代码my_prog.cpp:
#include <Windows.h>
#include <tchar.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){

    FARPROC pHookProc;
    static HINSTANCE hInstDLL;

    hInstDLL = LoadLibrary(_T(\"mylib.dll\"));
    pHookProc = GetProcAddress(hInstDLL, \"HookProc\");
    if (!pHookProc) {
        MessageBox(NULL,
            _T(\"GetProcAddress failed\"),
            _T(\"GetProcAddress failed\"),
            NULL);
    }
    return 0;
}
这两个文件都编译没有任何错误。每当我运行my_prog.exe时,它都会给出一条消息“ DLL已加载”,然后立即给出一条消息“ DLL已卸载”,结果GetProcAddress()失败。有人能帮我照一下吗。为什么它会立即卸载DLL? 谢谢大家。 编辑: 我已按照c-smile建议将DLL_THREAD_ATTACH替换为DLL_PROCESS_DETACH。我检查并将函数导出为:long __stdcall HookProc(int,unsigned int,long)(1)(0x00001000)。 GetProcAddress()仍然失败。我收到\“ DLL Loaded \”,GetProcAddress()失败,\“ DLL Unloaded \”     
已邀请:
两件事情: 不要假设ѭ2表示事情有误。正如c-smile所说,当某些东西链接到您的DLL时,这应该发生。 由于这是C ++编译单元,因此您的导出将使用错误的名称
?HookProc@@YGJHIJ@Z
-这就是
GetProcAddress(hInstDLL, \"HookProc\")
失败的原因-这不是正确的名称。 采用
extern \"C\"  __declspec(dllexport) LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);
而且您会得到一个更易管理的名称
_HookProc@12
,因此
GetProcAddress(hInstDLL, \"_HookProc@12\")
应该可以使用。 如果您想要一个更好的名称,我想您需要使用一个DEF文件,来自http://msdn.microsoft.com/zh-cn/library/3y1sfaz2.aspx:   C ++函数的dllexport将使用C ++名称修饰公开该函数。如果不需要C ++名称修饰,请使用.def文件(EXPORTS关键字)或将函数声明为extern \“ C \”。 如下所示的.def文件应该可以解决问题(注意:
EXPORTS
关键字似乎区分大小写):
EXPORTS
    HookProc=_HookProc@12
使用
/def:whatever.def
选项将.def文件传递到链接器。     
DLL_THREAD_ATTACH
替换为
DLL_PROCESS_DETACH
确保将函数完全导出为\“ HookProc \”。 如果没有,请使用.def文件定义函数的导出名称。     
除了try13ѭ,您还可以尝试
printf
吗?
MessageBox
是模态的,可能使事情变得混乱。     
在DLL代码中,使用DLL_PROCESS_DETACH时: \“ lpReserved参数指示由于FreeLibrary调用,加载失败或进程终止而导致正在卸载DLL。” 因此,我将检查该参数,这可能有助于缩小问题的范围。 我还将检查LoadLibrary的返回值,以确保实际的加载成功。如果LoadLibrary失败,则可以尝试使用\'GetLastError()\'API以获取更多信息。 另外,您在LoadLibrary之后没有执行\'FreeLibrary(hInst); \'。     

要回复问题请先登录注册