大概意思是,有三个应用程序exe,一个服务器端运行在PC上用来控制,跑在wince上的一个client端的程序和一个hook钩子记录程序,而运行在wince上的两个应用程序都是没界面的。server发送指令开启和关闭一些应用程序。     现在对server控制无界面hook钩子记录程序exe!有点疑问,server通过命令start.....开启这个程序,开启就开始作记录把鼠键的操作记录写入文件,但是听说,在关闭close....程序之前要把钩子卸载掉unhook,怎样去通知卸载钩子,这不知道,怎么个实现!关闭程序是直接TerminateProcess进程!有什么方法!

解决方案 »

  1.   

    先用Event通知进程unhook,然后再TerminateProcess
      

  2.   

    全局钩子最好卸载一下,特别是插入DLL的情况,若不卸载,DLL则一直留在被注入进程中
      

  3.   

    我没卸载,直接结束就死机了!event怎么通知去unhook,对windows了解甚少
      

  4.   

    关闭程序是直接TerminateProcess进程这个~~~
    terminateProcess怕是没机会让程序通知卸载了,要么在terminateProcess之前先通知卸载,然后~~terminateProcess进程后,进程资源是不会马上释放掉的~
      

  5.   

    如果是正常关闭,OnClose啊或者什么的都会执行,可以卸载钩子,但是terminateProcess是干掉进程后就再也不往下走了,感觉是把消息连砍断了~
      

  6.   


    CreateEvent OpenEvent WaitForSingleObject SetEvent 具体可以查MSDN或者上网搜一下,有很多文章讲解
      

  7.   


    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的进程了!
      

  8.   

    在for之前CreateEvent,把for (;;)改成WaitForSingleObject,然后在结束进程处TerminateProcess之前先OpenEvent SetEvent
      

  9.   


    我在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进程通讯机制不了解~~
      

  10.   

    openevent的handle为0x00000000,getlasterror的值为87,(87 :参数不正确)
      

  11.   


    你得确保在CreateEvent之后再OpenEvent
      

  12.   

    可以了要加个Global
    CreateEvent(NULL,TRUE,FALSE,_T("Global\RecordOp"));
    OpenEvent(EVENT_ALL_ACCESS,TRUE,_T("Global\RecordOp"));
      

  13.   


    汗,应该和这个没关系,可能是你的event的名称有重复
      

  14.   

    因为我是先发命令开启那个记录程序,开启时就create啦,在发送关闭命令时open啦,开启在先!我看csdn论坛上别人这么说的,顺便改了下,还真可以行,调试也过了啊!
      

  15.   


    这个global确实有关系,参见:
    http://hi.baidu.com/mikenoodle/blog/item/523aaa34f4e163bdd0a2d389.html