Windows核心编程之邮槽实现进程间通信

2023-05-16

    邮槽是Windows系统提供的一种单向通信的机制。即进程中的一方只能写入或读取数据,而另一方则只能读取或写入数据。通过邮槽,用户可以实现一对多或跨网络的进程之间的通信。但是,邮槽能传输的数据非常小,一般在400KB左右。如果用户操作的数据过大,可能会导致邮槽不能正常工作。

1.创建邮槽

    用户在实际编程时,可以使用Windows邮槽实现进程间通信。但是用户必须首先创建邮槽。在Windows系统中,用户可以通过函数CreateMailslot函数创建邮槽。函数原型如下:

HANDLE CreateMailslotW(
    LPCWSTR lpName,
    DWORD nMaxMessageSize,
    DWORD lReadTimeout,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );
    该函数的作用是创建邮槽并返回该邮槽的句柄。如果函数调用成功,将返回创建邮槽的句柄。否则,函数将返回INVALID_HANDLE_VALUE,表示邮槽创建失败,参数说明如下:

    参数lpName表示邮槽的名称。邮槽名称的格式为“\\.\mailslot\name”。其中,name表示邮槽的名称。用户在c++开发环境中,应该将其指定为“\\\\.\\mailslot\\name”。如果用户在不同的主机上运行程序,则需要把名称字符串中的“.”换成对方主机名称。

    参数nMaxMessageSize 指定将通过邮槽发送或接收的消息的最大值,在实际编程中,一般将其设置为0,表示消息的大小为任意值。

    参数lReadTimeout表示程序读取操作的超时时间。如果该参数值为0,则当邮槽中没有任何消息时,该函数将立即返回。如果该函数值为MAILSLOT_WAIT_FOREVER,则表示该函数将等待,直到邮槽中有消息函数才返回。

    参数lpSecurityAttributes是指向结构体LPSECURITY_ATTRIBUTES的指针,表示邮槽的安全属性,一般情况下,将其设置为NULL,表示默认安全属性。

    一般情况下,函数CreateMailslot常被用于进程通信的服务方,客户端方使用CreateFile函数打开指定的邮槽,再进行相关操作。

2.操作邮槽

     用户对邮槽进行操作包括将数据写入邮槽和从邮槽中读取数据等。在实际编程时,操作邮槽和操作文件一样,都是通过调用函数ReadFile()和WriteFile()进行读写操作。函数原型如下:

BOOL ReadFile(
    HANDLE hFile,
    LPVOID lpBuffer,
   nNumberOfBytesToRead,
   LPDWORD lpNumberOfBytesRead,
    LPOVERLAPPED lpOverlapped
    );
BOOL WriteFile(
    HANDLE hFile,
    LPCVOID lpBuffer,
    DWORD nNumberOfBytesToWrite,
    LPDWORD lpNumberOfBytesWritten,
    LPOVERLAPPED lpOverlapped
    );

3.邮槽实例

服务端:

#include "stdafx.h"
#include <iostream>
#include <windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE mail;												//定义邮槽句柄
	//创建邮槽
	mail=CreateMailslot("\\\\.\\mailslot\\my",0,MAILSLOT_WAIT_FOREVER,NULL);

	if(mail==INVALID_HANDLE_VALUE)								//判断邮槽句柄
	{
		cout<<"创建邮槽失败!\r\n";								//提示信息
		return 0;
	}
	else
	{
		cout<<"创建邮槽成功,正在读取数据……!\r\n";
		char text[200];												//定义字符数组
		DWORD readtext;												//获取实际读取值
		while(1)
		{

			if(ReadFile(mail,text,200,&readtext,NULL))					//读取数据
			{
				cout<<text<<endl;												//显示数据
			}
		}
	}
	Sleep(100000);
	CloseHandle(mail);
	return 0;
}

客户端:

#include "stdafx.h"
#include <iostream>
#include <windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE mail2;												//定义邮槽句柄
	char text[]="您好,this is a message";						//初始化消息
	DWORD writetext;											//获取实际发送值
	mail2=CreateFile("\\\\.\\mailslot\\my",GENERIC_WRITE,FILE_SHARE_READ,
		NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	//打开文件
	if(INVALID_HANDLE_VALUE==mail2)	
	{
		cout<<"邮槽打开失败!\r\n";
	}
	else
	{		 
		if(WriteFile(mail2,text,sizeof(text),&writetext,NULL))	//写入数据
		{
			Sleep(1000);
			cout<<"数据写入成功\r\n";								//数据写入成功
		}
		else
		{
			cout<<"数据写入失败\r\n";
		}
		CloseHandle(mail2);											//关闭句柄
	}
	Sleep(10000);
	return 0;
}











