ページ 11

system関数の変数指定

Posted: 2012年3月04日(日) 21:38
by インベントリ
VC++2010でのsystem関数の実行についての質問です。
.exeファイルをダイアログから指定し、system(○○.exe)で実行したいと思っています。
調べながらSystem::Stringをchar*へ変換する工程を入れ、以下のようなプログラムを作成しました。

コード:

OpenFileDialog^ dlg = gcnew OpenFileDialog();
dlg -> Filter = "実行ファイル (*.exe)|*.exe";
if(dlg -> ShowDialog() != System::Windows::Forms::DialogResult::OK){
  return;
}
System::String^ strfn = dlg->FileName;
char* sysfile = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(strfn).ToPointer();
system(sysfile);
System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr(sysfile));
このようにして実行したところ、内部コマンドまたは外部~が表示されました。
調べたところ、括弧内をcmd.exeに送るだけなので問題があるということがわかりました。
そこで、

コード:

system("\"C:\\test.exe\"");
このように直接指定して実行したところ成功しました。
ここからが質問なのですが、上のコード内の「C:\\test.exe」の部分を変数で指定するようにするにはどうしたらいいのでしょうか?
dlg->FileName内には「C:\test.exe」が入っているのを確認しました。
教えていただけるとうれしいです。

Re: system関数の変数指定

Posted: 2012年3月05日(月) 09:08
by beatle
Visual C++ で System::String* から char* に変換する方法
このウェブページの情報が役に立つのではないでしょうか。

Re: system関数の変数指定

Posted: 2012年3月05日(月) 10:09
by YuO
インベントリ さんが書きました:ここからが質問なのですが、上のコード内の「C:\\test.exe」の部分を変数で指定するようにするにはどうしたらいいのでしょうか?
APIにはPathQuoteSpacesというものがありますが,それを呼び出すまでもなく,

コード:

String^ strfn = String::Format("\"{0}\"", dlg->FileName);
と,単純に"で囲うだけで十分でしょう。

C++/CLIなので,System::Dialognostics::Process::Startで処理すれば,C文字列への変換も,文字列を囲む処理も不要になりますが……。

Re: system関数の変数指定

Posted: 2012年3月05日(月) 15:38
by インベントリ
情報ありがとうございます。
YuO様の方法で解決しました。
System::Dialognostics::Process::Startを使うことでもっとシンプルになるということで、勉強してみたいと思います。
ありがとうございました。