我有一个LPBYTE数组(从文件中提取),我需要将其复制到LPTSRT中(实际上是复制到剪贴板中)。问题是复制工作,但不稳定,有时会引发异常(并非总是如此),我不明白为什么。代码是:
FILE *fConnect = _wfopen(connectFilePath, _T("rb"));
if (!fConnect)
return;
fseek(fConnect, 0, SEEK_END);
lSize = ftell(fConnect);
rewind(fConnect);
LPBYTE lpByte = (LPBYTE) malloc(lSize);
fread(lpByte, 1, lSize, fConnect);
lpByte[lSize] = 0;
fclose(fConnect);
//Copy into clipboard
BOOL openRes = OpenClipboard(NULL);
if (!openRes)
return;
DWORD err = GetLastError();
EmptyClipboard();
HGLOBAL hText;
hText = GlobalAlloc(GMEM_MOVEABLE, (lSize+ sizeof(TCHAR)));
LPTSTR sMem = (TCHAR*)GlobalLock(hText);
memcpy(sMem, lpByte, (lSize + sizeof(TCHAR)));
最后一个字符串是引发异常的地方。
非常感谢
最佳答案
我并不是说这是造成您问题的原因,但将来可能是或可能是其他问题的原因。
如果您这样分配内存
LPBYTE lpByte = (LPBYTE) malloc(lSize);
这是分配的内存块之外的访问:
lpByte[lSize] = 0;
分配的内存大小为
lSize
,并且包含从&lpByte[0]
到&lpByte[lSize - 1]
的所有位置。编辑:
就像汉斯注意到的那样,
memcpy
也访问分配的块之外的内存。如果sizeof(TCHAR)
为1,则最后读取的字节为lpByte[lSize]
,如果sizeof(TCHAR)
大于1,则也读取或至少尝试读取lpByte[lSize]
之后的字节。