2011-10-21 11 views
2

私はコピー&ペーストするにはいくつかのコードを持っている:私は間違ってWindowsのクリップボードを使用していますか?

void WinClipboard::copy(const std::string& input) 
    { 
     LPWSTR lptstrCopy; 
     HGLOBAL hglbCopy; 
     std::wstring text; 

     text = _winUTF8ToUTF16(input); 

     // Open the clipboard, and empty it. 

     if (!OpenClipboard(NULL)) 
      return; 

     EmptyClipboard(); 

     // Allocate a global memory object for the text. 
     hglbCopy = GlobalAlloc(GMEM_MOVEABLE, 
      ((text.length() + 1) * sizeof(WCHAR))); 

     if (hglbCopy == NULL) 
     { 
      CloseClipboard(); 
      return; 
     } 

     // Lock the handle and copy the text to the buffer. 
     lptstrCopy = (LPWSTR)GlobalLock(hglbCopy); 
     memcpy(lptstrCopy, text.c_str(), 
      (text.length() + 1) * sizeof(WCHAR)); 
     lptstrCopy[(text.length() + 1) * sizeof(WCHAR)] = (WCHAR) 0; // null character 
     GlobalUnlock(hglbCopy); 

     // Place the handle on the clipboard. 

     SetClipboardData(CF_UNICODETEXT, hglbCopy); 


     // Close the clipboard. 

     CloseClipboard(); 
    } 

    std::string WinClipboard::paste() 
    { 
     HGLOBAL hglb; 
     LPWSTR lptstr; 

     std::string result; 
     std::wstring input; 

     // get the clipboard text. 

     if (!IsClipboardFormatAvailable(CF_UNICODETEXT)) 
      return result; 

     if (!OpenClipboard(NULL)) 
      return result; 

     hglb = GetClipboardData(CF_UNICODETEXT); 
     if (hglb != NULL) 
     { 
      lptstr = (LPWSTR)GlobalLock(hglb); 


      if (lptstr != NULL) 
      { 
       GlobalUnlock(hglb); 
       input = lptstr; 
       result = _winUTF16ToUTF8(input); 
      } 
      CloseClipboard(); 
     } 
     return result; 
    } 

私はすぐにCTRL Cその後、CTRL-V(基本的に上記のコピー&ペースト機能を呼び出すに)アプリケーション全体がフリーズを行うときには、除いて素晴らしい作品。

は、私が何かを確認するために忘れたり、リソースを解放するために忘れているだろうか?

+4

ライン 'lptstrCopy [(text.length()+ 1)*はsizeof(WCHAR)]'バッファオーバーフローです。 –

+0

@RaymondChenこのコードを使ってみましたが、 'SetClipboardData()'の呼び出し中にクラッシュしました。明示的にヌル文字を設定しようとしている別の例は見たことがありません。 –

+0

MSDNの状態:...クリップボードを開くときにアプリケーションがNULLウィンドウハンドルを指定すると、EmptyClipboardは成功しますが、クリップボードの所有者はNULLに設定されます。これにより、SetClipboardDataが失敗することに注意してください。 – Orwellophile

答えて

5

私はあなたのpaste()関数内の二つの問題を参照してください。

1)それはあなたのstd::wstring変数にクリップボードのデータを割り当てる前にGlobalUnlock()を呼んでいるが。これらの操作を元に戻す必要があります。データをコピーした後ではなく、GlobalUnlock()に電話してください。 GetClipboardData()が失敗した場合

2)それはCloseClipboard()を呼び出していません。ここ

+0

ありがとうございました! – jmasterx

1

もう一つの「問題」。 copy関数で

lptstrCopy[(text.length() + 1) * sizeof(WCHAR)] = (WCHAR) 0;

lptstrCopy[text.length() + 1] = (WCHAR) 0;

オーバーフロー/ヒープの破損を回避するためであるべきです。

関連する問題