Windows环境下使用共享内存实现进程间通讯
创建共享内存
bool SharedMemory::CreateMemory()
{
m_hFileMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, m_memoryName.c_str())
if (nullptr == m_hFileMap)
{
if (m_fileName != "")
{
m_hFile = CreateFile(m_fileName.c_str(),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
nullptr,
OPEN_ALWAYS,
0,
nullptr);
if (INVALID_HANDLE_VALUE == m_hFile)
return false;
}
m_hFileMap = CreateFileMapping(
m_hFile,
nullptr,
PAGE_READWRITE,
0,
m_memorySize,
m_memoryName.c_str());
if (INVALID_HANDLE_VALUE == m_hFileMap)
return false;
}
m_address = (unsigned char *)MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, m_memorySize);
if (nullptr == m_address)
return false;
}
写入共享内存
bool SharedMemory::WriteMemory(size_t offset, void* data, size_t length )
{
if (!m_address) return false;
memcpy(m_address + offset, data, length);
return true;
}
读取共享内存
bool SharedMemory::ReadMemory(size_t offset, void * data, size_t length)
{
if (!m_address) return false;
memcpy(data, m_address + offset, length);
return true;
}
清理共享内存
void SharedMemory::ClearMemory(size_t offset, size_t length)
{
if (!m_address) return;
memset(m_address + offset, 0, length);
}
SharedMemory.hpp
class SharedMemory
{
public:
SharedMemory(std::string memoryName, std::string fileName, size_t memorySize);
~SharedMemory();
bool WriteMemory(size_t offset, void* data, size_t length = 0);
bool ReadMemory(size_t offset, void* data, size_t length = 0);
void ClearMemory(size_t offset, size_t length = 0);
private:
bool CreateMemory();
private:
std::string m_memoryName;
std::string m_fileName;
size_t m_memorySize;
HANDLE m_hFileMap = INVALID_HANDLE_VALUE;
HANDLE m_hFile = INVALID_HANDLE_VALUE;
unsigned char *m_address = nullptr;
};
应用
typedef struct TestData
{
INT32 a = 0;
INT32 b = 0;
}TestData;
SharedMemory *m_SM = nullptr;
m_SM = new SharedMemory("TestSM", "test.dat", sizeof(TestData));
m_SM->ClearMemory(0, sizeof(TestData));
TestData testData;
testData.a = 10;
testData.b = 20;
while (true)
{
Sleep(500);
m_SM->WriteMemory(0, &testData, sizeof(TestData));
}
SharedMemory *m_SM = nullptr;
m_SM = new SharedMemory("TestSM", "test.dat", sizeof(TestData));
TestData testData;
m_SM->ReadMemory(0, &testData, sizeof(TestData));
注意
读取的内容是内存块,所以需要保证程序AB使用的结构体一致,不然会解析错误,获取不到需要的数据。