大概意思是,有三个应用程序exe,一个服务器端运行在PC上用来控制,跑在wince上的一个client端的程序和一个hook钩子记录程序,而运行在wince上的两个应用程序都是没界面的。server发送指令开启和关闭一些应用程序。 现在对server控制无界面hook钩子记录程序exe!有点疑问,server通过命令start.....开启这个程序,开启就开始作记录把鼠键的操作记录写入文件,但是听说,在关闭close....程序之前要把钩子卸载掉unhook,怎样去通知卸载钩子,这不知道,怎么个实现!关闭程序是直接TerminateProcess进程!有什么方法!
terminateProcess怕是没机会让程序通知卸载了,要么在terminateProcess之前先通知卸载,然后~~terminateProcess进程后,进程资源是不会马上释放掉的~
CreateEvent OpenEvent WaitForSingleObject SetEvent 具体可以查MSDN或者上网搜一下,有很多文章讲解
dll的代码就没贴了,这是winmian的代码:
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
//定义回调函数指针
typedef BOOL (CALLBACK *instkbhook)();
instkbhook InMHook,UnMHook; static HINSTANCE hinstDLL;
//load的dll,获取dll实例句柄
if(hinstDLL=LoadLibrary(L"MouseHook_CE.dll"))
{
//获取dll的钩子函数的地址
InMHook = (instkbhook)GetProcAddress(hinstDLL, L"InstallMouseHook");
UnMHook = (instkbhook)GetProcAddress(hinstDLL, L"UnMouseHook");
}
else
{
//AfxMessageBox(L"cannot find the MyKbdHook_CE.dll");
//LoadLibrary 出错
GetLastError();
}
//开始记录鼠标的操作,需要作个循环 InMHook();
//如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。
for (;;)
{
}
//卸载钩子
UnMHook(); //释放dll资源
FreeLibrary(hinstDLL); return 0;
}
client就是收到结束命令时,期望运行for循环以下的东西就可以了!之前我是client接收到结束记录的命令我就直接TerminateProcess记录程序exe的进程了!
我在ClientTest里OpenEvent结果为NULL。怎么回事!那个记录程序为RecordOp.exe,客户端的那个程序为ClientTest.exe,运行在PC上的那个程序为tcpServer.exe
//这段代码为钩子程序,是RecordOp.exe,dll实现部分就没贴了
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
//定义回调函数指针
typedef BOOL (CALLBACK *instkbhook)();
instkbhook InMHook,UnMHook; static HINSTANCE hinstDLL;
//load的dll,获取dll实例句柄
if(hinstDLL=LoadLibrary(L"MouseHook_CE.dll"))
{
//获取dll的钩子函数的地址
InMHook = (instkbhook)GetProcAddress(hinstDLL, L"InstallMouseHook");
UnMHook = (instkbhook)GetProcAddress(hinstDLL, L"UnMouseHook");
}
else
{
//AfxMessageBox(L"cannot find the MyKbdHook_CE.dll");
//LoadLibrary 出错
GetLastError();
}
//开始记录鼠标的操作,需要作个循环 InMHook(); //在此创建Evnet用来与clientTest进行通讯
HANDLE hExitEvent = CreateEvent(NULL,TRUE,FALSE,_T("RecordOp"));
if (INVALID_HANDLE_VALUE == hExitEvent)
{
//create失败,返回
GetLastError();
return 1;
}
//等待Client端的Event事件!
DWORD dxWaitResult = WaitForSingleObject(hExitEvent,INFINITE); switch (dxWaitResult)
{
case WAIT_OBJECT_0:
{
//卸载钩子
UnMHook();
//释放dll资源
FreeLibrary(hinstDLL);
//关闭句柄
if (CloseHandle(hExitEvent))
{
GetLastError();
} break;
}
default:
//dxWaitResult error
GetLastError(); } return 0;
}//这段代码是ClientTest.exe里面的,收到服务器的shutdown RecordOp.exe指令的部分代码,
//如果接收到的内容为Sinstruct[5]则关闭记录程序
if (!strcmp(Sinstruct[5],buffer))
{
DWORD uExitcode = 0;
int ret = 0;
int errorcode = 0;
HANDLE hEvent;
//如果记录程序exe没有开启
if (NULL == hProcess[1])
{
//则不能关闭
}
else
{
//触发Event卸载钩子,free库,close句柄0 hEvent = OpenEvent(EVENT_ALL_ACCESS,TRUE,_T("RecordOp"));
if (INVALID_HANDLE_VALUE == hEvent)
{
//create失败,返回
ret = GetLastError();
}
if (!SetEvent(hEvent))
{
//SetEvent失败
errorcode = GetLastError();
} // 以前是直接terminate记录程序exe的进程,从而导致了死机
//if(!TerminateProcess(hProcess, 0))
//{
// GetLastError();
//}
}
continue; }哥们帮忙看看这样是不是有问题,怎么改啦,谢了!我对windows进程通讯机制不了解~~
你得确保在CreateEvent之后再OpenEvent
CreateEvent(NULL,TRUE,FALSE,_T("Global\RecordOp"));
OpenEvent(EVENT_ALL_ACCESS,TRUE,_T("Global\RecordOp"));
汗,应该和这个没关系,可能是你的event的名称有重复
这个global确实有关系,参见:
http://hi.baidu.com/mikenoodle/blog/item/523aaa34f4e163bdd0a2d389.html