wxWidgets のアプリ開発、Windows の system()
関数でハマってしまった。コマンドラインのツールを呼び出すのだが、インストールパスに空白が入っている時の処理でつまづいた。まず、ツールが C:\Program Files\MyApp\Tools\bin
にあるとき、呼び出す時は引用符で包まないと Program
の直後で分割されてしまう。
system("\"C:\Program Files\MyApp\Tools\bin\mytool\" arg1 arg2");
これは普通のテクニックだが、問題は引数にも空白が入っている場合。サポートファイルがC:\Program Files\MyApp\Tools\dat
にあるとき、普通はコマンド名と引数をそれぞれ引用符で包んで、下のようにすればいいのだが:
system("\"C:\Program Files\MyApp\Tools\bin\mytool\" \"C:\Program Files\MyApp\Tools\dat\myfile.dat\"");
Windows ではアウト。この場合、cmd.exe
は「両端の」引用符を取り除いて、下のようなコマンドラインと解釈してしまい、「C:\Program
が見つかりません」というエラーになってしまう。
C:\Program Files\MyApp\Tools\bin\mytool" "C:\Program Files\MyApp\Tools\dat\myfile.dat
正解は、もう1回全体を引用符で包んで、下のようにすること。
system("\"\"C:\Program Files\MyApp\Tools\bin\mytool\" \"C:\Program Files\MyApp\Tools\dat\myfile.dat\"\"");
なんちゅう謎仕様や。そもそも、こんな面倒なことになるのは「標準のインストールパス」C:\Program Files
に空白が入っているからなんだよな。Microsoft 意地悪すぎ。
本アプリは sourceforge.jp にて公開中。リンクは張りません。探せばすぐに見つかるとは思うけど。