本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows核心编程之邮槽实现进程间通信 的相关文章

  • 在 Python 中窗口“失焦”时读取 HID 输入

    我在一个问题上苦苦挣扎了好几天 但无法让它发挥作用 我刚刚开始使用 python 现在已经面临着我在这个项目中将面临的最大问题 情况是这样的 我必须编写一个扫描条形码的程序 将其传达给在线服务并打印 PDF 这一切都很好 但我也想在窗口 失
  • 将.exe文件嵌入到C++程序中?

    我编写了一个 C 程序 我想在其中执行第二个程序 这是一个 exe 文件 问题是我想将我的程序作为一个文件共享给其他人 当我在互联网上搜索时 我找到了这个解决方案 只需将第二个 exe 文件作为二进制资源存储在主文件中 exe 在编译时使用
  • 如何使用 C# 更改 Windows 配色方案?

    如何使用 C 以编程方式更改配色方案 我想将配色方案更改为 Windows Vista Basic 或 Windows 7 Basic 我怎样才能做到这一点 谢谢 尼基尔 您可以使用 SetSystemVisualStyle 方法更改系统的
  • Directory.CreateDirectory 延迟问题?

    我正在尝试创建一个远程目录 然后向其中写入一个文件 每隔一段时间 应用程序就会在尝试写入文件时失败并出现 System IO DirectoryNotFoundException 当我写入文件时 我使用返回的 DirectoryInfo 对
  • 强制窗口在打开时获得焦点

    我有一个 WPF 应用程序 它通过套接字连接与 C MFC 应用程序进行通信 如果用户按下 C 应用程序中的特定按钮 则会显示一个新的 WPF 窗口 以下是调用以启动 WPF 窗口的代码 var window new Window wind
  • 在新窗口中打开 SAS 程序

    目前 当您在 Windows 中双击 SAS 文件时 它将在您已打开的现有 SAS 会话中打开它 有没有办法让它在窗口中单击时会启动一个新的 SAS 窗口 据我所知 SAS 是一个所谓的 单实例 应用程序 因此它的默认行为是在现有会话中打开
  • 如何通过 DOS 批处理命令发送电子邮件?

    我在 DOS 中有一个批处理文件 可以进行一些检查 完成后我需要发送一封电子邮件 我在 interwebz 上找到了一些解决方案 但大多数都是第三方的 或者只是在 Outlook 中打开新邮件 我需要命令来发送完整的电子邮件 而无需任何人工
  • Python 可执行文件:py2exe 还是 PyInstaller?

    要创建可执行文件 Windows 我假设我们应该使用其中之一 Py2exe 或 PyInstaller 它们之间有什么区别 Py2exe 和 PyInstaller 都是包装器 但我注意到以下几点差异 Py2exe 与 python2 4
  • NtDll 真的导出 C 运行时函数吗?我可以在我的应用程序中使用这些函数吗?

    我在查看 Windows 10 计算机上的 NtDll 导出表 发现它导出标准 C 运行时函数 例如memcpy sprintf strlen etc 这是否意味着我可以在运行时动态调用它们LoadLibrary and GetProcAd
  • 如何更改选项卡控件的名称

    我在 C WinForms 应用程序中使用选项卡控件 我想更改选项卡的标题 默认情况下它们是 tabPage1 tabPage2 等 一种无需代码即可实现的懒惰方法 选择选项卡控件 Go to properties use F4 to do
  • Windows7上python3.5无法安装BeautifulSoup4

    我已经从下载了 beautifulsoup4 4 5 3 tar gzhttps www crummy com software BeautifulSoup bs4 download 4 5 https www crummy com sof
  • 如何从任何进程关闭 Windows 上的套接字(ipv4 和 ipv6)连接?

    如何在 Windows 上关闭 tcp v4 和 tcp v6 连接 我不想终止具有开放连接的整个进程 因为这显然会将其他人踢出该进程 我需要从一个单独的进程执行此操作 因此无法访问套接字句柄等 我正在使用 Windows API 来获取
  • 在OpenCV中将YUV转换为BGR或RGB

    我有一个电视采集卡 其输入内容为 YUV 格式 我在这里看到了与此问题类似的其他帖子 并尝试尝试所述的所有可能的方法 但它们都没有提供清晰的图像 目前最好的结果是 OpenCVcvCvtColor scr dst CV YUV2BGR 函数
  • 以编程方式最小化/恢复窗口,跳过动画效果

    我需要对窗口列表执行多项操作 最小化其中一些 恢复其他 以便立即在两组或多组窗口之间切换 这样做的问题是最小化和恢复窗口时可以看到的动画 整个过程看起来很糟糕 所有这些动画都进进出出 上下移动 但是 我无法禁用这些动画 因为这是针对其他计算
  • python+win32:检测窗口拖动

    有没有办法检测何时使用 python pywin32 在窗口中拖动不属于我的应用程序的窗口 我想对其进行设置 以便当我拖动标题与桌面边缘附近的图案匹配的窗口时 当松开鼠标时它会捕捉到边缘 我可以编写代码 以便在释放鼠标时将所有具有该标题的窗
  • 由于图形处理单元配置,不支持 Windows Phone 模拟器(Mac 上的 Windows 7)

    启动 Windows Phone 模拟器时出现错误 不支持 Windows Phone 模拟器 因为您的计算机没有所需的图形处理单元配置 如果没有图形处理单元 XNA 框架页面将无法运行 您想继续启动模拟器吗 当我尝试访问网页 任何网页 时
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • 设置 Form.KeyPreview = true 的缺点?

    我想知道 Form KeyPreview 属性实际上有什么用处 它为什么存在以及将其设置为 true 会带来什么 风险 我想它一定有some负面影响 否则它根本不应该存在 或者至少默认情况下是正确的 EDIT 我很清楚what确实如此 我问
  • Vim 在 Mingw 上表现异常

    我在 MinGW 4 6 2 上的 Vim 表现得很奇怪 例如 在插入模式下按 Backspace 会删除字符 但我必须用箭头键移动光标才能删除的字符消失 而且它也会使我退出插入模式 另一个例子 按 Del 删除字符有时会生成奇怪的字符 例
  • 如何使用来自 Microsoft-Windows-NDIS-PacketCapture 提供程序的实时 ETW 事件?

    更大的问题是一般如何使用实时 ETW 网络堆栈事件 但我特别感兴趣Microsoft Windows NDIS PacketCapture 提供程序 所有其他网络堆栈提供程序都部分工作 但 NDIS PacketCapture NDIS P

