WinBatchEh API 2.02 リファレンス ★ はじめに WinBatchEh 上のバッチファイルから呼び出す外部コマンド(Windows ア プリに限ります)では WinBatchEh に対する API が使用できます。これに より WinBatchEh に不足しているコマンドなどを外部ユーティリティーと して作成・利用する事が可能になります。 但しコマンド起動ごとにファイルを呼び出しますので、WinBatchEh の 内部コマンドに比べると動作が遅いですし、ディスクキャッシュがない場 合に頻繁に利用するとバッチが使い物にならなくなるかも知れません。 ★ APIの呼び出し方 WinBatchEh では外部コマンドを起動する際に次の様な見えないウィン ドウを作成します。 クラス名: WinBatchEhShell ウィンドウタイトル: WinBatchEhShell - 外部コマンドファイル名 外部コマンドファイル名は、パス名を含まない実行ファイルの大文字で のファイル名です。C:\WINDOWS\BATTOOL.EXE であれば "BATTOOL" になり ます(拡張子は取り除かれます)。 このウィンドウのハンドルを FindWindow で取得して、メッセージを SendMessage で送る事により、API の呼び出しが行なえます。 ハンドルの取得のコード例: HWND bhwnd; // Windowを見つける処理 if ( (bhwnd=FindWindow("WinBatchEhShell", "WinBatchEhShell - WINTOOL")) == NULL ) { : // WinBatchEh上から呼ばれてないときの処理 : } // 別のWinBatchEhが動作しているときの為にウィンドウタイトルを変更しておく SetWindowText(bhwnd, ""); SendMessage(bhwnd, API番号, [wParam], [lParam]); : ★ API解説 API はウィンドウハンドルに対して API 番号をメッセージで送る事に より実現できます。wParam または lParam には必要であれば、パラメー ターを設定します。 数値の取得は SendMessage のリターン値が返答になります。 数値の設定は wParam に数値を設定して SendMessage を呼び出します。 文字列の設定、取得では lParam に 16 ビットバージョンでは GlobalAlloc に DDE_SHARE のフラグを指定したグローバルハンド ル(HGLOBAL)を、32 ビットバージョンでは CreateFileMapping に PAGE_READWRITE のフラグを指定したハンドル(HANDLE)を DuplicateHandle したものを指定します。 数値の取得例: return = SendMessage(hwnd, API-COMMAND, 0, 0L); 数値の設定例: SendMessage(hwnd, API-COMMAND, (WPARAM)数値, 0L); 文字列の設定、取得例: 16ビットバージョン: hglobal=GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, SIZE); : globalptr=GlobalLock(hglobal); : SendMessage(hwnd, API-COMMAND, 0, hglobal); : GlobalUnlock(hglobal); GlobalFree(hglobal); 32ビットバージョン: fhandle=CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, SIZE ,NULL); GetWindowThreadProcessId(hwnd, &idprocess); hprocess=OpenProcess(PROCESS_DUP_HANDLE, TRUE, idprocess); DuplicateHandle( GetCurrentProcess(), fhandle, hprocess, &dhandle, 0, TRUE, DUPLICATE_SAME_ACCESS); : handleptr=MapViewOfFile(fhandle, FILE_MAP_ALL_ACCESS, 0, 0, 0) : SendMessage(hwnd, API-COMMAND, 0, dhandle); : CloseHandle(hprocess); UnmapViewOfFile(handleptr); CloseHandle(dhandle); CloseHandle(fhandle); メモリ共有の考え方が違うため、lParam にパラメーターが必要なコマ ンドについては 16 ビットバージョンと 32 ビットバージョンで互換があ りませんので、それぞれのプラットフォーム用に実行ファイルを作成する 必要があります。 ★API番号の一覧 #define WINBAT_API_VER 0x0202 // APIバージョン #define WM_WB_GETVER (WM_USER + 0) // APIのバージョンを取得 #define WM_WB_GETBATWNDFLAG (WM_USER + 10) // バッチ実行ウィンドウフラグ取得 // 0:存在する 1:存在しない(非表示状態) #define WM_WB_GETREDIRECTOUTFLAG (WM_USER + 11) // リダイレクト出力フラグ // 0:されていない 1:リダイレクトされている #define WM_WB_GETBATONMEMFLAG (WM_USER + 15) // バッチのオンメモリ処理フラグ // 0:される 1:されない #define WM_WB_GETERRORLEVEL (WM_USER + 20) // ERRORLEVELを取得 #define WM_WB_SETERRORLEVEL (WM_USER + 21) // ERRORLEVELを設定 #define WM_WB_GETNOWLINE (WM_USER + 30) // 実行中の行番号を取得 #define WM_WB_SETNOWLINE (WM_USER + 31) // 実行中の行番号を設定 #define WM_WB_GETMAXLINE (WM_USER + 35) // バッチの最大行数を取得 #define WM_WB_GETENV (WM_USER + 40) // 環境変数を取得 #define WM_WB_PUTENV (WM_USER + 41) // 環境変数を設定 #define WM_WB_GETENVALL (WM_USER + 50) // 全環境変数を取得 #define WM_WB_PUTENVALL (WM_USER + 51) // 全環境変数を設定 #define WM_WB_GETENVALLSIZE (WM_USER + 55) // 全環境変数のサイズを取得 #define WM_WB_GETBATNAME (WM_USER +100) // バッチファイル名を取得 #define WM_WB_GETBATNOWLINE (WM_USER +110) // 実行中のバッチ行を取得 #define WM_WB_GETBATNUMLINE (WM_USER +115) // 任意のバッチ行を取得 #define WM_WB_PUTCHAR (WM_USER +200) // 1文字を表示 #define WM_WB_PUTSTR (WM_USER +201) // 文字列を表示 #define WM_WB_ERRPUTCHAR (WM_USER +210) // 1文字を強制的に表示 #define WM_WB_ERRPUTSTR (WM_USER +211) // 文字列を強制的に表示 ★バージョンによる違い(重要) ☆WinBatchEh 1.13で次の変更が行なわれました。 o APIバージョンが 1.00 から 2.00 になりました。 以前は API のコマンドを wParam で指定していましたが、32 ビットバ ージョンで問題が起きるため、メッセージにコマンドを指定するようにな りました。wParam は API のパラメータとして使用します。API 1.00 と は互換が無くなりましたので注意してください。 lParam の値はポインタではなく、ハンドルを指定するようになりまし た。 バッチ情報エリア(BatInfArea)はなくなりました。 ☆WinBatchEh 1.18で次の変更が行なわれました。 o APIバージョンが 2.00 から 2.01 になりました。 文字列出力(WM_WB_PUTCHAR,WM_WB_ERRPUTCHAR)で書式指定を(例えば \g を 0x07 などに)変換処理後、出力してしまっていたのを、変換せずにそ のまま出力するようにしました。また、ラインフィード(0x0a)を出力して も改行されないことがあるのを修正しました。 ☆WinBatchEh 1.19で次の変更が行なわれました。 o APIバージョンが 2.01 から 2.02 になりました。 全環境変数の取得/設定の WM_WB_GETENVALLSIZE, WM_WB_GETENVALL, WM_WB_PUTENVALL の API コマンドが追加されました。 ★ APIの詳細 ☆WM_WB_GETVER WinBatchEhのAPIのバージョンを取得 API のバージョン番号を取得します。SendMessage のリターン値として、 API のバージョンが返ってきます。将来のバージョンアップのときに API が増えた場合に、API のバージョンをチェックして動作の可否を決めるの に使用します。 現在は API のバージョンとして、0x0202(バージョン 2.02)が返ってき ます。 メジャーバージョン(小数点より前)の番号が違う場合は処理を中止する ようにしてください。 例: int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmd, int cmdShow) { : WinBatchEhのウィンドウハンドルの取得の処理など : if ( ( SendMessage(bhwnd, WM_WB_GETVER, 0, 0L) & 0xff00 ) != 0x0200 ) { MessageBox(hwnd, "バージョンエラー", "EXENAME", MB_OK); return NULL; } : 実際の処理 : ☆WM_WB_GETBATWNDFLAG バッチ実行ウィンドウフラグ取得 ☆WM_WB_GETREDIRECTOUTFLAG リダイレクト出力フラグ取得 ☆WM_WB_GETBATONMEMFLAG バッチのオンメモリ処理フラグ取得 WinBatchEh のフラグを取得します。SendMessage のリターン値として フラグが返ってきます。 WM_WB_GETBATWNDFLAG バッチ実行ウィンドウフラグ取得: 0:存在する 1:存在しない(非表示状態) WM_WB_GETREDIRECTOUTFLAG リダイレクト出力フラグ取得: 0:されていない 1:リダイレクトされている WM_WB_GETBATONMEMFLAG バッチのオンメモリ処理フラグ取得: 0:される 1:されない ☆WM_WB_GETERRORLEVEL ERRORLEVELを取得 ☆WM_WB_SETERRORLEVEL ERRORLEVELを設定 ERRORLEVEL の取得と設定を行ないます。 WM_WB_GETERRORLEVEL(取得)の場合は SendMessage のリターン値として、 現在の ERRORLEVEL が返ります。 WM_WB_SETERRORLEVEL(設定)を行なう場合は、wParam に数値を設定して API を呼び出してください。 なお、WinBatchEh ではコマンドが実行できたかどうかを ERRORLEVEL に設定するようになっていますが、この API を使用して ERRORLEVEL の 設定を行なった場合はその処理を行なわずに、API での ERRORLEVEL を優 先するようになっています。 ☆WM_WB_GETNOWLINE 実行中の行番号を取得 ☆WM_WB_SETNOWLINE 実行中の行番号を設定 ☆WM_WB_GETMAXLINE バッチの最大行数を取得 現在実行を行なっている行番号の取得と設定、最大行数の取得を行ない ます。行番号は一番始めの行が 0 になります。 WM_WB_GETNOWLINE(取得)の場合は SendMessage のリターン値として、 現在実行している行番号(0〜)が返ります。 WM_WB_SETNOWLINE(設定)を行なう場合は、wParam に行番号(0〜)を設定 して API を呼び出してください。 WM_WB_GETMAXLINE(最大行数を取得)の場合は SendMessage のリターン 値として、バッチの最大行数が返ります(1〜)。 ☆WM_WB_GETENV 環境変数を取得 ☆WM_WB_PUTENV 環境変数を設定 環境変数の取得と設定を行ないます。どちらの場合も lParam に 最後 が '\0'(0x00) で終わる文字列のハンドルを入れてください。 WM_WB_GETENV(取得)を行なう場合は、文字列のハンドル内に取得したい 環境変数名を入れてください。そのハンドルに対して環境変数の内容を設 定します。環境変数の内容は、文字列の最後に '\0' が付いた形で代入が 行なわれます。もし環境変数が存在しなければ先頭が '\0' になります。 WM_WB_PUTENV(設定)を行なう場合は、文字列を "NAME=strings" の様な 形にしてください。削除を行なう場合は "NAME=" のようにしてください。 正常に設定ができた場合はリターン値として 0 を返します。もし環境変 数の領域が足りない場合は -1 が返ります。 ☆WM_WB_GETENVALLSIZE 全環境変数の大きさを取得 ☆WM_WB_GETENVALL 全環境変数を取得 ☆WM_WB_PUTENVALL 全環境変数を設定 すべての環境変数の取得と設定を行ないます。どちらの場合も lParam に文字列のハンドルを入れてください。 WM_WB_GETENVALLSIZE(サイズの取得)は、WM_WB_GETENVALL で必要にな るサイズを SendMessage のリターン値としてバイト単位で返します。返 されるサイズは最大 64KB ですので、これ以上の大きさをあらかじめ確保 しているなら、サイズの取得は行なわなくても構いません。 WM_WB_GETENVALL(取得)を行なう場合は、代入を行なうバッファ(文字列 のためのハンドル)を lParam に指定して SendMessage を行ないます。 環境変数の内容は、それぞれに文字列の最後に '\0'(0x00) が付いた形 で連続して代入が行なわれ、一番最後は '\0' が 2 つ続きます。例えば "PATH=C:\\0PROMPT=$p$g\0...TMP=C:\TMP\0\0" のような感じになります。 WM_WB_PUTENVALL(設定)を行なう場合は、それぞれの文字列を "NAME=strings" の様な形で最後に '\0' が付いた形が連続したものを指 定してください。一番最後は '\0' を 2 つ続けてください。内部処理的 には、それぞれの環境変数を順に設定することを繰り返すだけですので、 完全に置き換わるわけではなく、すでに存在していて指定されなかった環 境変数は、以前のままになります。 削除を行なう場合は "NAME=" のようにしてください。すべての設定が 正常に設定ができた場合はリターン値として 0 を返します。もし環境変 数の領域が足りない場合は -1 が返ります。 ☆WM_WB_GETBATNAME バッチファイル名を取得 lParam に ハンドルを入れて呼び出すと、実行中のバッチファイル名を コピーして、返ります。リターン値にはファイル名の文字数が返ります。 バッチファイル名は必ずフルパスで設定されます。 バッチファイルは普通のバッチファイル以外に、WBATCP で EXE 化され たファイルが処理されている場合がありますので、注意が必要です。 ☆WM_WB_GETBATNOWLINE 実行中のバッチ行を取得 ☆WM_WB_GETBATNUMLINE 任意のバッチ行を取得 lParam に ハンドルを入れて呼び出すと、実行中のバッチファイルの現 在行をコピーして、返ります。リターン値にはコピーした文字数が返りま す(取得できない場合は -1 が返ります)。 WM_WB_GETBATNUMLINE(任意のバッチ行を取得)では、wParam に行番号を さらに入れて呼び出します。行番号は 0 から始まります。 ☆WM_WB_PUTCHAR 1文字をバッチ実行ウィンドウに表示 ☆WM_WB_PUTSTR 文字列をバッチ実行ウィンドウに表示 ☆WM_WB_ERRPUTCHAR 1文字を強制的にバッチ実行ウィンドウに表示 ☆WM_WB_ERRPUTSTR 文字列を強制的にバッチ実行ウィンドウに表示 それぞれ、バッチ実行ウィンドウに文字や文字列を表示します。 PUTCHAR, PUTSTR の場合はリダイレクト出力が行なわれていれば、ファイ ルに出力を行ないます。 1 文字出力の場合は wParam に文字コードを入れてください。 文字列を出力する場合は lParam に 最後が '\0'(0x00) で終わる文字 列のハンドルを入れてください。文字列出力では自動的に改行を行ないま せんので必要ならば '\n'(0x0a) を最後に指定してください。 ★ 終わりに API を使用したプログラムとしては WBLHA があります。WBLHA のアー カイブにはソースが付いてますので API を使用したプログラムを作成す る場合にご参照頂ければと思います。