`
shangjava
  • 浏览: 1229179 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一个完整的共享內存类

阅读更多

/******************************************************************
++ File Name: FFMClass.h
++ Description:共享內存類
---------------------------------------------------------------
++ Author:Fei ZhaoDong
++ Create time:2004/3/25 上午 10:00:00
++ Version: 1.1
++ Modifier:
++Activities:
++ Update List:2004/3/30 下午 02:59:45
*******************************************************************/

// FFMClass.h: interface for the CFFMClass.
//
//////////////////////////////////////////////////////////////////////

#ifndef FZD_FFMCLASS_H
#define FZD_FFMCLASS_H

#include <aclapi.h>

//////////////////////////////////////////////////////////////////////
// Macro definition

// 以下為共享內存定義

#defineDEFAULT_FILENAMENULL// 默認的文件名
#defineDEFAULT_MAPNAME"_FZD_MAP_"// 默認的共享內存名
#defineDEFAULT_MAPSIZE(0xFFFF + 1)// 默認的共享內存大小

constDWORD NETRGUSER_CFM_CODE = 0x1211DBFF;// 校驗碼, 用於命令數據
constDWORD NETRGUSER_CMD_NONE = 0;// 初始化指令碼, 無指令

// 以下為錯誤碼定義

#define ERROR_LEN256// 錯誤描述長度

#define ERROR_INVALID_CMDCODE0xE00001FF// 已經存在完全一樣的共享內存
#define ERROR_NO_MAPFILE0xE00002FF// 未分配共享內存文件
#define ERROR_INVALID_CFMCODE0xE00003FF// 校驗碼不匹配

//////////////////////////////////////////////////////////////////////
// 內存文件格式定義

#pragma pack(1)

// 用於存儲命令數據的內存文件格式
typedef struct _tagDATA_HEADER
{
DWORD dwConfirmCode;// 校驗碼
DWORD nCommandCode;// 指令識別碼
DWORD dwDataSize;// 數據的大小

BYTE dwReserved[19];// 保留
BYTE bInfo[1];// 數據起始地址

_tagDATA_HEADER()
{
dwConfirmCode = NETRGUSER_CFM_CODE;
nCommandCode = NETRGUSER_CMD_NONE;
dwDataSize = 0;

ZeroMemory(dwReserved, 19);
ZeroMemory(bInfo, 1);
}
}DATA_HEADER, *LPDATA_HEADER;

typedefDWORD (WINAPI *PSetEntriesInAcl)(ULONG, PEXPLICIT_ACCESS, PACL, PACL*);

// 用於存儲應答數據的共享內存文件格式 (暫不用)
typedef struct _tagANS_HEADER
{
}ANS_HEADER, *LPANS_HEADER;

#pragma pack()

//////////////////////////////////////////////////////////////////////
// 類定義,共享內存服務端
class CFFMServer
{
public:
CFFMServer();
virtual ~CFFMServer();
CFFMServer(char *szFileName, char *szMapName, DWORD dwSize);

protected:
PSetEntriesInAclm_fnpSetEntriesInAcl;
HANDLEm_hFile;// 映射文件句柄
HANDLEm_hFileMap;// 內存文件句柄
LPVOIDm_lpFileMapBuffer;// 緩衝區指針

char*m_pFileName;// 映射文件名
char*m_pMapName;// 內存文件名
DWORDm_dwSize;// 緩衝區大小

BOOLm_bCreateFlag;// 是否已創建共享內存
DWORD m_dwLastError;// 錯誤代碼

private:
void _Init();// 初始化參數
BOOL _IsWinNTLater();// 判斷當前操作系統

public:
BOOL Create(char *szFileName = DEFAULT_FILENAME,
char *szMapName = DEFAULT_MAPNAME,
DWORD dwSize = DEFAULT_MAPSIZE);// 新建共享內存
LPVOID GetBuffer();// 獲取內存文件指針
DWORD GetSize();// 獲取內存文件大小
void Destory();// 銷毀已有的共享內存

BOOL WriteCmdData(// 寫入命令數據
DWORD nCommandCode,
DWORD dwDataSize,
const LPVOID pBuf);
};

//////////////////////////////////////////////////////////////////////
// 類定義,共享內存客戶端
class CFFMClient
{
public:
CFFMClient();
virtual ~CFFMClient();
CFFMClient(DWORD dwAccess, char *szMapName, DWORD dwSize);

protected:
HANDLEm_hFileMap;// 內存文件句柄
LPVOIDm_lpFileMapBuffer;// 內存文件指針
char*m_pMapName;// 內存文件名

BOOLm_bOpenFlag;// 是否已經打開了一個內存文件
DWORD m_dwLastError;// 錯誤代碼

private:
void _Init();// 初始化參數

public:
BOOL Open(DWORD dwAccess = FILE_MAP_READ,
char *szMapName = DEFAULT_MAPNAME,
DWORD dwSize = 0);// 打開一個內存文件
LPVOID GetBuffer();// 獲取當前內存文件的指針
void Destory();// 關閉當前對內存文件的訪問

BOOL GetCmdDataSize(DWORD *pDataSize);// 讀取命令數據大小
BOOL ReadCmdData(// 讀取命令數據
DWORD dwCommandCode,
DWORD dwBufSize,
LPVOIDpOutBuf);
};

#endif // FZD_FFMCLASS_H

/******************************************************************
++ File Name:FFMClass.cpp
++ Description:共享內存類
---------------------------------------------------------------
++ Author:Fei ZhaoDong
++ Create time:2004/3/25 上午 10:00:00
++ Version: 1.0
++ Modifier:
++ Activities:
++ Update List:2004/3/29 下午 02:59:45
*******************************************************************/

// FFMClass.cpp: implementation of the CFFMClass.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "FFMClass.h"
#include <aclapi.h>

//////////////////////////////////////////////////////////////////////
// CFFMServer
//////////////////////////////////////////////////////////////////////

CFFMServer::CFFMServer()
{
m_dwLastError = 0;
m_fnpSetEntriesInAcl = NULL;
_Init();
}

CFFMServer::~CFFMServer()
{
Destory();
}

CFFMServer::CFFMServer(char *szFileName, char *szMapName, DWORD dwSize)
{
// 以自定義設置創建共享內存塊
_Init();
Create(szFileName, szMapName, dwSize);
}

// 初始化各個參數
void CFFMServer::_Init()
{
m_hFile = NULL;
m_hFileMap = NULL;
m_lpFileMapBuffer = NULL;

m_pFileName = NULL;
m_pMapName = NULL;
m_dwSize = 0;

m_bCreateFlag = FALSE;
}

// 判斷是否NT4.0以上操作系統
BOOL CFFMServer::_IsWinNTLater()
{
OSVERSIONINFO Ver;
BOOL bAbleVersion = FALSE;
Ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

if (GetVersionEx(&Ver))
{
if (Ver.dwPlatformId == VER_PLATFORM_WIN32_NT
&& Ver.dwMajorVersion >= 4)
{
bAbleVersion = TRUE;
}
}
else
{
m_dwLastError = GetLastError();
}

return bAbleVersion;
}

// 釋放當前共享內存,並重新初始化參數
void CFFMServer::Destory()
{
if (m_lpFileMapBuffer != NULL)
{
UnmapViewOfFile(m_lpFileMapBuffer);
m_lpFileMapBuffer = NULL;
}

if (m_hFileMap != NULL)
{
CloseHandle(m_hFileMap);
m_hFileMap = NULL;
}

if (m_hFile && m_hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(m_hFile);
m_hFile = NULL;
}

if (m_pFileName != NULL)
{
free(m_pFileName);
m_pFileName = NULL;
}

if (m_pMapName != NULL)
{
free(m_pMapName);
m_pMapName = NULL;
}

_Init();
}


// 創建共享內存塊
BOOL CFFMServer::Create(char *szFileName, char *szMapName, DWORD dwSize)
{
// 釋放已有的共享內存塊
if (m_bCreateFlag)
{
Destory();
}

// 拷貝各個參數
if (szFileName)
{
m_pFileName = _strdup(szFileName);
}

if (szMapName)
{
m_pMapName = _strdup(szMapName);
}
else
{
m_pMapName = _strdup(DEFAULT_MAPNAME);
}

if (dwSize > 0)
{
m_dwSize = dwSize;
}
else
{
m_dwSize = DEFAULT_MAPSIZE;
}

// 以下創建共享內存
if (m_pFileName)
{
m_hFile = CreateFile(
m_pFileName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
}
else
{
// 默認情況下,在頁面文件中創建共享內存
m_hFile = INVALID_HANDLE_VALUE;
}

if (_IsWinNTLater())
{
// Set DACL

const int NUM_ACES = 2;// number if ACEs int DACL
// evryone -- read
// creator -- full access

// 初始化參數
PSID pEveryoneSID = NULL; // everyone群組SID
PSID pCreatorSID = NULL; // creator群組SID
PACL pFileMapACL = NULL; // 準備新內存文件的DACL
PSECURITY_DESCRIPTOR pSD = NULL; // 內存文件的SD
SECURITY_ATTRIBUTES saFileMap; // 內存文件的SA
EXPLICIT_ACCESS ea[NUM_ACES]; // 外部訪問結構

BOOL bHasErr= FALSE; // 返回值

// 以下創建SID
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthCreator = SECURITY_CREATOR_SID_AUTHORITY;

// Evryone
if (!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0, &pEveryoneSID))
{
bHasErr = TRUE;
goto Finish;
}

// Creator
if (!AllocateAndInitializeSid(&SIDAuthCreator, 1, SECURITY_CREATOR_OWNER_RID,
0, 0, 0, 0, 0, 0, 0, &pCreatorSID))
{
bHasErr = TRUE;
goto Finish;
}

// 填充ACE
ZeroMemory(&ea, NUM_ACES * sizeof(EXPLICIT_ACCESS));

// S-1-1-0 evryone, 唯讀權限
ea[0].grfAccessPermissions = GENERIC_READ | GENERIC_WRITE;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance= NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;

// S-1-3-0 creator owner, 完全權限
ea[1].grfAccessPermissions = STANDARD_RIGHTS_ALL;
ea[1].grfAccessMode = SET_ACCESS;
ea[1].grfInheritance= NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[1].Trustee.ptstrName = (LPTSTR) pCreatorSID;

// 創建並填充ACL
if(NULL == m_fnpSetEntriesInAcl)
{
HINSTANCEhLib = ::LoadLibrary("Advapi32.dll");
if(NULL != hLib)
{
m_fnpSetEntriesInAcl = (PSetEntriesInAcl)GetProcAddress(hLib,"SetEntriesInAclA");
::FreeLibrary(hLib);
hLib = NULL;
}

}
if (ERROR_SUCCESS != m_fnpSetEntriesInAcl(NUM_ACES, ea, NULL, &pFileMapACL))
{
bHasErr = TRUE;
goto Finish;
}

// 創建並初始化SD
pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
if (NULL == pSD)
{
bHasErr = TRUE;
goto Finish;
}
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
{
bHasErr = TRUE;
goto Finish;
}

// 添加ACL到SD中去
if (!SetSecurityDescriptorDacl(pSD,
TRUE, // fDaclPresent flag
pFileMapACL,
FALSE)) // not a default DACL
{
bHasErr = TRUE;
goto Finish;
}

// 設置SA
saFileMap.nLength = sizeof(SECURITY_ATTRIBUTES);
saFileMap.bInheritHandle = FALSE;
saFileMap.lpSecurityDescriptor = pSD;

// 創建共享內存文件
if (m_hFile != NULL)
{
m_hFileMap = CreateFileMapping(
m_hFile,
&saFileMap,
PAGE_READWRITE,
0,
m_dwSize,
m_pMapName);
if (NULL == m_hFileMap)
{
m_hFileMap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,
TRUE, m_pMapName);
if (NULL == m_hFileMap)
{
m_dwLastError = GetLastError();
Destory();
goto Finish;
}
}
}

Finish:
if (pSD != NULL)
{
LocalFree(pSD);
}
if (pFileMapACL != NULL)
{
LocalFree(pFileMapACL);
}
if (pEveryoneSID != NULL)
{
FreeSid(pEveryoneSID);
}
if (pCreatorSID != NULL)
{
FreeSid(pCreatorSID);
}

if (bHasErr)
{
m_dwLastError = GetLastError();
return FALSE;
}
}
else
{
// 創建共享內存文件
if (m_hFile)
{
m_hFileMap = CreateFileMapping(
m_hFile,
NULL,
PAGE_READWRITE,
0,
m_dwSize,
m_pMapName);
if (NULL == m_hFileMap)
{
m_dwLastError = GetLastError();
Destory();
return FALSE;
}
}
}

// 映射文件指針到用戶
if (m_hFileMap)
{
m_lpFileMapBuffer = MapViewOfFile(
m_hFileMap,
FILE_MAP_ALL_ACCESS,
0,
0,
m_dwSize);
if (NULL == m_lpFileMapBuffer)
{
m_dwLastError = GetLastError();
Destory();
return FALSE;
}
}

m_bCreateFlag = TRUE;
return TRUE;
}

// 獲取內存文件指針
LPVOID CFFMServer::GetBuffer()
{
return (m_lpFileMapBuffer)?(m_lpFileMapBuffer):(NULL);
}

// 獲取內存文件大小
DWORD CFFMServer::GetSize()
{
return m_dwSize;
}

BOOL CFFMServer::WriteCmdData(DWORD nCommandCode, DWORD dwDataSize, const LPVOID pBuf)
{
// 檢驗數據的合理性
if (NULL == GetBuffer())
{
m_dwLastError = ERROR_NO_MAPFILE;
SetLastError(ERROR_NO_MAPFILE);
return FALSE;
}
if (NETRGUSER_CMD_NONE == nCommandCode)
{
m_dwLastError = ERROR_INVALID_CMDCODE;
SetLastError(ERROR_INVALID_CMDCODE);
return FALSE;
}
if (dwDataSize > 0 && pBuf == NULL)
{
m_dwLastError = ERROR_INVALID_USER_BUFFER;
SetLastError(ERROR_INVALID_USER_BUFFER);
return FALSE;
}
if (dwDataSize + sizeof(DATA_HEADER) > GetSize())
{
m_dwLastError = ERROR_BUFFER_OVERFLOW;
SetLastError(ERROR_BUFFER_OVERFLOW);
return FALSE;
}

// 填寫數據結構

// 文件頭
DATA_HEADER dataHeader;
dataHeader.nCommandCode = nCommandCode;
dataHeader.dwDataSize = dwDataSize;
ZeroMemory(GetBuffer(), GetSize());
memcpy(GetBuffer(), &dataHeader, sizeof(DATA_HEADER));

// 數據塊
LPDATA_HEADER pData = (LPDATA_HEADER)GetBuffer();
memcpy(pData->bInfo, pBuf, dwDataSize);

return TRUE;
}

//////////////////////////////////////////////////////////////////////
// CFFMClient
//////////////////////////////////////////////////////////////////////

CFFMClient::CFFMClient()
{
m_dwLastError = 0;
_Init();
}

CFFMClient::~CFFMClient()
{
Destory();
}

CFFMClient::CFFMClient(DWORD dwAccess, char *szMapName, DWORD dwSize)
{
_Init();

if (!Open(dwAccess, szMapName, dwSize))
{
Destory();
}
}

// 初始化參數
void CFFMClient::_Init()
{
m_hFileMap = NULL;
m_lpFileMapBuffer = NULL;

m_pMapName = NULL;

m_bOpenFlag = FALSE;
}

// 關閉當前對內存文件的訪問
void CFFMClient::Destory()
{
if (m_lpFileMapBuffer)
{
UnmapViewOfFile(m_lpFileMapBuffer);
m_lpFileMapBuffer = NULL;
}

if (m_hFileMap)
{
CloseHandle(m_hFileMap);
m_hFileMap = NULL;
}

if (m_pMapName)
{
free(m_pMapName);
m_pMapName = NULL;
}

_Init();
}

// 打開一個內存文件
BOOL CFFMClient::Open(DWORD dwAccess, char *szMapName, DWORD dwSize)
{
if (m_bOpenFlag)
{
Destory();
}

if (szMapName != NULL)
{
m_pMapName = _strdup(szMapName);
}
else
{
m_pMapName = _strdup(DEFAULT_MAPNAME);
}

m_hFileMap = OpenFileMapping(dwAccess, TRUE, m_pMapName);
if (NULL == m_hFileMap)
{
m_dwLastError = GetLastError();

Destory();
return FALSE;
}

m_lpFileMapBuffer = MapViewOfFile(m_hFileMap, dwAccess, 0, 0, dwSize);
if (NULL == m_lpFileMapBuffer)
{
m_dwLastError = GetLastError();

Destory();
return FALSE;
}

m_bOpenFlag = TRUE;
return TRUE;
}

// 獲取當前內存文件的指針
LPVOID CFFMClient::GetBuffer()
{
return (m_lpFileMapBuffer)?(m_lpFileMapBuffer):(NULL);
}

// 讀取命令數據大小
BOOL CFFMClient::GetCmdDataSize(DWORD *pDataSize)
{
ASSERT(pDataSize != NULL);
*pDataSize = 0;

LPDATA_HEADER pHeader = (LPDATA_HEADER)GetBuffer();
if (NULL == pHeader)
{
m_dwLastError = ERROR_NO_MAPFILE;
SetLastError(ERROR_NO_MAPFILE);
return FALSE;
}
if (NETRGUSER_CFM_CODE != pHeader->dwConfirmCode)
{
m_dwLastError = ERROR_INVALID_CFMCODE;
SetLastError(ERROR_INVALID_CFMCODE);
return FALSE;
}
if (NETRGUSER_CMD_NONE == pHeader->nCommandCode)
{
m_dwLastError = ERROR_INVALID_CMDCODE;
SetLastError(ERROR_INVALID_CMDCODE);
return FALSE;
}

*pDataSize = pHeader->dwDataSize;
return TRUE;
}

// 讀取命令數據
BOOL CFFMClient::ReadCmdData(DWORD dwCommandCode, DWORD dwBufSize, LPVOID pOutBuf)
{
ASSERT (pOutBuf != NULL);

LPDATA_HEADER pHeader = (LPDATA_HEADER)GetBuffer();
if (NULL == pHeader)
{
m_dwLastError = ERROR_NO_MAPFILE;
SetLastError(ERROR_NO_MAPFILE);
return FALSE;
}
if (NETRGUSER_CFM_CODE != pHeader->dwConfirmCode)
{
m_dwLastError = ERROR_INVALID_CFMCODE;
SetLastError(ERROR_INVALID_CFMCODE);
return FALSE;
}
if (NETRGUSER_CMD_NONE == pHeader->nCommandCode)
{
m_dwLastError = ERROR_INVALID_CMDCODE;
SetLastError(ERROR_INVALID_CMDCODE);
return FALSE;
}
if (pHeader->dwDataSize > dwBufSize)
{
m_dwLastError = ERROR_BUFFER_OVERFLOW;
SetLastError(ERROR_BUFFER_OVERFLOW);
return FALSE;
}
if (pHeader->nCommandCode != dwCommandCode)
{
m_dwLastError = ERROR_INVALID_CMDCODE;
SetLastError(ERROR_INVALID_CMDCODE);
return FALSE;
}

ZeroMemory(pOutBuf, dwBufSize);

// 拷貝數據到緩衝區
memcpy(pOutBuf, pHeader->bInfo, pHeader->dwDataSize);
return TRUE;
}

分享到:
评论

相关推荐

    共享内存类SharedMemory.7z

    在标题“共享内存类SharedMemory.7z”和描述中提到的,我们可以推测这是一个关于使用共享内存类(可能是C++中的一个实现)的资料压缩包。在“TestSM”这个子文件名中,我们可以猜测包含了一个测试用例或者示例程序,...

    共享内存类c++mmmmmm.zip

    c++共享内存类

    共享内存通讯,共享内存通讯源码,C,C++

    共享内存是进程间通信(IPC,Inter-Process Communication)的一种机制,它允许两个或多个进程共享一个相同内存空间,而无需进行数据复制。这种通信方式的优点在于高效:进程可以直接读写共享内存中的数据,避免了...

    基于stl共享内存,可以像使用STL容器一样使用共享内存

    但为了在共享内存上工作,我们需要创建一个自定义的分配器,例如名为`MyAllocator`的类,它会使用共享内存API(如Boost.Interprocess或POSIX共享内存接口)来分配和管理内存。 下面是一些关键知识点: 1. **Boost....

    winodws平台C++共享内存实现.7z

    1. 打开共享内存:客户端同样使用`CreateFileMapping`,但传入NULL和一个全局唯一的命名,以便找到服务端创建的共享内存。 2. 映射内存:然后也是调用`MapViewOfFile`将共享内存映射到自身的地址空间。 3. 读取数据...

    Vc++共享内存类

    Vc++共享内存类 非常实用的双向通信类,有需要的可以看看,很不错的

    C#进程间通信之共享内存

    3. **同步访问**:由于多个进程可能同时访问共享内存,因此需要使用Mutex、Semaphore或MutexSlim等同步原语来确保数据的一致性和完整性。这些同步工具可以防止数据冲突,确保在同一时间只有一个进程在写入,其他进程...

    共享内存封装类示范代码

    综上所述,"共享内存封装类示范代码"是一个利用VC++6和MFC实现的进程间通信示例,通过封装Windows API,简化了共享内存的使用,便于在多个进程中高效地交换大量数据。在实际应用中,需要关注共享内存的创建、映射、...

    用API函数写的共享内存的类

    在这个场景下,我们讨论的是一个通过API函数实现的自定义共享内存类,它允许程序员在不引入过多外部依赖的情况下,创建和操作共享内存,从而满足小型程序的需求。 首先,我们要理解什么是共享内存。共享内存是指两...

    Winodws平台C++共享内存实现(万恶的CSDN)

    1. 创建共享内存:使用CreateFileMapping函数创建一个命名的内存对象,参数包括内存大小、访问权限(读写)和内存名称。 2. 映射视图:通过MapViewOfFile函数将内存对象映射到进程地址空间,获取到内存块的起始地址...

    c#共享内存实例源码 CSharp ShareMemory

    网上有C#的共享内存类,不过功能太简单了。 故,对此进行了改进。通过利用共享内存的一部分空间来存储当前内存中存储的数据信息(count和length),完成了对内存读写功能的完善。 1.写共享内存 根据共享内存当前的...

    C#进程间通信-共享内存代码实例

    本篇文章将深入探讨C#中的共享内存实现,并通过一个具体的代码实例来阐述其工作原理。 共享内存是一种让多个进程可以直接读写同一块内存空间的方法,从而实现数据的快速传递。在C#中,我们可以利用.NET Framework...

    共享内存(内存映射文件)封装类以及使用实例

    在`ShareMemTest`中,我们可以看到如何使用封装好的共享内存类进行测试。通常,测试会包括以下几个步骤: 1. 创建共享内存对象,指定大小和映射文件(如果有的话)。 2. 在需要读取或写入数据时,调用相应的函数,...

    使用共享内存及信号量实现进程间通信例子

    例如,在一个进程修改共享内存中的数据时,其他进程应被阻止访问,直到修改完成。这就是所谓的"互斥",可以通过信号量的P操作实现。当一个进程完成对共享内存的修改并释放资源时,其他进程可以通过V操作获取访问权。...

    使用C#实现共享内存

    VS2005 C# 共享内存 源代码

    内存共享类

    4. `Noncopyable.h` - 这个文件可能定义了一个`Noncopyable`基类,用于禁止类的拷贝构造函数和赋值操作符,这是在设计某些需要防止误用的资源管理类时常见的做法,确保内存共享对象不会被错误地复制。 在内存共享类...

    共享内存封装类(13kb)

    在这个"共享内存封装类"中,我们可以看到一系列的源码文件,它们可能是用于创建一个方便使用的C++类库,以便开发者能够轻松地在自己的应用程序中实现共享内存功能。 首先,`StdAfx.h` 是预编译头文件,通常包含项目...

    共享内存的PASCAL类

    一个实现共享内存的PASCAL类,里面有使用实例

    C++共享内存示例

    在实际应用中,一个进程负责写入数据到共享内存,另一个或多个进程则负责读取这些数据。通过这种方式,进程之间可以高效地传递信息。 总之,C++中的共享内存机制是实现多进程间高效通信的一种重要方式,它依赖于...

Global site tag (gtag.js) - Google Analytics