Version 8.05
コマンドラインと表示方法
「さて、今回は WinMain() の残りふたつの引数、それと戻り値について見
ていきましょう」
『インスタンスハンドルは3回もやったのに……』
「これはインスタンスハンドルに比べればそれほど重要じゃないから。まぁ
それなりには重要だけど、たぶんすぐ使わないし」
『ってゆーか、 MFC 使ってたときは使ってなさそうな感じだし』
「確かにそうかも。じゃ、まずは第3引数から」
#include <Windows.h>
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
MessageBox( NULL, p_pchCmdLine, "WinMain()", MB_OK );
return 0;
}
『第3引数の p_pchCmdLine を直接メッセージボックスで出してるのね』
「そう。で、実行してみると?」
『……なんか空欄だけど』
「このままだと空欄なんです。で、【プロジェクトの設定】ダイアログの
【デバッグ】−【一般】の【プログラムの引数】って所になんかテキトー
に書き込んでみて」
『んじゃ MizukiChan っと』
「それで実行すると」
『うお、 メッセージボックスに MizukiChan って出た!』
「もうひとつ例を見てもらおうかな。えっとね、 Debug\SimpleDialog.exe
のショートカットを作って」
『ほい作ったよ』
「そのプロパティの【ショートカット】ページの【リンク先】は」
『さっきのだから』
C:\PROGRAM\SimpleDialog\Debug\SimpleDialog.exe
『ってなってるよ。実行ファイルのフルパスってヤツだよね』
「そうそう、フルパス。これを」
C:\PROGRAM\SimpleDialog\Debug\SimpleDialog.exe KamiChan
「ってして OK で閉じて、このショートカットをダブルクリックして実行し
てみて」
『ほいダブルクリック。お、今度はメッセージボックスに KamiChan って出
た!』
「これとさっきのは同じことだっていうのがまず重要。さっきの【プログラ
ムの引数】に文字列を書くと、実行したときにその文字列を一緒にくっつけ
て実行してくれるんです」
『一緒にくっつけて?』
「そう、さっきのショートカットの例みたいにね。実行ファイルを実行する
ときには、さっきみたいにスペースを入れて、いくつも文字列をくっつけて
実行できるんです」
『でもそれに何の意味が……あ! そっか、それが p_pchCmdLine に入って
るんだ!』
「そゆこと。関数に引数を渡して呼べるでしょ、それと同じように、こうい
うふうにしてアプリを実行するときに引数を渡すことができるんです」
『ほー』
「ま、この辺は普通のウィンドウズアプリだとあんまり使わないんだけど」
『じゃあ何で使うの?』
「 MS-DOS とか UNIX 系とか」
『……なんか難しそう……』
「でもこの辺は将来的には避けて通れない、んだけど、まぁ今はとりあえず
いいから」
『ほっ』
「今は、こういうふうに実行するときにスペース明けて文字列を入れると、
WinMain() の引数に入ってるってことだけ憶えておいて」
『ほーい。あ、 MFC の時はどうするの?』
「 MFC に限らず、 GetCommandLine() って API でいつでも取り出せるか
ら」
#include <Windows.h>
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
// 引数から。
MessageBox( NULL, p_pchCmdLine, "WinMain()", MB_OK );
// API から。
MessageBox( NULL, GetCommandLine(), "WinMain()", MB_OK );
return 0;
}
『ほい実行。あれ? まんま同じじゃないね。 GetCommandLine() には実行
ファイルのフルパスが入ってる。それが " で囲まれてるし』
「こっちが本来の【コマンドライン】だからね」
『こまんどらいん?』
「命令なんかをコマンドって言うでしょ」
『なんか昔のSFチック』
「そうかな……で、アプリの実行なんかもコマンドの一種って考えて、その
実行ファイルのフルパスとその引数を含めた1行を【コマンドライン】って
言うんです」
『ふーん』
「ま、その辺はさっき言ったあとで教える部分と一緒の方が分かりやすいか
ら今はパス」
『あっと、あと " で囲まれてるのってなんで?』
「ファイル名やフォルダ名にスペース使えるから」
『あ”、そういえばそうだね。 Program Files とか』
「 " で囲まないと、どこまでがアプリの引数で、どこまでがパラメーター
か分からないからねー」
『なるほど……』
「ちなみに、ただ実行ファイルのフルパスが欲しい場合には
GetModuleFileName() って API があるから」
#include <Windows.h>
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
char pchAppPath[MAX_PATH];
GetModuleFileName( NULL, pchAppPath, MAX_PATH - 1 );
MessageBox( NULL, pchAppPath, "WinMain()", MB_OK );
return 0;
}
『結構便利なのねー』
「あと、たとえば〈今画面に表示されてるアプリの実行ファイルを知りた
い〉って場合には GetModuleFileName() は使えないから注意してね」
『なんで? リファレンス見ると、 GetModuleFileName() の第1引数にア
プリのインスタンスハンドルを……あ』
「そゆこと」
『インスタンスハンドルじゃどのアプリっつーかどのプロセスがっていうの
は分かんないんだもんね』
「この辺は結構難しい部分かもね。ま、これもまた今度ってことで。次は最
後の引数、 p_iCmdShow について」
#include <Windows.h>
#include <stdio.h>
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
char pchMsg[1024];
sprintf( pchMsg, "p_iCmdShow : %d", p_iCmdShow );
MessageBox( NULL, pchMsg, "WinMain()", MB_OK );
return 0;
}
『 1 って出た』
「ま、これだけじゃ何が何やらだよね。そこで、さっきのショートカットを
使います。これを普通に実行して」
『同じ 1 って出た』
「次に、プロパティの【ショートカット】ページの【実行時の大きさ】を
【最小化】にして実行すると」
『うお、 7 になった!』
「最大化だと」
『 3 っつーかメッセージボックスが最大化した!!』
「こういう、どの大きさで表示して欲しいのかっていうパラメーターがこの
第4引数に入ってます」
『これはなんかの API で取れる?』
「うん、 GetStartupInfo() って API で。これはちょっと面倒だからパ
ス」
『ま、どれもここで取ればいいんだからあんまり気にしなくてもいいのかも
しれないけど。あ、そういえば、これって何に使うの?』
「今のメッセージボックスは勝手に大きくなっちゃったけど、ホントはこの
パラメーターを調べて、ウィンドウやダイアログを表示するときに色々変え
たり、もしくは無視したり」
『無視してもいいの?』
「ダイアログのほとんどは最大化しないでしょ」
『そういえば……』
「この辺は、あとで実際にダイアログやウィンドウを作ったときにね」
『じゃ、最後に戻り値!』
「とりあえず今の状態で実行して」
『ほい実行』
「終了したときに、アウトプットウィンドウに」
プログラム 'C:\PROGRAM\SimpleDialog\Debug\SimpleDialog.exe' は
コード 0 (0x1) で終了しました。
「って出てるでしょ」
『うん、なってる』
「じゃ、プログラムの最後の戻り値、今は 0 になってるからこれを 1 にし
て実行して」
『ほい実行』
プログラム 'C:\PROGRAM\SimpleDialog\Debug\SimpleDialog.exe' は
コード 1 (0x1) で終了しました。
『お、さっきは〈コード 0 〉だったのに今度は〈コード 1 〉になった!』
「こういうふうに、 WinMain() の戻り値は【終了コード】になるんです」
『おお。って、これ何に使うの?』
「うーん、これもコマンドラインと同じで、ウィンドウズアプリではあまり
使わないんだよね。使う時には、成功時と終了時とで戻り値を変えて、それ
に合わせて処理を変えるとか」
『? 関数みたいね』
「そう、昔のアプリは、今と違って関数っぽかったんです。その辺はまた先
の話ってことで」
『なんか、まったく違う世界が垣間見えた気がする……』
/*
Preview Next Story!
*/
『ってゆーかなんか地味!』
「この辺はウィンドウズプログラミングとは縁遠いからねぇ」
『なんかカラフルで綺麗なのやりたい!』
「じゃ、リソースは?」
『そうそう、アイコンとかそういうの!』
「でも来週は地味です」
『げ!』
「というわけで次回」
< Version 8.06 リソースを用意しよう! >
『につづく!』
「カラフルなリソースも、地味な技術の上に成り立ってるのです」
『そんなこと知りたくないー!』