CStaticの文字をクリップボードへコピーするには?

解決


WAM  2004-02-24 23:00:16  No: 53215

はじめまして。
CStaticの文字をクリップボードにコピーしたいのですが、
方法はあるでしょうか?
VC++ .net 2003 / MFC です。


WAM  2004-02-25 02:03:32  No: 53216

すいません。サイトをまわって探したら見つかりました。
しかし、下記ソースで実行すると ハンドルが無効とエラーが出てしまいます。
10進数もしくは16進数の値(CString)をコピーして、クリップボードへデータを送ってます。
1・3・5・・・回目は正常にコピーできるのですが、2・4・6・・・回目はSetClipboardDataで転んでしまいます。

void CscpDlg::OnMenuCopy()
{
  // コピー処理( mDHFlag = DEC/HEX右クリック判別フラグGlobal  0= 10進数  1=16進数)
  CString Buff;

  if ( mDHFlag == 0 ) {
    Buff = m_Edit1;
  } else {
    Buff = m_Edit2;
  }
  SetClipboardText(Buff);
  MessageBox("戻ってきますた。");
}

BOOL CscpDlg::SetClipboardText(const char *Str)
{
  size_t    BufSize;
  char  *Buf;
  HANDLE hMem;
  CString    wwstr ;

  BufSize = strlen( Str ) + 1;                               // 確保するメモリのサイズを計算する
  hMem = GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE, BufSize ); // 移動可能な共有メモリを確保する
  if (hMem == NULL) {
    wwstr.Format("GlovalAllocエラー :%x",GetLastError() );
    AfxMessageBox( wwstr );
    GlobalFree( hMem );
    return FALSE;
  }
  if ( !hMem ) return FALSE;

  Buf = (char *)GlobalLock( hMem ); // 確保したメモリをロックし、アクセス可能にする
  if ( Buf ) {
    strcpy( Buf, Str );   // 文字列を複写する。
    GlobalUnlock( hMem ); // メモリのロックを解除する。

    if ( OpenClipboard() ) {
      if ( EmptyClipboard() == 0 ) {
        wwstr.Format( "EmptyClipboardエラー %x", GetLastError() ) ;
        AfxMessageBox( wwstr );
        GlobalFree( hMem );
        return FALSE;
      }

      if (SetClipboardData( CF_TEXT, hMem ) == NULL) {
        wwstr.Format( "データセットエラー %x", GetLastError() ) ;
        AfxMessageBox( wwstr );
        GlobalFree( hMem );
        return FALSE;
      }

      if (CloseClipboard() == 0) {
        AfxMessageBox("クリップボードのクローズに失敗しました。");
        GlobalFree( hMem );
        return FALSE;
      }

      GlobalFree( hMem );
      MessageBox("正常ルート");
      return TRUE;

    } else {
      AfxMessageBox("クリップボードのオープンに失敗しました");
      return FALSE;
    }

  }
  GlobalFree( hMem );

  return 0;
}


YuO  2004-02-25 05:49:45  No: 53217

ちゃんとMSDNを読みましたか?

http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/dataexchange/clipboard/clipboardoperations.asp#_win32_Memory_and_the_Clipboard
>When the clipboard is emptied and the memory object has one of the following clipboard formats, the system frees the memory object by calling the specified function:
(snip)
>CF_TEXT
とあります。

正常にクリップボードにデータが設定できたのに,
GlobalFreeで解放してしまえばそれ以降エラーが起きるのは当然です。


WAM  2004-02-27 19:35:23  No: 53218

YuOさん、ありがとうございます。
ご指摘通りでした。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加