DLL导出函数小问题
好久没写过DLL了,手生得很。今天写了一个DLL来测试一个Hook例子,结果导出函数以后死活是无法加载。
因为用的是.NET 2005,所以默认使用的Unicode,改成Multi-Byte Character Set 也不行,
GetProcAddress总是返回空。
DLL代码部分:
只好改成静态连接先运行了。后来想起来用depend查看了一下,大跌眼镜,导出的函数名不是StartHook而是XYZStartHook@这样的名字(名字没记下来)。于是用extern "C" 修饰了一下,搞定。又用了一下Def文件,结果没有导出函数(去掉了_declspec(dllexport)),也就是说def文件没起作用。在工程属性里面找了一下,发现要在"Configuration Properties"->"Linker"->"Input"->"Module Definition File"一栏里面把DEF文件名填上才行。
汗一个!~
感慨:TotalCommander不是万能滴啊!
因为用的是.NET 2005,所以默认使用的Unicode,改成Multi-Byte Character Set 也不行,
1 m_hLibrary = LoadLibrary(TEXT("MessageHook.dll"));
2 if ( m_hLibrary )
3 {
4 StartHookFunc start = (StartHookFunc)GetProcAddress(m_hLibrary, "StartHook");
5 if ( start )
6 {
7 start(this->GetSafeHwnd());
8 }
9 else
10 {
11 MessageBox(TEXT("Error to find StartHook function!"));
12 PostQuitMessage(-1);
13 }
14 }
15
2 if ( m_hLibrary )
3 {
4 StartHookFunc start = (StartHookFunc)GetProcAddress(m_hLibrary, "StartHook");
5 if ( start )
6 {
7 start(this->GetSafeHwnd());
8 }
9 else
10 {
11 MessageBox(TEXT("Error to find StartHook function!"));
12 PostQuitMessage(-1);
13 }
14 }
15
GetProcAddress总是返回空。
DLL代码部分:
1 BOOL _declspec(dllexport) StartHook(HWND _hMonitor)
2 {
3 s_hTargetWnd = _hMonitor;
4 g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MyMouseProc, g_hModule, 0);
5 if (g_hHook == NULL)
6 return FALSE;
7
8 return TRUE;
9 }
用TotalCommander自带的查看器查看了一下DLL,发现StartHook函数已经导出,就是不能得到地址,百思不得其解。函数名也是StartHook。2 {
3 s_hTargetWnd = _hMonitor;
4 g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MyMouseProc, g_hModule, 0);
5 if (g_hHook == NULL)
6 return FALSE;
7
8 return TRUE;
9 }
只好改成静态连接先运行了。后来想起来用depend查看了一下,大跌眼镜,导出的函数名不是StartHook而是XYZStartHook@这样的名字(名字没记下来)。于是用extern "C" 修饰了一下,搞定。又用了一下Def文件,结果没有导出函数(去掉了_declspec(dllexport)),也就是说def文件没起作用。在工程属性里面找了一下,发现要在"Configuration Properties"->"Linker"->"Input"->"Module Definition File"一栏里面把DEF文件名填上才行。
汗一个!~
感慨:TotalCommander不是万能滴啊!