標準入力をクリップボードにコピーする :【VC++】

ビルド用パッケージ + ソース + clipcpy.exe

ブラウザでダウンロード
古い資産の利用
最近はもう C++ でプログラムを書く必要が表向きは無いようですが、
C++ でやったほうが手っ取り早い場面もまだまだあるようです。

スクリプト感覚で使えるアプリケーションとテクニックってのは
そういえば結構あるようです・・・
// *********************************************************
// 標準入力をクリップボードにコピーする
// コンソールアプリケーション
//
// 【例】cmd /c "dir c:\ /B" | clipcpy
// *********************************************************
#include <tchar.h>
#include "lightbox\lightbox.h"

#pragma comment( lib, "lightbox\\lightbox.lib" )
#pragma comment( lib, "shlwapi.lib" )

int _tmain(int argc, _TCHAR* argv[])
{
	_bstr_t str;
	char buff[1024];
	LboxString LString;

	while( NULL != gets( buff ) ) {
		str += buff;
		if ( argc == 1 ) {
			str += "\r\n";
		}
		else {
			if ( lstrcmp( argv[1], "t" ) == 0 ) {
				LString = (LPTSTR)str;
				LString.Trim( "  " );
				str = LString.szLboxString;
			}
		}
	}

	LboxTool lboxTool;
	lboxTool.CopyClipboard( (LPTSTR)str );

	return 0;
}

_bstr_t は、com 用の文字列クラスですが、
普通に文字列処理用に使えます。
実際、com を作った時にはめちゃめちゃ使ってましたが、
あまり世の中では使われて無いような気がします。

lightbox.lib は、自作のクラスライブラリですが、
昔沢山作ったクラスやらメソッドが詰まってるので使ってみました。

CopyClipboard の実際のコードは以下のようになります
// *********************************************************
// クリップボードへテキストをコピー
// 戻り値 : 成功 true, 失敗 false
// *********************************************************
BOOL LboxCopyClipboard( LPTSTR szData )
{
	HGLOBAL hGlobal;
	LPTSTR pMem;

	hGlobal = GlobalAlloc(GHND, lstrlen( szData ) + 128 );
	if ( hGlobal == NULL ) {
		return false;
	}
	pMem = (LPTSTR)GlobalLock( hGlobal );
	if ( pMem == NULL ) {
		GlobalFree( hGlobal );
		return false;
	}
	lstrcpy( pMem, szData );
	GlobalUnlock( hGlobal );
	OpenClipboard( NULL );
	EmptyClipboard();
	SetClipboardData(CF_TEXT, hGlobal);
	CloseClipboard();

	return true;
}
ビルド用テキスト
;コンパイル
cl.exe win32api.cpp /c
/D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS"

; ランタイムの新しい形式を使う為に必要
/D _CRT_SECURE_NO_DEPRECATE

; ランタイムライブラリを内部に取り込む( DLLから読まない:msvcr80.dll )
/MT

; ワーニングレベル
/W3

;/Zc:wchar_t は既定でオンになったため、コメント プラグマまたは
;コマンド ラインからの comsupp.lib への明示的な参照は、
;comsuppw.lib または comsuppwd.lib のどちらかを使うように変更する必要があります。
;ただし、/Zc:wchar_t- を指定してコンパイルするときは、
;これまで同様に comsupp.lib を使用する必要があります。
/Zc:wchar_t-

;↓ 行頭 // で行区切りをあらわします
//

;リンク
link.exe win32api.obj

; 参照ライブラリ
kernel32.lib user32.lib gdi32.lib winspool.lib
comdlg32.lib advapi32.lib shell32.lib ole32.lib
oleaut32.lib uuid.lib

; 除外ライブラリ
/NODEFAULTLIB:libc.lib

; 出力ファイル名の指定
/OUT:"clipcpy.exe"