【发布时间】:2018-10-16 08:01:41
【问题描述】:
我的目标是实现以下目标:
我想从磁盘读取一个文件(假设它是一个图像文件)并将其写入共享内存,以便我可以从另一个进程的共享内存中读取它。 首先,我按照this msdn tutorial 创建了一个简单的共享内存实现来包含一个字符串。它工作正常。
然后我找到了一种从磁盘读取图像的方法。实现如下:
std::ifstream fin("path/to/img.png", std::ios::in | std::ios::binary);
std::ostringstream oss;
oss << fin.rdbuf();
std::string data(oss.str());
所以现在我有一个包含我的数据的std::string data.length() 表示我已读取的文件已成功存储在其中。在 msdn 示例中,MapViewOfFile 结果的类型是LPTSTR,所以我寻找一种将std::string 强制转换为LPTSTR 的方法,据我所知是const wchar_t*。我这样做如下:
std::wstring widestr = std::wstring(data.begin(), data.end());
const wchar_t* widecstr = widestr.c_str();
但如果我现在检查_tcslen(widecstr),结果是4。所以我想我试图做的事情是行不通的。我还在另一个 SO 问题上找到了这句话:
注意:std::string 适合存放“二进制”缓冲区,而 std::wstring 则不是!
(Source) 这听起来好像我无法按照我尝试的方式存储文件数据。
所以我的问题是:我只是在某个地方犯了错误还是我的方法有缺陷?也许我需要为MapViewOfFile 的结果使用另一种文件类型?也许我需要将文件初始化加载到另一种类型?
【问题讨论】:
-
当您将图像文件加载到
std::string时,您“滥用”了char作为字节的表示。这没关系,我也会这样做。 MSDN 的共享内存示例处理可能使用宽字符的文本字符串,具体取决于TCHAR的定义方式。忘记这一点 - 这与您的情况无关。CopyMemory((PVOID)pBuf, data.data(), data.size());应该没问题。 -
题外话,但是为了让你的代码可移植,最好使用
boost.interprocess而不是使用Win32 API -
@Scheff 谢谢,看起来这行得通。如果您将其作为答案,我可以接受。另外,您能否告诉我如何将数据读入从共享内存读取的“另一”端的字符串/字节数组中?
标签: c++ winapi shared-memory lptstr