我有一个程序,使用了全局钩子,因此要使用一个DLL和一个EXE。我想在DLL中向EXE报告它运行的情况,可是我不知道如何做。
因为应用程序没有窗口,所以如果使用自定义消息,我不知道消息发向哪里。
在DLL中开辟一个内存存放信息也不好,因为应用程序不可能总是去查询这段内存。其他的我就想不到了,各位有什么好的方法?

解决方案 »

  1.   

    你的应用程序应该是隐藏窗口,而不是没有窗口吧。
    如果是这种情况,就可以把它当作一个窗口显示的程序去做。
    如:
    在DLL中定义一个为DLL中全局变量HWND dllWnd附值的函数,当你用LoadLibrary加载时,首先调用这个函数,把主程序的m_hWnd传入Dll中,当动态连结库里需要发送消息到主程序时::SendMessage(dllWnd,....),这种办法我试过,可以成功的。如果是Service的话,如果想作到事件响应的话,就只能用连接点了。
    关于连接点的实现自己查查COM吧,比较复杂.
      

  2.   

    还记得操作系统课程里面的“生产者、消费者”的例子吗?
    你的DLL就是生产者,你的EXE是消费者。
    这样你需要通过信号量来控制它们之间的数据传递。============================================================================
    DocWizard C++ 程序文档生成工具 http://www.betajin.com/alphasun/index.htm
      

  3.   

    发消息是可以的,没有窗口的话可由应用程序注册一个线程ID,然后使用PostThreadMessage发消息。
    另一个方法是回调函数。回调函数有几种方式:
    1、使用QueueUserAPC函数。这需要给出一个线程句柄而不是ID,并且该线程必须在适当的时候进入警戒模式(通过调用SleepEx等函数),回调函数才能得到执行。
    2、使用QueueUserWorkItem函数。这会使系统创建一个线程池,在线程池中执行所需的回调函数。除此之外,还可以使用PostQueuedCompletionStatus函数向一个完成端口添加一条完成消息。还可以利用Event同步对象,并提供用于查询的引出函数。当状态发生变化的时候,将Event对象置位传信状态,然后EXE就可以调用函数去查询状态了。
      

  4.   

    回调函数的解决方案最好,
    让EXE传给DLL一个函数指针,
    DLL愿意的时候就调用这个函数。最方便最省事。
      

  5.   

    谢谢各位,尤其是 JoeRen(地球发动机) 。
    等我回去把问题解决了,明天来给分。谁还有更好的方法,也来说说呀。
      

  6.   

    JoeRen(地球发动机) :QueueUserAPC()怎么用呀?
    PAPCFUNC是怎样的定义,我没找到。
    能给个简单的例子吗?
      

  7.   

    JoeRen(地球发动机) : good, thanks.
      

  8.   

    JoeRen(地球发动机) :我真的不知道怎么用呀。