今有一服务程序和一界面管理程序都运行在同一台服务器上,服务程序接收远程客户端发来的数据,调用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.都说服务程序没有消息机制,请问大伙要实现上述功能,如何处理?
在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.都说服务程序没有消息机制,请问大伙要实现上述功能,如何处理?
然后 SendMessage(...) or PostMessage(...)
1、全局共享数据应该使用如下语法:
#pragma section(".HandleSeg",read,write,shared)
__declspec(allocate(".HandleSeg")) HWND g_hWnd=NULL; 2、服务程序向桌面窗口发送消息是一种不保险的方式,因为桌面可能会有多个,或者服务与桌面处于不同的session中,都会导致发送消息失败。3、建议的通信方式:命名管道或者RPC,或者再添加全局共享变量来传递数据。
把 dwServiceType 设置 SERVICE_INTERACTIVE_PROCESS
或者在服务管理器里在你的服务的属性选项卡的登录下把允许服务与桌面交互选上试试