home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 July / VPR9707A.ISO / OLS / Win32 / Wbat128p / WBAT128P.LZH / SAMPLE / WBATAPI.TXT < prev   
Text File  |  1996-12-23  |  13KB  |  329 lines

  1. WinBatchEh API 2.02 リファレンス
  2.  
  3. ★ はじめに
  4.  
  5.       WinBatchEh 上のバッチファイルから呼び出す外部コマンド(Windows ア
  6.     プリに限ります)では WinBatchEh に対する API が使用できます。これに
  7.     より WinBatchEh に不足しているコマンドなどを外部ユーティリティーと
  8.     して作成・利用する事が可能になります。
  9.  
  10.       但しコマンド起動ごとにファイルを呼び出しますので、WinBatchEh の
  11.     内部コマンドに比べると動作が遅いですし、ディスクキャッシュがない場
  12.     合に頻繁に利用するとバッチが使い物にならなくなるかも知れません。
  13.  
  14.  
  15. ★ APIの呼び出し方
  16.  
  17.       WinBatchEh では外部コマンドを起動する際に次の様な見えないウィン
  18.     ドウを作成します。
  19.  
  20.     クラス名: WinBatchEhShell
  21.     ウィンドウタイトル: WinBatchEhShell - 外部コマンドファイル名
  22.  
  23.       外部コマンドファイル名は、パス名を含まない実行ファイルの大文字で
  24.     のファイル名です。C:\WINDOWS\BATTOOL.EXE であれば "BATTOOL" になり
  25.     ます(拡張子は取り除かれます)。
  26.  
  27.       このウィンドウのハンドルを FindWindow で取得して、メッセージを
  28.     SendMessage で送る事により、API の呼び出しが行なえます。
  29.  
  30. ハンドルの取得のコード例:
  31.  
  32. HWND    bhwnd;
  33.  
  34.     // Windowを見つける処理
  35.     if ( (bhwnd=FindWindow("WinBatchEhShell",
  36.             "WinBatchEhShell - WINTOOL")) == NULL ) { 
  37.         :
  38.         // WinBatchEh上から呼ばれてないときの処理
  39.         :
  40.     } 
  41.  
  42.     // 別のWinBatchEhが動作しているときの為にウィンドウタイトルを変更しておく
  43.     SetWindowText(bhwnd, "");
  44.  
  45.     SendMessage(bhwnd, API番号, [wParam], [lParam]);
  46.         :
  47.  
  48.  
  49. ★ API解説
  50.  
  51.       API はウィンドウハンドルに対して API 番号をメッセージで送る事に
  52.     より実現できます。wParam または lParam には必要であれば、パラメー
  53.     ターを設定します。
  54.  
  55.       数値の取得は SendMessage のリターン値が返答になります。
  56.  
  57.       数値の設定は wParam に数値を設定して SendMessage を呼び出します。
  58.  
  59.       文字列の設定、取得では lParam に 16 ビットバージョンでは
  60.     GlobalAlloc に DDE_SHARE のフラグを指定したグローバルハンド
  61.     ル(HGLOBAL)を、32 ビットバージョンでは CreateFileMapping に
  62.     PAGE_READWRITE のフラグを指定したハンドル(HANDLE)を
  63.     DuplicateHandle したものを指定します。
  64.  
  65. 数値の取得例:
  66.     return = SendMessage(hwnd, API-COMMAND, 0, 0L);
  67.  
  68. 数値の設定例:
  69.     SendMessage(hwnd, API-COMMAND, (WPARAM)数値, 0L);
  70.  
  71. 文字列の設定、取得例:
  72.  
  73.     16ビットバージョン:
  74.     hglobal=GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, SIZE);
  75.         :
  76.     globalptr=GlobalLock(hglobal);
  77.         :
  78.     SendMessage(hwnd, API-COMMAND, 0, hglobal);
  79.         :
  80.     GlobalUnlock(hglobal);
  81.     GlobalFree(hglobal);
  82.  
  83.     32ビットバージョン:
  84.     fhandle=CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, SIZE ,NULL);
  85.     GetWindowThreadProcessId(hwnd, &idprocess);
  86.     hprocess=OpenProcess(PROCESS_DUP_HANDLE, TRUE, idprocess);
  87.     DuplicateHandle( GetCurrentProcess(), fhandle, hprocess, &dhandle, 0, TRUE, DUPLICATE_SAME_ACCESS);
  88.         :
  89.     handleptr=MapViewOfFile(fhandle, FILE_MAP_ALL_ACCESS, 0, 0, 0)
  90.         :
  91.     SendMessage(hwnd, API-COMMAND, 0, dhandle);
  92.         :
  93.     CloseHandle(hprocess);
  94.     UnmapViewOfFile(handleptr);
  95.     CloseHandle(dhandle);
  96.     CloseHandle(fhandle);
  97.  
  98.       メモリ共有の考え方が違うため、lParam にパラメーターが必要なコマ
  99.     ンドについては 16 ビットバージョンと 32 ビットバージョンで互換があ
  100.     りませんので、それぞれのプラットフォーム用に実行ファイルを作成する
  101.     必要があります。
  102.  
  103.  
  104. ★API番号の一覧
  105.  
  106. #define WINBAT_API_VER      0x0202  // APIバージョン
  107.  
  108. #define WM_WB_GETVER        (WM_USER +  0)  // APIのバージョンを取得
  109. #define WM_WB_GETBATWNDFLAG (WM_USER + 10)  // バッチ実行ウィンドウフラグ取得
  110.                                 // 0:存在する 1:存在しない(非表示状態)
  111. #define WM_WB_GETREDIRECTOUTFLAG    (WM_USER + 11)  // リダイレクト出力フラグ
  112.                                 // 0:されていない 1:リダイレクトされている
  113. #define WM_WB_GETBATONMEMFLAG   (WM_USER + 15)  // バッチのオンメモリ処理フラグ
  114.                                 // 0:される 1:されない
  115. #define WM_WB_GETERRORLEVEL (WM_USER + 20)  // ERRORLEVELを取得
  116. #define WM_WB_SETERRORLEVEL (WM_USER + 21)  // ERRORLEVELを設定
  117. #define WM_WB_GETNOWLINE    (WM_USER + 30)  // 実行中の行番号を取得
  118. #define WM_WB_SETNOWLINE    (WM_USER + 31)  // 実行中の行番号を設定
  119. #define WM_WB_GETMAXLINE    (WM_USER + 35)  // バッチの最大行数を取得
  120. #define WM_WB_GETENV        (WM_USER + 40)  // 環境変数を取得
  121. #define WM_WB_PUTENV        (WM_USER + 41)  // 環境変数を設定
  122. #define WM_WB_GETENVALL     (WM_USER + 50)  // 全環境変数を取得
  123. #define WM_WB_PUTENVALL     (WM_USER + 51)  // 全環境変数を設定
  124. #define WM_WB_GETENVALLSIZE (WM_USER + 55)  // 全環境変数のサイズを取得
  125. #define WM_WB_GETBATNAME    (WM_USER +100)  // バッチファイル名を取得
  126. #define WM_WB_GETBATNOWLINE (WM_USER +110)  // 実行中のバッチ行を取得
  127. #define WM_WB_GETBATNUMLINE (WM_USER +115)  // 任意のバッチ行を取得
  128. #define WM_WB_PUTCHAR       (WM_USER +200)  // 1文字を表示
  129. #define WM_WB_PUTSTR        (WM_USER +201)  // 文字列を表示
  130. #define WM_WB_ERRPUTCHAR    (WM_USER +210)  // 1文字を強制的に表示
  131. #define WM_WB_ERRPUTSTR     (WM_USER +211)  // 文字列を強制的に表示
  132.  
  133.  
  134. ★バージョンによる違い(重要)
  135.  
  136.   ☆WinBatchEh 1.13で次の変更が行なわれました。
  137.  
  138.    o APIバージョンが 1.00 から 2.00 になりました。
  139.  
  140.       以前は API のコマンドを wParam で指定していましたが、32 ビットバ
  141.     ージョンで問題が起きるため、メッセージにコマンドを指定するようにな
  142.     りました。wParam は API のパラメータとして使用します。API 1.00 と
  143.     は互換が無くなりましたので注意してください。
  144.  
  145.       lParam の値はポインタではなく、ハンドルを指定するようになりまし
  146.     た。
  147.  
  148.       バッチ情報エリア(BatInfArea)はなくなりました。
  149.  
  150.   ☆WinBatchEh 1.18で次の変更が行なわれました。
  151.  
  152.    o APIバージョンが 2.00 から 2.01 になりました。
  153.  
  154.       文字列出力(WM_WB_PUTCHAR,WM_WB_ERRPUTCHAR)で書式指定を(例えば \g
  155.     を 0x07 などに)変換処理後、出力してしまっていたのを、変換せずにそ
  156.     のまま出力するようにしました。また、ラインフィード(0x0a)を出力して
  157.     も改行されないことがあるのを修正しました。
  158.  
  159.   ☆WinBatchEh 1.19で次の変更が行なわれました。
  160.  
  161.    o APIバージョンが 2.01 から 2.02 になりました。
  162.  
  163.       全環境変数の取得/設定の WM_WB_GETENVALLSIZE, WM_WB_GETENVALL,
  164.     WM_WB_PUTENVALL の API コマンドが追加されました。
  165.  
  166.  
  167. ★ APIの詳細
  168.  
  169. ☆WM_WB_GETVER            WinBatchEhのAPIのバージョンを取得
  170.  
  171.       API のバージョン番号を取得します。SendMessage のリターン値として、
  172.     API のバージョンが返ってきます。将来のバージョンアップのときに API
  173.     が増えた場合に、API のバージョンをチェックして動作の可否を決めるの
  174.     に使用します。
  175.  
  176.       現在は API のバージョンとして、0x0202(バージョン 2.02)が返ってき
  177.     ます。
  178.  
  179.       メジャーバージョン(小数点より前)の番号が違う場合は処理を中止する
  180.     ようにしてください。
  181.  
  182.     例:
  183.     int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  184.             LPSTR lpszCmd, int cmdShow)
  185.     {
  186.             :
  187.         WinBatchEhのウィンドウハンドルの取得の処理など
  188.             :
  189.         if ( ( SendMessage(bhwnd, WM_WB_GETVER, 0, 0L) & 0xff00 ) != 0x0200 ) {
  190.             MessageBox(hwnd, "バージョンエラー", "EXENAME", MB_OK);
  191.             return NULL;
  192.         }
  193.             :
  194.         実際の処理
  195.             :
  196.  
  197. ☆WM_WB_GETBATWNDFLAG        バッチ実行ウィンドウフラグ取得
  198. ☆WM_WB_GETREDIRECTOUTFLAG    リダイレクト出力フラグ取得
  199. ☆WM_WB_GETBATONMEMFLAG        バッチのオンメモリ処理フラグ取得
  200.  
  201.       WinBatchEh のフラグを取得します。SendMessage のリターン値として
  202.     フラグが返ってきます。
  203.  
  204.     WM_WB_GETBATWNDFLAG        バッチ実行ウィンドウフラグ取得:
  205.         0:存在する 1:存在しない(非表示状態)
  206.  
  207.     WM_WB_GETREDIRECTOUTFLAG   リダイレクト出力フラグ取得:
  208.         0:されていない 1:リダイレクトされている
  209.  
  210.     WM_WB_GETBATONMEMFLAG      バッチのオンメモリ処理フラグ取得:
  211.         0:される 1:されない
  212.  
  213. ☆WM_WB_GETERRORLEVEL        ERRORLEVELを取得
  214. ☆WM_WB_SETERRORLEVEL        ERRORLEVELを設定
  215.  
  216.       ERRORLEVEL の取得と設定を行ないます。
  217.  
  218.       WM_WB_GETERRORLEVEL(取得)の場合は SendMessage のリターン値として、
  219.     現在の ERRORLEVEL が返ります。
  220.  
  221.       WM_WB_SETERRORLEVEL(設定)を行なう場合は、wParam に数値を設定して
  222.     API を呼び出してください。
  223.  
  224.       なお、WinBatchEh ではコマンドが実行できたかどうかを ERRORLEVEL
  225.     に設定するようになっていますが、この API を使用して ERRORLEVEL の
  226.     設定を行なった場合はその処理を行なわずに、API での ERRORLEVEL を優
  227.     先するようになっています。
  228.  
  229. ☆WM_WB_GETNOWLINE        実行中の行番号を取得
  230. ☆WM_WB_SETNOWLINE        実行中の行番号を設定
  231. ☆WM_WB_GETMAXLINE        バッチの最大行数を取得
  232.  
  233.       現在実行を行なっている行番号の取得と設定、最大行数の取得を行ない
  234.     ます。行番号は一番始めの行が 0 になります。
  235.  
  236.       WM_WB_GETNOWLINE(取得)の場合は SendMessage のリターン値として、
  237.     現在実行している行番号(0~)が返ります。
  238.  
  239.       WM_WB_SETNOWLINE(設定)を行なう場合は、wParam に行番号(0~)を設定
  240.     して API を呼び出してください。
  241.  
  242.       WM_WB_GETMAXLINE(最大行数を取得)の場合は SendMessage のリターン
  243.     値として、バッチの最大行数が返ります(1~)。
  244.  
  245. ☆WM_WB_GETENV            環境変数を取得
  246. ☆WM_WB_PUTENV            環境変数を設定
  247.  
  248.       環境変数の取得と設定を行ないます。どちらの場合も lParam に 最後
  249.     が '\0'(0x00) で終わる文字列のハンドルを入れてください。
  250.  
  251.       WM_WB_GETENV(取得)を行なう場合は、文字列のハンドル内に取得したい
  252.     環境変数名を入れてください。そのハンドルに対して環境変数の内容を設
  253.     定します。環境変数の内容は、文字列の最後に '\0' が付いた形で代入が
  254.     行なわれます。もし環境変数が存在しなければ先頭が '\0' になります。
  255.  
  256.       WM_WB_PUTENV(設定)を行なう場合は、文字列を "NAME=strings" の様な
  257.     形にしてください。削除を行なう場合は "NAME=" のようにしてください。
  258.     正常に設定ができた場合はリターン値として 0 を返します。もし環境変
  259.     数の領域が足りない場合は -1 が返ります。
  260.  
  261. ☆WM_WB_GETENVALLSIZE        全環境変数の大きさを取得
  262. ☆WM_WB_GETENVALL        全環境変数を取得
  263. ☆WM_WB_PUTENVALL        全環境変数を設定
  264.  
  265.       すべての環境変数の取得と設定を行ないます。どちらの場合も lParam
  266.     に文字列のハンドルを入れてください。
  267.  
  268.       WM_WB_GETENVALLSIZE(サイズの取得)は、WM_WB_GETENVALL で必要にな
  269.     るサイズを SendMessage のリターン値としてバイト単位で返します。返
  270.     されるサイズは最大 64KB ですので、これ以上の大きさをあらかじめ確保
  271.     しているなら、サイズの取得は行なわなくても構いません。
  272.  
  273.       WM_WB_GETENVALL(取得)を行なう場合は、代入を行なうバッファ(文字列
  274.     のためのハンドル)を lParam に指定して SendMessage を行ないます。
  275.       環境変数の内容は、それぞれに文字列の最後に '\0'(0x00) が付いた形
  276.     で連続して代入が行なわれ、一番最後は '\0' が 2 つ続きます。例えば
  277.     "PATH=C:\\0PROMPT=$p$g\0...TMP=C:\TMP\0\0" のような感じになります。
  278.  
  279.       WM_WB_PUTENVALL(設定)を行なう場合は、それぞれの文字列を
  280.     "NAME=strings" の様な形で最後に '\0' が付いた形が連続したものを指
  281.     定してください。一番最後は '\0' を 2 つ続けてください。内部処理的
  282.     には、それぞれの環境変数を順に設定することを繰り返すだけですので、
  283.     完全に置き換わるわけではなく、すでに存在していて指定されなかった環
  284.     境変数は、以前のままになります。
  285.       削除を行なう場合は "NAME=" のようにしてください。すべての設定が
  286.     正常に設定ができた場合はリターン値として 0 を返します。もし環境変
  287.     数の領域が足りない場合は -1 が返ります。
  288.  
  289. ☆WM_WB_GETBATNAME        バッチファイル名を取得
  290.  
  291.       lParam に ハンドルを入れて呼び出すと、実行中のバッチファイル名を
  292.     コピーして、返ります。リターン値にはファイル名の文字数が返ります。
  293.     バッチファイル名は必ずフルパスで設定されます。
  294.  
  295.       バッチファイルは普通のバッチファイル以外に、WBATCP で EXE 化され
  296.     たファイルが処理されている場合がありますので、注意が必要です。
  297.  
  298. ☆WM_WB_GETBATNOWLINE        実行中のバッチ行を取得
  299. ☆WM_WB_GETBATNUMLINE        任意のバッチ行を取得
  300.  
  301.       lParam に ハンドルを入れて呼び出すと、実行中のバッチファイルの現
  302.     在行をコピーして、返ります。リターン値にはコピーした文字数が返りま
  303.     す(取得できない場合は -1 が返ります)。
  304.  
  305.       WM_WB_GETBATNUMLINE(任意のバッチ行を取得)では、wParam に行番号を
  306.     さらに入れて呼び出します。行番号は 0 から始まります。
  307.  
  308. ☆WM_WB_PUTCHAR            1文字をバッチ実行ウィンドウに表示
  309. ☆WM_WB_PUTSTR            文字列をバッチ実行ウィンドウに表示
  310. ☆WM_WB_ERRPUTCHAR        1文字を強制的にバッチ実行ウィンドウに表示
  311. ☆WM_WB_ERRPUTSTR        文字列を強制的にバッチ実行ウィンドウに表示
  312.  
  313.       それぞれ、バッチ実行ウィンドウに文字や文字列を表示します。
  314.     PUTCHAR, PUTSTR の場合はリダイレクト出力が行なわれていれば、ファイ
  315.     ルに出力を行ないます。
  316.  
  317.       1 文字出力の場合は wParam に文字コードを入れてください。
  318.  
  319.       文字列を出力する場合は lParam に 最後が '\0'(0x00) で終わる文字
  320.     列のハンドルを入れてください。文字列出力では自動的に改行を行ないま
  321.     せんので必要ならば '\n'(0x0a) を最後に指定してください。
  322.  
  323.  
  324. ★ 終わりに
  325.  
  326.       API を使用したプログラムとしては WBLHA があります。WBLHA のアー
  327.     カイブにはソースが付いてますので API を使用したプログラムを作成す
  328.     る場合にご参照頂ければと思います。
  329.