< EXTRACT の ORA-30076 | mt-comments.cgi に簡易スパムフィルタを実装する >

January 6, 2005

コマンドラインコピーツール

小品。コマンドラインで渡された文字列をクリップボードにセットするだけのプログラム。ショートカットを「送る」に追加しておけば、任意のファイルのフルパスをクリップボードにコピーできたり。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <tchar.h>


#define APPNAME _T( "SendClip" )

static void
ShowErrorMessage(
    DWORD   dwLastError )   // (in)   エラーコード
{
    DWORD   dwRet;
    PVOID   lpBuf = NULL;
    LPTSTR  lpszMessage = NULL;


    // エラーメッセージを取得
    dwRet = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS
                        , NULL
                        , dwLastError
                        , MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)
                        , (LPTSTR)&lpBuf, 0, NULL );
    if ( dwRet ) {
        lpszMessage = (LPTSTR)calloc( dwRet + 1024, sizeof (TCHAR) );
        if ( lpszMessage ) {
            _stprintf( lpszMessage, _T( "エラーが発生しました\r\n%d:%s" ), dwLastError, lpBuf );
            
            // メッセージを表示
            MessageBox( NULL, lpszMessage, APPNAME, MB_OK|MB_ICONSTOP );
            free( lpszMessage );
            lpszMessage = NULL;
        }
        LocalFree( lpBuf );
    }
    return;
 }

int WINAPI
WinMain(
  HINSTANCE hInstance,      // (in)   handle to current instance
  HINSTANCE hPrevInstance,  // (in)   handle to previous instance
  LPSTR     lpCmdLine,      // (in)   pointer to command line
  int       nCmdShow )      // (in)   show state of window
{
    DWORD   dwBytes = 0;
    HGLOBAL hMem = NULL;
    CHAR    *lpszMem = NULL;
    BOOL    bRet = TRUE;
    HANDLE  hClip = NULL;



    // 必要な長さを取得
    dwBytes = strlen( lpCmdLine );
    if ( !dwBytes ) {
        return 0;
    }

    // グローバルメモリを確保
    hMem = GlobalAlloc( GHND, dwBytes + 1 );
    if ( !hMem ) {
        ShowErrorMessage( GetLastError() );
    }
    else {

        // メモリをロックしてポインタを取得
        lpszMem = (LPSTR)GlobalLock( hMem );
        if ( !lpszMem ) {
            ShowErrorMessage( GetLastError() );
        }
        else {
            // グローバルメモリにデータをセット
            strcpy( lpszMem, lpCmdLine );
            GlobalUnlock( hMem );
            lpszMem = NULL;

            // クリップボードオープン
            bRet = OpenClipboard( NULL );
            if ( !bRet ) {
                ShowErrorMessage( GetLastError() );
            }
            else {
                // クリップボードクリア
                bRet = EmptyClipboard();
                if ( !bRet ) {
                    ShowErrorMessage( GetLastError() );
                }
                else {
                    // データをセット
                    hClip = SetClipboardData( CF_TEXT, hMem );
                    if ( !hClip ) {
                        ShowErrorMessage( GetLastError() );
                        bRet = FALSE;
                    }
                }

                // クリップボードをクローズ
                CloseClipboard();
                if ( bRet ) {   // セットに成功
                    return 0;
                }
            }
        }

        // 失敗した場合はメモリを解放する
        GlobalFree( hMem );
    }
    return -1;
}

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/775

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?