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 \”
没有找到相关结果
已邀请:
4 个回复
骨乏唯瓜
-这就是
失败的原因-这不是正确的名称。 采用
而且您会得到一个更易管理的名称
,因此
应该可以使用。 如果您想要一个更好的名称,我想您需要使用一个DEF文件,来自http://msdn.microsoft.com/zh-cn/library/3y1sfaz2.aspx: C ++函数的dllexport将使用C ++名称修饰公开该函数。如果不需要C ++名称修饰,请使用.def文件(EXPORTS关键字)或将函数声明为extern \“ C \”。 如下所示的.def文件应该可以解决问题(注意:
关键字似乎区分大小写):
使用
选项将.def文件传递到链接器。
距相镭
替换为
确保将函数完全导出为\“ HookProc \”。 如果没有,请使用.def文件定义函数的导出名称。
桑娠贯涤
吗?
是模态的,可能使事情变得混乱。
朗排谎纷瘟