MSVCRT GetCommandLineW

提供:yonewiki

MSVC Runtimeリファレンスに戻る

概要

 Windowsアプリケーションでも、コンソールアプリケーションでもプログラム起動引数はコマンドとして発行されます。プログラム起動引数の処理が可能という事です。そこでより簡単に起動引数を取得するための命令が用意されています。最初の引数にはプログラムのパスがあるので、1つくらいは引数が取得できるでしょう。ちなみにmain関数の引数にもint argcとchar** argvを得ることが出来ますが、これはUTF-16ではないので、ワイド文字Unicodeで確実に受け取りたい時はこの関数を使うことになると思います。CommandLineToArgvWという関数が引数の個数を返すので、引数の文字列配列へのポインタを返すだけのGetCommandLineWはCommandLineToArgvWの引数として使われることが多くなります。


 以下のような定義になっています。

 LPWSTR* GetCommandLineW();

 例

 LPWSTR* argvUTF16 = CommandLineToArgvW(GetCommandLineW(), &argcUTF16);


 上記のようにすると、引数をうまく処理できます。MSVCRT CommandLineToArgvWの1番目の引数にはコマンドライン文字列を取得してその先頭アドレスが返されるような関数を指定しなければなりません。そのような関数としてGetCommandLineW()を指定する事にができます。processenv.hを読み込んでいる必要が有ります。2番目の引数に指定したint型のアドレスで起動引数の数を、戻り値として起動引数の文字列配列のポインタを取得できます。MSVCのCppプログラム内の文字は基本的にUTF-16の形式で扱われますので、CommandLineToArgvWはUTF-16の形式で文字列が取得きます。ここで取得した文字列ポインタでは、まだ文字列を取得できたとは言えない状態です。いくつかある文字列の配列の一番最初のアドレスを取得しただけです。単純にint argcUTF16; として実体化したの変数にアドレス演算子をつけて例のように第2引数にするとよいです。この変数に引数の数が格納されます。\0の配列が最後にあるので、1つめにアプリケーションの起動パスが引数となるならば、\0を含めて2個の引数があるという応答がなされるハズです。


 この処理が終わっても文字列配列全体の先頭だけしか取り出せていないので、MSVCRT std::for_eachのようなものを使って、引数の個別の値を操れる状態にするため、追加の処理を施す必要はあると思います。for_each以外のやり方でも良いと思います。

 

MSVC Runtimeリファレンスに戻る