随机推荐

  • 【Hexo】Hexo个人博客绑定域名

    Hexo个人博客绑定域名 当我们在用hexo搭建了个人博客之后 xff0c 用username github io访问难免有些奇怪 xff0c 下面就花3分钟时间对如何绑定个人域名进行描述 我这边是在阿里云买的一个域名 xff0c ycbl
  • 生产者消费者的代码实现

    当消费者获得的数据为大写字母时 xff0c 则把大写字母转换成小写字母 xff0c 并显示 xff1b 当消费者获得的数据为小写字母时 xff0c 则把小写字母转换成大写字母 xff0c 并显示 xff1b 当消费者获得的数据为字符0 1
  • 基于RobHess的SIFT图像拼接知识点随笔

    1 SIFT算法具有尺度不变性在于构建的高斯尺度空间 xff1b 2 SIFT算法具有旋转不变性在于特征方向向量 xff1b 3 K d数以图像特征点的128维特征描述子均值为依据进行划分 构建 xff1b 4 特征点匹配是一个图像的所有特
  • 最小二乘法及OpenCv函数

    1 最小二乘法 我们以最简单的一元线性模型来解释最小二乘法 什么是一元线性模型呢 xff1f 监督学习中 xff0c 如果预测的变量是离散的 xff0c 我们称其为分类 xff08 如决策树 xff0c 支持向量机等 xff09 xff0c
  • Linux服务器网络不通情况分析以及常见检查方法

    在实际运维过程中 xff0c 经常会遇到网路不通的问题 xff0c 一般此类网络不通的问题都是业务端到端的排查 本文从后端linux服务器端自查是否服务器问题 通过多年的运维经验总结 xff0c 服务器端问题导致网络不通 xff0c 大致分
  • RANSAC算法实现去除误匹配并计算拼接矩阵-随笔

    1 RANSAC算法实现去除误匹配并计算拼接矩阵流程 1 从样本集中随机抽选一个RANSAC样本 xff0c 即4个匹配点对 xff08 至少4个匹配点对 xff0c 才能计算出3 3变换矩阵 xff09 xff1b 2 计算当错误概率为0
  • linux c++ 服务器端开发面试必看书籍

    由于很多朋友希望加入到Linux c 43 43 服务器端开发的队伍中 xff0c 本人就结合自己的面试经历并整理了自己阅读的相关书籍 xff0c 同大家分享 xff0c 一起进步 人个认为以下是进入这个方向的必看书籍 xff0c 各系列难
  • C++进阶—>const、define和enum的区别和用途

    1 区别 这三种都可以定义常量 define是宏定义 xff0c 编译器不对其进行错误检查 xff0c 在预编译阶段处理 xff0c 没有作用域限制属于全局常量 xff0c 在程序中编译器会对定义的常量名以数值进行替换 xff0c 且每次替
  • MFC中基于OpenCV实现Picture Control控件成像方法

    MFC中基于OpenCV实现Picture Control控件成像方法有两种 xff0c 一种是OpenCV2 2以前版本的绘制 xff0c 另外一种是OpenCV2 2以后版本的绘制 xff08 1 xff09 在OpenCV2 2之前的
  • MFC中CFileDialog及SHBrowseForFolder

    MFC中实现通过按钮来选择文件路径或文件夹路径 xff1b xff08 1 xff09 CFileDialog类能够选择文件 xff0c 并获取其路径 xff08 当然也可以通过获取文件路径再去除文件名而获得其所在文件夹路径 xff0c 前
  • C++进阶—>带你理解多字节编码与Unicode码

    本篇文章将讲解C 43 43 开发中容易混淆的另一个概念 多字节字符集与Unicode字符集 多字节字符与宽字节字符 char与wchar t 我们知道C 43 43 基本数据类型中表示字符的有两种 xff1a char wchar t c
  • BP神经网络及其C++实现

    0 前言 神经网络在我印象中一直比较神秘 xff0c 正好最近学习了神经网络 xff0c 特别是对Bp神经网络有了比较深入的了解 xff0c 因此 xff0c 总结以下心得 xff0c 希望对后来者有所帮助 神经网络在机器学习中应用比较广泛
  • C++进阶—>Socket通信那点事

    1 网络中进程之间如何通信 xff1f 本地的进程间通信 xff08 IPC xff09 有很多种方式 xff0c 但可以总结为下面4类 xff1a 消息传递 xff08 管道 FIFO 消息队列 xff09 同步 xff08 互斥量 条件
  • C++进阶—>线程同步随笔

    线程同步主要有五种方法 xff1a 原子访问 xff0c 临界区 xff0c 信号量 xff0c 事件和互斥量 xff1b 其中原子访问和临界区属于用户模式的同步 xff1b 信号量 xff0c 事件和互斥量属于内核模式的同步 原子访问是通
  • C++进阶—>_beginthreadex和CreateThread的区别和联系

    beginthread 和 CreateThread 的区别 转自 http wenku baidu com view adede4ec4afe04a1b071dea4 html 程序员对于Windows程序中应该用 beginthread
  • idea src下源文件和class编译文件不一致

    今天遇到一个神奇BUG xff0c 一个和elasticsearch没有任何关系的项目 xff0c 报错ES某个包找不到 xff0c 刚开始以为是依赖了父项目的某个包 xff0c 并且本项目主启动类ComponentScan扫描了相关的类进
  • C++进阶—>Win32 多线程的创建方法和基本使用

    Summary From xff1a https software intel com zh cn blogs 2011 12 02 win32 cid 61 sw prccsdn2086 总结Win32提供的创建多线程相关的API接口和基
  • Windows核心编程之多进程概述

    一 进程的概念 进程是是一个正在运行的程序的实例 xff08 飘 xff5e xff5e xff5e xff09 xff0c 是系统分配资源的单位 线程是执行的单位 xff0c 包括内存 xff0c 打开的文件 处理机 外设等 xff0c
  • Windows核心编程之进程间通信

    1 进程与进程通信 进程是装入内存并准备执行的程序 xff0c 每个进程都有私有的虚拟地址空间 xff0c 由代码 数据以及它可利用的系统资源 如文件 管道等 组成 多进程 多线程是Windows操作系统的一个基本特征 Microsoft
  • Windows核心编程之邮槽实现进程间通信

    邮槽是Windows系统提供的一种单向通信的机制 即进程中的一方只能写入或读取数据 xff0c 而另一方则只能读取或写入数据 通过邮槽 xff0c 用户可以实现一对多或跨网络的进程之间的通信 但是 xff0c 邮槽能传输的数据非常小 xff