最近在做一个资源管理器背景工具,将模块注入后,需要跟模块进行通信,意向传递一些信息。
一开始想到的是使用共享内存,但是无法进行实时通知。
匿名管道的话需要传入句柄字符串,也不太适用这里的场景。
使用Mailslots可以间隔的去取消息,刚好可以实现这个需求。不同于消息队列的时,没取到消息时,不会阻塞。
Mailslots介绍
mailslot 是驻留在内存中的伪文件,可以使用标准文件函数对其进行访问。 mailslot 消息中的数据可以采用任何形式,但在计算机之间发送时不能大于 424 个字节。 与磁盘文件不同,mailslot 是临时的。 关闭mailslot的所有句柄后,将删除 mailslot 及其包含的所有数据。
mailslot 服务器是创建和拥有 mailslot 的进程。 当进程创建 mailslot 时,我们可以得到一个 mailslot 句柄。 从mailslot 读取消息时,必须使用此句柄。 只有创建mailslot或已通过某些其他机制(如继承 () )获取句柄的进程才能从 mailslot 读取。 所有 mailslot 都是创建它们的进程的本地位置。 进程无法创建远程mailslot。
mailslot 客户端是一个将消息写入 mailslot 的进程。 只要名字跟创建进程里的一致,任何进程都可以把消息写入到这个mailslot。
Mailslot 可以广播域中的消息。 如果域中的多个进程都使用相同的名称创建mailslot,则发送到该mailslot并发送到域的每条消息都将由参与进程接收。 由于一个进程可以控制服务器 mailslot 句柄和在打开 mailslot 进行写入操作时检索的客户端句柄,因此应用程序可以轻松地在域中实现简单的消息传递工具。
若要在计算机之间发送大于 424 字节的消息,请改用 命名管道 或 Windows 套接字 。
这一段介绍来自MSDN,翻译不是非常准确,不过大概能看懂就行了。推荐直接阅读英文原文。
Mailslot名称
格式如下:
\\.\mailslot\[path\]name
如
1 #define DEMO_SLOT_NAME L"\\\\.\\mailslot\\demo_slot"
还可以根据不同进程创建不同的mailslots:
如:
\\.\mailslot\mark\process1
\\.\mailslot\mark\process2
\\.\mailslot\mark\process3
特定远程计算机上的 mailslot:
\\ComputerName\mailslot\[path\]name
指定域中的每个 mailslot :
\\DomainName\mailslot\[path\]name
系统主域中具有给定名称的每个 mailslot:
\\*\mailslot\[path\]name
创建Mailslots
1 #define DEMO_SLOT_NAME L"\\\\.\\mailslot\\demo_slot" 2 3 HANDLE WINAPI MakeSlot(LPCTSTR lpszSlotName) 4 { 5 HANDLE hSlot = CreateMailslot(lpszSlotName, 6 0, //no maximum message size 7 MAILSLOT_WAIT_FOREVER, //no time-out for operations 8 NULL); //default security 9 10 if (hSlot == INVALID_HANDLE_VALUE) 11 { 12 std::cout << "Create mailslot failed with " 13 << GetLastError() 14 << std::endl; 15 return NULL; 16 } 17 else 18 { 19 std::cout << "Create mailslot successfully." << std::endl; 20 return hSlot; 21 } 22 23 }
这里主要用到CreateMailslot函数,函数声明如下:
标签:name,Mailslot,Windows,句柄,间通信,mailslot,消息,创建,进程 From: https://www.cnblogs.com/zhaotianff/p/18146217