エスケープ処理

コマンドラインのパラメータのargcやargvは、WinMainの引数には無いけれど、CRTの方で?__argcや__argvを用意してくれている。

今作っているプログラムで、コマンドラインで受けたパラメータを他プロセスに渡して処理する事があるので、それならば分解しないでそのまま送る事にした。でも各プロセスでパラメータを利用する場合に区切り処理が必要になるし、区切り処理を共通化するが出てくる。

WindowsAPIで、コマンドライン文字列をargc, argvに変換する関数で、CommandLineToArgvWというAPIが存在するけれど、
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/commandlinetoargv.asp
Unicode版のしか存在しないので、ASCIIやMBCSの文字列を処理する際にはUnicodeに変換して処理してからまた変換する、とかが必要になってしまう。

それはちょっと避けたいので、代替するものが無いかなと探したところ、以下のものが見つかった。
http://techtips.belution.com/ja/vc/0084/
http://www.alter.org.ua/docs/win/args/index.php?lang=en&

後者の実装はメモリ確保が初めだけなのが良いと思う。それに前者より読みやすい。確保の関数にGlobalAllocを使っているのは謎。これはmallocのが良いなぁ…。(多分下層で使うとかでmallocが使えない環境で動かす事を考慮したのかも。でもVirtualAllocじゃ駄目なんだろうか。あれだと無駄に多く確保しちゃうとかかな。)あとAとWを使い分けるのが面倒なので、C++オーバーロードさせたinline関数も用意してライブラリとして使う事にした。

CodeProjectに色々とコマンドライン文字列を読み取ってパラメータを得るライブラリがある。argcとargvを材料として使うものと、まんまのコマンドライン文字列を要求するものとに分かれる。argcとargvを材料とするもののほうが、ライブラリ単体の処理の内容が少なくなる分だけシンプルな実装にしやすいだろうし、差し替えたりの融通も利くので個人的には好き。まんまのコマンドライン文字列を要求するものは、場合によっては必要とする事もあるかもしれないけれど、実装や改変のコストが少し高くなると思う。