2010年01月30日

2010年01月30日:wxWidgets と system() 関数

 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 にて公開中。リンクは張りません。探せばすぐに見つかるとは思うけど。

Posted at 2010年01月30日 16:52:15
email.png