读书人

第一次做DLL遇到一个有关问题

发布时间: 2012-02-14 19:19:19 作者: rapoo

第一次做DLL,遇到一个问题
第一次做DLL,遇到一个问题
想用一个DLL文件做一个钩子,录制键盘操作并保存成一个文件

DLL文件声明了一个全局变量char m_LogPath[100]; 用来保存文件的路径
DLLEXPORT int CALLBACK InstallHOOK(LPCTSTR LogPath)//安装钩子函数,参数是路径
{
strcpy(m_LogPath,LogPath); //保存路径
...
g_hHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hInst,0); //安装钩子
}

LRESULT CALLBACK KeyboardProc( int iCode, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information )
{
...
fp=fopen(m_LogPath, "a+ "); //打开这个文件
...
}

现在出的问题是我拿一个主程序调用这个DLL,当主程序是当前窗口时按键都可以记录没有问题,其他窗口里按键时m_LogPath就变成了空字符串,fopen报错退出
请高手帮忙看看为什么

[解决办法]
是安装的全局钩子吗?
char m_LogPath是否声明在shared:RWS段中了?
[解决办法]
需要使用共享数据段技术

#pragma data_seg ( "my_shared_seg ")
char m_LogPath[256] = " "; /* 这里一定要赋初值, 不然 Microsoft 的连接器会忽略此变量 */
#pragma data_seg ()
#pragma comment (linker, "/section:my_shared_seg,RWS ")

[解决办法]
同意 cdeee(亦难) ,没有放共享段的数据只是在自己的虚拟空间中,即使是全局变量也是,使用时肯定找不到的。创建钩子的程序加载了动态库,可m_LogPath却只是在这个程序的虚拟空间中。被钩的程序敲键盘时,该动态库变成被钩的程序的虚拟空间,但仍然按创建钩子的程序的偏移地址去寻址,当然找不到了。
共享段是随着动态库一起加载的,一个动态库只有一分,所有使用他的程序都是使用这个段自己的偏移地址,包括钩的和被钩的^_^

读书人网 >VC/MFC

热点推荐