5,530
社区成员
发帖
与我相关
我的任务
分享
// ShareMem.dll 创建共享内存的动态库工程
// ShareMem.h
#ifndef __SHAREMEM_H__
#define __SHAREMEM_H__
#include <Windows.h>
#define EXPORT_API_DLL __declspec(dllexport)
typedef struct LIST_HEAD{
LIST_HEAD* Next;
LIST_HEAD* Prev;
}_LIST_HEAD;
typedef struct {
int nSize;
_LIST_HEAD Item;
}_MemoryBlock;
typedef struct {
int nSize;
bool bInit;
_LIST_HEAD FreeBlockList;
}_ShareMemTable;
typedef struct {
HANDLE hShareMemHandle;
_ShareMemTable *lpShareMemTable;
}_ProcessTable;
class ShareMem {
public:
EXPORT_API_DLL ShareMem();
~ShareMem() {}
protected:
unsigned short ShareMemInit();
char* CreatShareMem(unsigned int nSize);
};
#endif __SHAREMEM_H__
// ShareMem.dll 创建共享内存的动态库工程
// ShareMem.cpp
#include "ShareMem.h"
_ProcessTable *s_ProcessTable = {0};
// 开辟共享内存空间
char* ShareMem :: CreatShareMem(unsigned int nSize) {
int nResult;
char* lpMem = NULL;
s_ProcessTable->hShareMemHandle = CreateFileMapping(INVALID_HANDLE_VALUE , NULL , PAGE_READWRITE|SEC_COMMIT , 0 , nSize , (LPCWSTR)"_SHAREMEM_");
if((NULL == s_ProcessTable->hShareMemHandle) || (INVALID_HANDLE_VALUE == s_ProcessTable->hShareMemHandle)) {
cout << "Create Share Memory fail" << endl;
return 0;
}
else {
nResult = GetLastError(); // 获取创建共享内存的错误信息
lpMem = (char *)MapViewOfFile(s_ProcessTable->hShareMemHandle ,
FILE_MAP_READ | FILE_MAP_WRITE , 0 , 0 , 0);
if (nResult != ERROR_ALREADY_EXISTS) // 如果同名的共享内存不存在
{
//第一次打开共享内存,需要初始化为零
memset(lpMem , 0 , nSize);
cout << "Create Share Memory Firstly" << endl;
}
}
// 返回共享内存空间首地址
return lpMem;
}
// 初始化共享内存,将共享内存空间连接到系统表的空闲块链表上
unsigned short ShareMem :: ShareMemInit() {
unsigned int nSize;
_MemoryBlock* FreeBlock;
nSize = 10 * 1024 * 1024;
s_ProcessTable = new _ProcessTable();
s_ProcessTable->lpShareMemTable = (_ShareMemTable *)CreatShareMem(nSize);
if (s_ProcessTable->lpShareMemTable) {
// 判断lpShareMemTable是否初始化过
if (! s_ProcessTable->lpShareMemTable->bInit) {
s_ProcessTable->lpShareMemTable->bInit = true;
// 将除去_ShareMemTable结构后剩下的共享内存大小作为一个空闲块连接到s_ProcessTable->lpShareMemTable->FreeBlockList下
FreeBlock = (_MemoryBlock*)(s_ProcessTable->lpShareMemTable + sizeof(_ShareMemTable));
s_ProcessTable->lpShareMemTable->nSize = nSize - sizeof(_ShareMemTable);
FreeBlock->nSize = nSize - sizeof(_ShareMemTable);
// 将空闲块链表形成双向循环链表
//*** 第一个进程启动后单步观察下列语句执行完后成功形成双向循环链表,
//但是后面的进程因为共享内存以创建完毕并完成初始化,
//因此不用执行下列语句,单步观察后面的进程FreeBlockList并没有形成双向循环。
s_ProcessTable->lpShareMemTable->FreeBlockList.Next = &FreeBlock->Item;
s_ProcessTable->lpShareMemTable->FreeBlockList.Prev = &FreeBlock->Item;
FreeBlock->Item.Next = &s_ProcessTable->lpShareMemTable->FreeBlockList;
FreeBlock->Item.Prev = &s_ProcessTable->lpShareMemTable->FreeBlockList;
}
return 1;
}
return 0;
}
ShareMem :: ShareMem () {
ShareMemInit();
}
ShareMem *lpShareMem;
lpShareMem = new ShareMem();