[PR]

クリップボードにテキストデータをコピーする

戻る

 クリップボードにテキストデータをコピーする関数を作る。

//*********************************************************
// クリップボードにテキストデータをコピーする。
//*********************************************************
BOOL SetClipboardText( const char *Str )
{
	int    BufSize;
	char  *Buf;
	HANDLE hMem;

	BufSize = strlen( Str ) + 1;                               // 確保するメモリのサイズを計算する
	hMem = GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE, BufSize ); // 移動可能な共有メモリを確保する
	if ( !hMem )
	{
		return FALSE;
	}

	Buf = (char *)GlobalLock( hMem ); // 確保したメモリをロックし、アクセス可能にする
	if ( Buf )
	{
		strcpy( Buf, Str );   // 文字列を複写する。
		GlobalUnlock( hMem ); // メモリのロックを解除する。
		if ( OpenClipboard(NULL) )
		{
			EmptyClipboard();                  // クリップボード内の古いデータを解放する
			SetClipboardData( CF_TEXT, hMem ); // クリップボードに新しいデータを入力する
			CloseClipboard();

			// クリップボードにテキストデータがコピーされた。
			// コピーされたメモリはクリップボードが管理するので解放してはならない。
			//
			// 関数 SetClipboardData() に関する MSDN の記述が、
			//
			//    The application can read the data,
			//   but must not free the handle or leave it locked.
			//   ↓
			//    The application can read the data,
			//   but must not free the handle or leave it locked
			//   until the CloseClipboard function is called.
			//
			// と改訂されているようだ。
			// 関数 SetClipboardData() に渡すために確保されたメモリは、
			// 関数 CloseClipboard() の呼び出し後には解放して良いのかもしれない。
			GlobalFree( hMem ); // 判断微妙
			return TRUE;
		}
	}
	GlobalFree( hMem );
	return FALSE;
}//SetClipboardText

Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp

>> 扉の外 I / II / III