我有一个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]之后的字节。

10-07 23:59