0

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)));

最後の文字列は、例外がスローされる場所です。どうもありがとう

4

4 に答える 4

3

それがあなたの問題の原因であると言っているのではありませんが、将来的に他の問題の原因になる可能性があります.

このようにメモリを割り当てると

LPBYTE lpByte = (LPBYTE) malloc(lSize);  

これは、割り当てられたメモリのチャンク外へのアクセスです。

lpByte[lSize] = 0;

割り当てられたメモリのサイズは で、これには以下をlSize含む位置が含まれます。&lpByte[0]&lpByte[lSize - 1]

編集:

Hans が気づいたようmemcpyに、割り当てられたブロックの外側のメモリにもアクセスします。が 1 の場合sizeof(TCHAR)は、最後に読み取られたバイトでlpByte[lSize]あり、が 1 より大きい場合sizeof(TCHAR)は、過去のバイトlpByte[lSize]も読み取られるか、少なくとも読み取られようとします。

于 2010-06-05T00:50:02.967 に答える
1

コードで何が問題を引き起こしているのかはわかりませんが、次のコードは機能し、すべてが正常にロック/コピーされます(クリップボード操作は簡単にコメントアウトでき、問題の原因に影響を与えないことに注意してください)

   LPBYTE lpByte = (LPBYTE)malloc(512);  
   lpByte[0] = 'A';
   lpByte[1] = 'B';
   lpByte[2] = '0';

   // OpenClipboard(NULL);
   // EmptyClipboard(); 

   HGLOBAL hText;
   hText = GlobalAlloc(GMEM_MOVEABLE, 512);

   LPTSTR sMem = (TCHAR*)GlobalLock(hText); 
   memcpy(sMem, lpByte, 512);

例外が発生する直前に、コードにブレークポイントを設定してみることができます(実際にはさまざまな理由が考えられます)。

于 2010-06-05T00:51:50.950 に答える
0

_wfopenのワイド文字バージョンですfopen- TCHAR ではなく L"..." を渡す必要があります。TCHAR バージョンは_tfopen(または のfopenいずれかに要約されます_wfopen) - 参照: http://msdn.microsoft.com/en-us/library/yeby3zcb%28VS.80%29.aspx

LPBYTE lpByte = (LPBYTE) malloc(lSize);

これが C の場合、実際には malloc の結果をキャストする必要はありません。個人的には、MSLP*タイプは私の口に悪い味を残します。ハンガリー語は、C に精通した人にとってコードの可読性を覆い隠していると感じBYTE *ますLPBYTE

fread(lpByte, 1, lSize, fConnect);

戻り値を確認してください。

lpByte[lSize] = 0;

他の人が述べたように、このメモリアクセスは配列の境界外です。

if (!openRes)
    return;
DWORD err = GetLastError();
  • あなたが漏らすlpByte
  • GetLastError()あなたは...成功を呼びますか?

次、

LPTSTR sMem = (TCHAR*)GlobalLock(hText);

私はLP以外のものが好きですが、おそらく1つを選んでください。(多分キャストを作るLPTSTR?)繰り返しますが、最終的には問題になりません。(これは「malloc であり、キャストを必要としない」にも該当する可能性があります。)

memcpy(sMem, lpByte, (lSize + sizeof(TCHAR)));

他の人が述べたように、この memcpy も無効なメモリにアクセスしています。具体的にlpByteは、lSize長いですが、それに加えてsizeof(TCHAR).

于 2010-06-08T05:53:41.417 に答える
0

GlobalAlloc または GlobalLock は機能しますか? いくつかのエラー チェック コードを挿入して確認すると、どちらも NULL 以外の値を返すはずです。

于 2010-06-05T00:42:58.503 に答える