我使用CreateStreamOnHGlobal创建了一个流,以便通过最少的复制提取写入其中的字节数组。流消费者没有错误(我不能控制它 - 它是一个WinAPI函数)但是当我尝试访问流的内存时,我得到了一个段错误。
IStreamPtr ipStream;
CreateStreamOnHGlobal(nullptr, TRUE, &ipStream);
FunctionWhichWritesToIStream(ipStream);
HGLOBAL handle;
GetHGlobalFromStream(ipMemory, &handle);
auto pBytes = static_cast<BYTE *>(handle);
LARGE_INTEGER zero;
zero.QuadPart = 0;
ULARGE_INTEGER nBytes;
ipMemory->Seek(zero, STREAM_SEEK_END, &nBytes);
FunctionWhichReadsFromBytes(pBytes, nBytes); // segfault
我做错了什么?
注意:我无法使用SHCreateMemStream,因为这不允许访问底层内存。
答案 0 :(得分:1)
auto pBytes = static_cast<BYTE *>(handle);
是错误的。你需要使用
PBYTE pBytes = (PBYTE)GlobalLock(handle);
如果想直接访问流存储。不要忘记最后致电GlobalUnlock