以下我的实现:
32位程序创建共享内存
bool DMConnection::CreateSharedMemory()
{
int memory_len = 65536;
#ifdef Q_OS_WIN
// 创建共享文件句柄
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 物理文件句柄
NULL, // 默认安全级别
PAGE_READWRITE, // 可读可写
0, // 高位文件大小
memory_len, // 低位文件大小
L"DMShareMemory" // 共享内存名称
);
// 映射缓存区视图 , 得到指向文件映射视图的指针
pSHM = (struct MemoryCmd *)MapViewOfFile(
hMapFile, // 共享内存的句柄
FILE_MAP_ALL_ACCESS, // 可读写许可
0,
0,
memory_len
);
memset(pSHM, 0, memory_len);
#else
int SID;
if((SID = shmget(keySHM, memory_len, 0666 | IPC_CREAT | IPC_SHARE32)) == -1)
{
if((SID = shmget(keySHM, 0, 0666 | IPC_CREAT | IPC_SHARE32)) == -1)
{
fprintf(stderr, "shmget fail!\n");
return false;
}
if(shmctl(SID, IPC_RMID, NULL) == -1)
{
fprintf(stderr, "shmget fail!\n");
return false;
}
if((SID = shmget(keySHM, memory_len, 0666 | IPC_CREAT | IPC_SHARE32)) == -1)
{
fprintf(stderr, "shmget fail!\n");
return false;
}
}
if((pSHM = (struct MemoryCmd *)shmat(SID, 0, 0)) == (char *) - 1)
{
fprintf(stderr, "shmat fail!\n");
pSHM = NULL;
return false;
}
memset(pSHM, 0, memory_len);
#endif
return true;
}
{
int memory_len = 65536;
#ifdef Q_OS_WIN
// 创建共享文件句柄
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 物理文件句柄
NULL, // 默认安全级别
PAGE_READWRITE, // 可读可写
0, // 高位文件大小
memory_len, // 低位文件大小
L"DMShareMemory" // 共享内存名称
);
// 映射缓存区视图 , 得到指向文件映射视图的指针
pSHM = (struct MemoryCmd *)MapViewOfFile(
hMapFile, // 共享内存的句柄
FILE_MAP_ALL_ACCESS, // 可读写许可
0,
0,
memory_len
);
memset(pSHM, 0, memory_len);
#else
int SID;
if((SID = shmget(keySHM, memory_len, 0666 | IPC_CREAT | IPC_SHARE32)) == -1)
{
if((SID = shmget(keySHM, 0, 0666 | IPC_CREAT | IPC_SHARE32)) == -1)
{
fprintf(stderr, "shmget fail!\n");
return false;
}
if(shmctl(SID, IPC_RMID, NULL) == -1)
{
fprintf(stderr, "shmget fail!\n");
return false;
}
if((SID = shmget(keySHM, memory_len, 0666 | IPC_CREAT | IPC_SHARE32)) == -1)
{
fprintf(stderr, "shmget fail!\n");
return false;
}
}
if((pSHM = (struct MemoryCmd *)shmat(SID, 0, 0)) == (char *) - 1)
{
fprintf(stderr, "shmat fail!\n");
pSHM = NULL;
return false;
}
memset(pSHM, 0, memory_len);
#endif
return true;
}
64位程序访问共享内存
bool InitMemory()
{
int memory_len = 65536;
#ifdef Q_OS_WIN
// 打开共享的文件对象
hMapFile = OpenFileMappingA(FILE_MAP_ALL_ACCESS, NULL, L"DMShareMemory");
if(hMapFile)
{
pSHM = (struct MemoryCmd *)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
}
else
{
// 打开文件映射句柄失败
printf("打开文件映射句柄失败");
return false;
}
#else
pSHM = NULL;
keySHM = 0xfff01;
int shmid;
if((shmid = shmget(keySHM, memory_len, IPC_SHARE32)) == -1) //0600
{
printf("shmget Fail \n");
return false;
}
pSHM = (struct MemoryCmd *)shmat(shmid, NULL, 0);
#endif
pSHM->connect = 1;
return true;
}
{
int memory_len = 65536;
#ifdef Q_OS_WIN
// 打开共享的文件对象
hMapFile = OpenFileMappingA(FILE_MAP_ALL_ACCESS, NULL, L"DMShareMemory");
if(hMapFile)
{
pSHM = (struct MemoryCmd *)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
}
else
{
// 打开文件映射句柄失败
printf("打开文件映射句柄失败");
return false;
}
#else
pSHM = NULL;
keySHM = 0xfff01;
int shmid;
if((shmid = shmget(keySHM, memory_len, IPC_SHARE32)) == -1) //0600
{
printf("shmget Fail \n");
return false;
}
pSHM = (struct MemoryCmd *)shmat(shmid, NULL, 0);
#endif
pSHM->connect = 1;
return true;
}