【发布时间】:2017-11-09 21:22:14
【问题描述】:
我能够创建一个共享内存对象,并使用 MSDN 中的指南打开它。
第一个进程创建它并使其保持打开状态。 第二个进程输入一个字符串。 然后第一个过程将尝试恢复该字符串并显示它,但是我似乎什么也得不到。尽管看起来写作部分设置正确,但它始终是空的。
我这样写一个字符串到内存中:
int MemoryMapper::Write(const std::string& data) {
m_pBuffer = (LPCTSTR)MapViewOfFile(m_OpenHandle, FILE_MAP_ALL_ACCESS, 0, 0, m_BufferSize);
if (m_pBuffer == NULL)
{
std::cerr << m_DebugErrorTitle << "Write(): " << MM_ERROR_MAPPING_FAILED << " {" << GetLastError() << "}" << std::endl;
Close();
return 0;
}
const char* cdata = _CharFromString(data);
int size = (lstrlen(cdata) * sizeof(const char*));
CopyMemory((PVOID)m_pBuffer, cdata, size);
m_WrittenSize += size;
if (m_Debug > 1) { std::cout << m_DebugTitle << "Wrote " << size << " bytes." << std::endl; }
return size;
}
然后我是这样读的:
int MemoryMapper::Read(std::string& data) {
m_pBuffer = (LPCTSTR) MapViewOfFile(m_OpenHandle, FILE_MAP_ALL_ACCESS, 0, 0, m_BufferSize);
if (m_pBuffer == NULL)
{
std::cerr << m_DebugErrorTitle << "Read(" << m_MemoryName << "): " << MM_ERROR_MAPPING_FAILED << " {" << GetLastError() << "}" << std::endl;
Close();
return 0;
}
MessageBox(NULL, m_pBuffer, TEXT("TEST MESSAGE"), MB_OK);
int size = (lstrlen(m_pBuffer) * sizeof(const char*));
UnmapViewOfFile(m_pBuffer);
return size;
}
m_pBuffer 是一个 LPCTSTR,m_BufferSize 是 1024。 为对象指定的名称在两端相同。我已经确保创建和打开/关闭部分正常工作。
第二个进程写入'8312.000000,8312.000000',按照代码一共92个字节。
阅读器的缓冲区是空的。
我做错了什么? 我尝试了各种数据类型,char、const char、string、tchar - 结果相同。
【问题讨论】:
标签: c++ shared-memory