MSVCRT CommandLineToArgvW 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(概要)
(概要)
 
2行: 2行:
  
 
=='''概要'''==
 
=='''概要'''==
 for_each関数は引数の第1から引数の第2までのIterator(要素番号)による管理がされているobject全てに対して引数3の関数を実行する関数です。引数3の関数は通常ラムダ式を使って、第一引数の値から複数の実行コマンドと戻り値を記載します。引数1から引数2までのobjectは関数の引数として第3引数の関数の引数として受け取ることが出来ます。ラムダ式で記述する場合は[]()->(){}の手前の()内で引数を引数の第1~第2引数の型と対応が取れる必要があります。[]の中に書くキャプチャ(for_eachの外で使っていた変数を受け取る部分) ->() の()内で指定するのが、戻り値の型と変数名、{}内には、関数そのもの、要するにプログラムを記述します。
+
 Windowsアプリケーションでも、コンソールアプリケーションでもプログラム起動引数はコマンドとして発行されます。プログラム起動引数の処理が可能という事です。そこでより簡単に起動引数を取得するための命令が用意されています。最初の引数にはプログラムのパスがあるので、1つくらいは引数が取得できるでしょう。ちなみにmain関数の引数にもint argcとchar** argvを得ることが出来ますが、これはUTF-16ではないので、ワイド文字Unicodeで確実に受け取りたい時はこの関数を使うことになると思います。
  
  
 
 例えば、以下のように定義して使います。
 
 例えば、以下のように定義して使います。
  
 <span style = "background:linear-gradient(transparent 75%, #ffbf7f 75%); font-weight:bold; "><span style="color:deeppink;">LPWSTR * </span><span style="color:bule;">CommandLineToArgvW</span>(</span><span style="color:deeppink;">LPCWSTR</span> lpCmdLine, <span style="color:deeppink;">int*</span> pNumArgs);</span>
+
 <span style = "background:linear-gradient(transparent 75%, #ffbf7f 75%); font-weight:bold; "><span style="color:deeppink;">LPWSTR* </span><span style="color:blue;">CommandLineToArgvW</span>(<span style="color:deeppink;">LPCWSTR</span> lpCmdLine, <span style="color:deeppink;">int*</span> pNumArgs);</span>
  
 
 例
 
 例
  
 <span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; "><span style="color:blue;">std::for_each</span>(argvUTF16, argvUTF16 + argcUTF16, </span><br />
+
 <span style="background:linear-gradient(transparent 75%, #ffbf7f 75%); font-weight:bold; "><span style="color:deeppink;">LPWSTR* </span>argvUTF16 = <span style="color:blue;">CommandLineToArgvW</span>(GetCommandLineW(), &argcUTF16);</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; ">[&argvUTF8Q](<span style="color:deeppink;">const auto&</span> arg) { </span><br />
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; ">argvUTF8Q<span style="color:blue;">.emplace_back</span>(<span style="color:blue;">QString::fromUtf16</span>(<span style="color:deeppink;">reinterpret_cast<const char16_t*></span>arg, -1)<span style="color:blue;">.toUtf8</span>());</span><br />
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; ">}</span><br />
+
&nbsp;&nbsp;&nbsp;<span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; ">);</span>
+
  
  
 +
 上記のようにすると、1番目の引数にはコマンドライン文字列を取得してその先頭アドレスが返されるような関数を指定しなければなりません。この命令の前であらかじめそのワイド文字ポインタを持つ変数があれば、変数でもよいです。通常は例のように[[MSVCRT GetCommandLineW|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以外のやり方でも良いと思います。
  
 
 
 
 
  
 
[[Windows#MSVC Runtimeリファレンス|MSVC Runtimeリファレンス]]に戻る
 
[[Windows#MSVC Runtimeリファレンス|MSVC Runtimeリファレンス]]に戻る

2021年2月12日 (金) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス