关于进程之间通讯的问题(100)

  • 主题发起人 主题发起人 dfw1001
  • 开始时间 开始时间
D

dfw1001

Unregistered / Unconfirmed
GUEST, unregistred user!
程序分为服务程序和用户程序,因为vista以及win7将服务程序和用户程序分开在不同的session中运行,那么就涉及到了,服务程序如何与用户程序通讯的问题。我采用了共享内存的方法,现在需要解决的是,一端改变了内容,那么另外一端如何知道内容已经改变?sendmessage等是不行了,不同sessionid下收不到消息。我试着用timer循环不断监视内容,这样是不是效率低占用资源多呢?求更好的方法?
 
用户程序用ControlService给服务程序发消息:var scm,sHandle:SC_HANDLE; SVCStatus:TServiceStatus;begin scm:=OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); sHandle:=OpenService(scm, PChar(ServiceName), SERVICE_ALL_ACCESS); ControlService(sHandle,发送的消息,SVCStatus); CloseServiceHandle(sHandle); CloseServiceHandle(scm);end;TService有个DoCustomControl的虚方法,你重载他里面判断消息对象,参数就是用ControlService发送的消息function DoCustomControl(CtrlCode: DWord): Boolean;begin if CtrlCode=发送的消息 then begin 处理 end; Result := True;end;
 
to hs-kill: 非常感谢你的回复,上面的代码可以实现用户程序向服务程序发送消息,那么有什么办法可以实现服务程序向用户程序发消息呢?用户程序是服务程序通过StartProcessAsUser创建的。[:)]
 
理论上,服务程序不应该主动联络用户程序,因为服务程序是可以脱离桌面运行的,而用户程序则需要依托于桌面当然可以用一些其他方式实现通信,比如内存共享我没做过服务程序联络用户程序的,不过如果真的需要的话,我建议使用端口通信的方式,这个比较方便,也比较稳定
 
非常感谢hs-kill[:)]
 
后退
顶部