Windows 共享内存实现进程间通讯

Windows共享内存

windows
使用 CreateFileMappingW , MapViewOfFile 函数实现共享内存的创建和挂载。
使用了 CreateEvent , CreateMutex 函数实现进程间的互斥通讯


创建共享内存 CreateFileMapping

具体介绍: MSDN CreateFileMappingW

具体介绍可以看上方的官方文档这里不过多赘述,不过有一点需要提一下。
CreateFileMapping函数有两种

1.CreateFileMappingW
2.CreateFileMappingA

查了一下资料,好像只有最后一个参数不一样,一个是w_char*的宽字符类型, 一个是 char* 的类型, Windows api 的底层调用好像都是 w_char* 的,CreateFileMappingA 函数只是对字符类型做了一个转换再调用CreateFileMappingW,具体的我也没有仔细了解。

string 转 w_char*

LPCWSTR stringToLPCWSTR(const char* orig)
{
   
	size_t origsize = strlen(orig) + 1;
	const size_t newsize = 100;
	size_t convertedChars = 0;
	wchar_t* wcstring = (wchar_t*)malloc(sizeof(wchar_t) * (strlen(orig) - 1));
	mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);

	return wcstring;
}

下文参数默认为 w_char*

创建一个size大小的命名共享内存对象,名称为filename

HANDLE hMapFile = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL,
			PAGE_READWRITE, 0, size, filename);
if (m_hMapFile == nullptr)
{
   
		std::cerr << "Failed to create file mapping, error number is " << GetLastError() << std::endl;
		return false;
}

其他进程打开共享内存OpenFileMappingW

HANDLE hMapFile = OpenFileMappingW(INVALID_HANDLE_VALUE, NULL,
			PAGE_READWRITE, 0, size, filename);
if (m_hMapFile == nullptr)
{
   
		std::cerr << "Failed to create file mapping, error number is " << GetLastError() << std::endl;
		return false;
}

注意在程序使用期间 hMapFile 句柄不能关闭,否则会导致其他进程无法访问共享内存


挂载共享内存 MapViewOfFile

使用MapViewOfFile可以获取对应的共享内存指针
具体介绍: MSDN MapViewOfFile

void* startMem = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, size);
if (m_startMam == nullptr)
{
   
		std::cerr << "Failed to map view of file, error number is " << GetLastError() << std::endl;
		return false;
}


windows进程间互斥

创建互斥对象 CreateMutex

具体介绍: MSDN CreateMutex
创建一个名为lockname的命名锁对象

HANDLE pMutex = CreateMutexW(NULL, FALSE, lockname);
if (m_pMutex == nullptr)
{
   
	std::cerr << "CreateMutex:> Error number is " << GetLastError() << std::endl;
	return nullptr;
}

打开互斥锁对象 OpenMutex

HANDLE pMutex = OpenMutexW(NULL, FALSE, lockname);
if (m_pMutex == nullptr)
{
   
	std::cerr << "CreateMutex:> Error number is " << GetLastError() << std::endl;
	return nullptr;
}

加锁 WaitForSingleObject

等待某个事件的发生,这里用来等待并拿取互斥锁的权限
具体介绍: MSDN WaitForSingleObject

WaitForSingleObject(pMutex, INFINITE);

INFINITE表示无限等待时长


解锁 ReleaseMutex

调用进程释放互斥对象的所有权
具体介绍:

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值