今天复习一下windows下进程间通讯的方法:共享内存,以下是简单实例
客户端:
#include <windows.h>
#include <stdio.h>
#pragma pack(1)
struct ShareData
{
int iType;
int iSize;
char strData[4096];
};
#pragma pack()
int main()
{
int iSize = sizeof(ShareData);
// 创建共享文件句柄
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 物理文件句柄
NULL, // 默认安全级别
PAGE_READWRITE, // 可读可写
0, // 高位文件大小
iSize, // 地位文件大小
"ShareMemory" // 共享内存名称
);
if(hMapFile == nullptr){
printf("share memory create fail\n");
return -1;
}
// 映射缓存区视图 , 得到指向共享内存的指针
LPVOID lpBase = MapViewOfFile(
hMapFile, // 共享内存的句柄
FILE_MAP_ALL_ACCESS, // 可读写许可
0,
0,
iSize
);
ShareData* pData = (ShareData*)lpBase;
if(pData == nullptr){
printf("map memory fail\n");
return -1;
}
pData->iType = 1;
strcpy_s(pData->strData, "client write data");
pData->iSize = strlen(pData->strData);
printf("share memory create success and write data\n");
system("pause");
// 解除文件映射
UnmapViewOfFile(lpBase);
// 关闭内存映射文件对象句柄
CloseHandle(hMapFile);
return 0;
}
服务端
int main()
{
int iSize = sizeof(ShareData);
// 创建共享文件句柄
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 物理文件句柄
NULL, // 默认安全级别
PAGE_READWRITE, // 可读可写
0, // 高位文件大小
iSize, // 地位文件大小
"ShareMemory" // 共享内存名称
);
if(hMapFile == nullptr){
printf("share memory create fail\n");
return -1;
}
// 映射缓存区视图 , 得到指向共享内存的指针
LPVOID lpBase = MapViewOfFile(
hMapFile, // 共享内存的句柄
FILE_MAP_ALL_ACCESS, // 可读写许可
0,
0,
iSize
);
ShareData* pData = (ShareData*)lpBase;
if(pData == nullptr){
printf("map memory fail\n");
return -1;
}
pData->iType = 1;
strcpy_s(pData->strData, "client write data");
pData->iSize = strlen(pData->strData);
printf("share memory create success and write data\n");
system("pause");
// 解除文件映射
UnmapViewOfFile(lpBase);
// 关闭内存映射文件对象句柄
CloseHandle(hMapFile);
return 0;
}