关于服务程序通过dll向另一个界面程序发送消息的问题

时间:2022-10-13 19:48:25
今有一服务程序和一界面管理程序都运行在同一台服务器上,服务程序接收远程客户端发来的数据,调用dll处理数据,界面程序也调用同一个dll,
在handle.dll里用如下
#pragma data_seg(".HandleSeg")
HWND g_hWnd=NULL;
#pragma data_seg()
定义了个共享的窗口句柄,并定义了消息
#define WM_DATA_NOTIFY WM_USER+200
定义了2个函数SetWndHandle(HWND hWnd)设置g_hWnd,HaveData()向g_hWnd发送WM_DATA_NOTIFY 消息

运行流程如下:
1.运行服务程序并启动了服务,运行界面程序并调用dll的SetWndHandle设置dll中的g_hWnd为界面程序的主窗口句柄(GetSafeHwnd得到的);
2.客户端发送数据到服务端,服务程序正确接收到数据并调用dll的HaveData()函数发送WM_DATA_NOTIFY 消息
问题:
1.界面程序定义了同样的消息,并正确地处理了消息映射,可是服务程序通过dll发了消息后,界面程序没反应?
2.都说服务程序没有消息机制,请问大伙要实现上述功能,如何处理?

13 个解决方案

#1


RegisterWindowMessage(...)
然后 SendMessage(...) or PostMessage(...)

#2


建议用RPC调用来做。

LZ这种方式在Vista上会有问题的。

#3


可能的问题:
1、全局共享数据应该使用如下语法:
#pragma section(".HandleSeg",read,write,shared)
__declspec(allocate(".HandleSeg")) HWND g_hWnd=NULL; 

2、服务程序向桌面窗口发送消息是一种不保险的方式,因为桌面可能会有多个,或者服务与桌面处于不同的session中,都会导致发送消息失败。

3、建议的通信方式:命名管道或者RPC,或者再添加全局共享变量来传递数据。

#4


谢谢dbger,以前不知道RPC调用,听你这么说,到网上查看了下,感觉这个和.NET的remoting有点相似,我们目前有个产品是用remoting实现的异地数据传输。由于问题多多,还有用户的环境从98到XP都有,于是就打算用VC重写,传输的每一个过程,包括内存分配自己心里都有数。不过我还没看到RPC和这里的消息传递的联系,继续学习中...

#5


这种方法不行,可以利用Pipe、RPC、FileMapping等方式代替DLL共享内存来传递数据,用命名事件代替消息通讯。

#6


谢谢楼上兄弟,问下Pipe、RPC在Win98下支持吗?

#7


使用socket建立通信机制。

#8


在CreateService创建服务时     
 把 dwServiceType   设置   SERVICE_INTERACTIVE_PROCESS
或者在服务管理器里在你的服务的属性选项卡的登录下把允许服务与桌面交互选上试试

#9


Up

#10


问题解决,程序的问题在于没有将dll,服务程序,界面程序放在同一个目录下,放在同一个目录下后,界面程序就能收到消息了。这样可能会有些潜在的问题,有问题时再说,谢谢各位朋友的回贴。

#11


98下没试过,LZ如果只在98下用可能可以,换Vista或者XP就不行了。

#12


对了,98下应该是没有服务程序概念的,莫非LZ所说的服务程序只是一个应用程序?

#13


不在98下面用,只是问下pipe,rpc之类的能不能在98下用,查了下资料,98下能用部分功能,现在设计的服务器端在2000以上的环境下用,客户端需要在98上用,就不能做成服务程序了,根据设计也需要进程间通信,所以这里问的也可能会用到,目前问题已经解决,本人所提出的问题,目前在2000下是能够实现的,多谢参与的朋友!

#1


RegisterWindowMessage(...)
然后 SendMessage(...) or PostMessage(...)

#2


建议用RPC调用来做。

LZ这种方式在Vista上会有问题的。

#3


可能的问题:
1、全局共享数据应该使用如下语法:
#pragma section(".HandleSeg",read,write,shared)
__declspec(allocate(".HandleSeg")) HWND g_hWnd=NULL; 

2、服务程序向桌面窗口发送消息是一种不保险的方式,因为桌面可能会有多个,或者服务与桌面处于不同的session中,都会导致发送消息失败。

3、建议的通信方式:命名管道或者RPC,或者再添加全局共享变量来传递数据。

#4


谢谢dbger,以前不知道RPC调用,听你这么说,到网上查看了下,感觉这个和.NET的remoting有点相似,我们目前有个产品是用remoting实现的异地数据传输。由于问题多多,还有用户的环境从98到XP都有,于是就打算用VC重写,传输的每一个过程,包括内存分配自己心里都有数。不过我还没看到RPC和这里的消息传递的联系,继续学习中...

#5


这种方法不行,可以利用Pipe、RPC、FileMapping等方式代替DLL共享内存来传递数据,用命名事件代替消息通讯。

#6


谢谢楼上兄弟,问下Pipe、RPC在Win98下支持吗?

#7


使用socket建立通信机制。

#8


在CreateService创建服务时     
 把 dwServiceType   设置   SERVICE_INTERACTIVE_PROCESS
或者在服务管理器里在你的服务的属性选项卡的登录下把允许服务与桌面交互选上试试

#9


Up

#10


问题解决,程序的问题在于没有将dll,服务程序,界面程序放在同一个目录下,放在同一个目录下后,界面程序就能收到消息了。这样可能会有些潜在的问题,有问题时再说,谢谢各位朋友的回贴。

#11


98下没试过,LZ如果只在98下用可能可以,换Vista或者XP就不行了。

#12


对了,98下应该是没有服务程序概念的,莫非LZ所说的服务程序只是一个应用程序?

#13


不在98下面用,只是问下pipe,rpc之类的能不能在98下用,查了下资料,98下能用部分功能,现在设计的服务器端在2000以上的环境下用,客户端需要在98上用,就不能做成服务程序了,根据设计也需要进程间通信,所以这里问的也可能会用到,目前问题已经解决,本人所提出的问题,目前在2000下是能够实现的,多谢参与的朋友!