はじめまして。
CStaticの文字をクリップボードにコピーしたいのですが、
方法はあるでしょうか?
VC++ .net 2003 / MFC です。
すいません。サイトをまわって探したら見つかりました。
しかし、下記ソースで実行すると ハンドルが無効とエラーが出てしまいます。
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;
}
ちゃんと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で解放してしまえばそれ以降エラーが起きるのは当然です。
YuOさん、ありがとうございます。
ご指摘通りでした。
ツイート | ![]() |