我写的一个服务端程序,监视进程、工作进程。服务启动后监视进程工作,启动工作进程。监视进程与工作进程之间可以通过PostThreadMessage传递数据。    另有一个UI监视程序,是在桌面手动运行的。运行后无法连接工作进程的互斥体和共享内存对象。后经过分析,是权限不足导致。服务进程运行于SYSTEM用户下,拥有最高的权限,桌面程序运行在Administrators用户下,无法打开SYSTEM用户下的对象。
    
    于是我对互斥体和共享内存的创建方式加入了SECURITY_ATTRIBUTES。UI监视程序运行后成功打开工作进程对象。下面问题来了:    我通过共享内存将工作进程的主线程ID传递给UI监视程序,UI监视程序向线程发送消息时提示非法的线程ID。
  于是我觉得工作进程创建时也应该加入相同的权限,同样,我在创建工作进程时修改了SECURITY_ATTRIBUTES。运行后错误依旧。    于是我将UI监视线程的主线程通过共享内存传递给工作进程,由工作进程向UI发送消息。PostThreadMessage函数调用成功,但UI监视进程就是收不到消息。   总结两个问题:
      1.UI监视进程无法给工作进程主线程发消息,提示非法的线程ID;
      2.工作进程成功给UI监视进程发送消息,但UI监视进程始终收不到消息。望高手指教,不甚感激!!!
   

解决方案 »

  1.   

    不同session之间,既然你已经有了共享内存,那么就所有通信都通过共享内存来传递数据。
      

  2.   

    感谢版主oyljerry的关注!!!这应该是留做最后的解决方案吧。因为如果通过共享内存传递数据,工作进程要不停的查询内存数据用以判断是否需要写入要求的信息,这样对服务程序的效率有所影响。我希望工作进程通过被动方式,给UI提交监视数据。以上问题第2条我已解决,原因是因PostThreadMessage只能将消息传递给线程,而分发到窗口则需要线程本身处理,因没有窗口句柄,所以无法到达UI窗口处理。我现在就是想知道,为什么UI进程无法给服务进程中的线程发消息。线程是拥有消息队列的。
      

  3.   

    Vista/Win7后的Session 0 隔离
    普通Message方式无法IPC的.参考
    http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx推荐Namepie或者用Shared Memory+1锁1个事件进行单向传输控制.
      

  4.   

    全局对象可以看下 这篇文章 
    http://issf.blog.163.com/blog/static/1941290822009102594518661/