AP 和 NT Service 如何实现通讯?

碧螺春的马甲 2009-11-06 11:06:35
方法一:

看到 RegisterWindowMessage,那 service 没有 Window HANDLE,AP 如何 给 Service 发送 Message?

方法二:

共享内存 吧。杀鸡不用牛刀 ...
...全文
212 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
碧螺春的马甲 2009-11-10
  • 打赏
  • 举报
回复
PIPE 调试 OK,研究 异步模式。多谢楼上。
MoXiaoRab 2009-11-09
  • 打赏
  • 举报
回复
要是我就用管道
碧螺春的马甲 2009-11-09
  • 打赏
  • 举报
回复
试着 ControlService 中 从 lpServiceStatus 中获取 service 返回的error code。失败。

看来 Error code the service uses to report an error that occurs when it is starting or stopping

只有 start/stop 的动作才行。

多谢英雄们的 提议,我一个个的做实验。
assicen 2009-11-08
  • 打赏
  • 举报
回复
1 DLL内存共享
2 CreateFileMapping
dijkstar 2009-11-07
  • 打赏
  • 举报
回复
学习
fly4free 2009-11-07
  • 打赏
  • 举报
回复
这个……先Mark一下。
Dingnifei123 2009-11-07
  • 打赏
  • 举报
回复
顺手顶一下,
zy1691 2009-11-07
  • 打赏
  • 举报
回复
补充一下,如果给一个没有窗口的线程发消息应该使用PostThreadMessage,over。
zy1691 2009-11-07
  • 打赏
  • 举报
回复
当一个线程第一次被建立时,系统假定线程不会被用于任何与用户相关的任务。这样可以减少线程对系统资源的要求。但是,一旦这个线程调用一个与图形用户界面有关的函数(例如检查它的消息队列或建立一个窗口),系统就会为该线程分配一些另外的资源,以便它能够执行与用户界面有关的任务。特别是,系统分配一个T H R E A D I N F O结构,并将这个数据结构与线程联系起来。

这个T H R E A D I N F O结构包含一组成员变量,利用这组成员,线程可以认为它是在自己独占的环境中运行。T H R E A D I N F O是一个内部的、未公开的数据结构,用来指定线程的登记消息队列(posted-message queue)、发送消息队列( send-message queue)、应答消息队列( r e p l y -message queue)、虚拟输入队列(virtualized-input queue)、唤醒标志(wake flag)、以及用来描述线程局部输入状态的若干变量。

简单通讯的话,PostMessage即可。
要求高的话就共享内存吧,这是性能最高的实现方法。
碧螺春的马甲 2009-11-06
  • 打赏
  • 举报
回复
方法三: good ,多谢zyq5945

ControlService 可以实现 AP -> NT Service 单向通讯。

那如何 实现 NT Service -> AP/DLL 的通讯呢?

AP 仅仅是 DLL 被动模块。
ylywyn136 2009-11-06
  • 打赏
  • 举报
回复
学习
zyq5945 2009-11-06
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1447
响应控制请求
  你可以用任何适合的方式与服务通讯——命名管道,思想交流,便条等等——对于一些简单的请求,用系统函数 ControlService 很容易实现。CNTService 提供了一个处理器专门用于通过 ControlService 函数发送的非标准消息(也就是用户发送的消息)。本文例子用单一消息在注册表中保存当前服务的状态,以便其它应用程序能看到它。我不建议用这种方法来监控服务,因为它不是最佳方法,这只是比较容易编码实现而已。ControlService 所能处理的用户消息必须在 128 到 255 这个范围。我定义了一个常量 SERVICE_CONTROL_USER,128 作为基值。范围内的用户消息被发送到 CNTService:: OnUserControl,在例子服务中,处理此消息的细节如下:

BOOL CMyService::OnUserControl(DWORD dwOpcode)
{
switch (dwOpcode) {
case SERVICE_CONTROL_USER + 0:

// Save the current status in the registry.
SaveStatus();
return TRUE;

default:
break;
}
return FALSE; // say not handled
}

SaveStatus 是一个局部函数,用来在注册表中存储服务状态。
快乐鹦鹉 2009-11-06
  • 打赏
  • 举报
回复
顶一个再说。
sky01930 2009-11-06
  • 打赏
  • 举报
回复
Service到AP/DLL通信:

AP/DLL中创建一个窗口消息循环,然后创建一块共享内存,在内存中保存窗口句柄,当窗口消息循环退出时,释放共享内存。

service需要向AP/DLL通信时,先根据共享内存名字查找窗口句柄,通过WM_COPYDATA发送消息(这个消息可以携带数据),与AP/DLL通信。如果找不到共享内存,说明AP/DLL还没有启动,可以作相应处理。

其实可以在共享内存中分配两个句柄的空间,service也创建一个窗口消息循环,窗口句柄都保存在共享内存中,这样,双方可以随意通信。
wangk 2009-11-06
  • 打赏
  • 举报
回复
回环地址不需要有网卡,你可以在虚拟机里弄一个没网卡的机器就知道了。
碧螺春的马甲 2009-11-06
  • 打赏
  • 举报
回复
万一 没 网卡 ...
wangk 2009-11-06
  • 打赏
  • 举报
回复
晕,机器上难道还会差两个端口??

监听和连接都用回环地址就是了。
碧螺春的马甲 2009-11-06
  • 打赏
  • 举报
回复
socket 是不是 网络 通信啊?

这个占 网口吗?
wangk 2009-11-06
  • 打赏
  • 举报
回复
……

用socket。

共享内存、管道、邮槽之类的都要考虑安全属性,没有socket简单清爽。
zyq5945 2009-11-06
  • 打赏
  • 举报
回复
可以试试PostThreadMessage,DLL的线程做个消息循环,把线程ID通过注册表等方式告诉NT Service。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