動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
注意
(追記 2018/11/14)
以下で使用しているZeroMemoryは最適化で吹き飛ぶため、SecureZeroMemory()の使用が推奨されます。
内容
http://qiita.com/7of9/items/e95f72ce80a8807018fb
で作成したアプリをchildProject.exeという名前に変更して、それを別アプリから開く。
他のアプリを起動する
XE4
try1 > access violation
Unit1.cpp
void __fastcall TParentForm::App_openOther()
{
String param = L"/caption=Test_1_B_C";
String progname = L"childProject.exe";
if (FileExists(progname) == false) {
ShowMessage(L"childProejct.exe not found");
return;
}
TShellExecuteInfo sinfo;
sinfo.cbSize = sizeof(sinfo);
sinfo.hwnd = 0; // Desktop
sinfo.fMask = SEE_MASK_FLAG_DDEWAIT;
sinfo.lpFile = progname.c_str();
sinfo.lpParameters = param.c_str();
sinfo.lpVerb = L"";
sinfo.nShow = SW_SHOWNORMAL;
ShellExecuteEx(&sinfo);
// 起動待ち
WaitForInputIdle(sinfo.hProcess, INFINITE);
}
void __fastcall TParentForm::Button1Click(TObject *Sender)
{
App_openOther();
}
//---------------------------------------------------------------------------
ShellExecuteEx(&sinfo);
実行直後に以下のエラーが出ている。調査中。
try2 > no error
http://www.usefullcode.net/2006/12/post_34.html
が参考になった。
Unit.cpp
__fastcall TParentForm::TParentForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TParentForm::App_openOther()
{
String param = L"/caption=Test_1_B_C";
String progname = L"childProject.exe";
if (FileExists(progname) == false) {
ShowMessage(L"childProejct.exe not found");
return;
}
TShellExecuteInfo sinfo;
#if 1
::ZeroMemory(&sinfo,sizeof(SHELLEXECUTEINFO));
#endif
sinfo.cbSize = sizeof(sinfo);
sinfo.hwnd = 0; // Desktop
sinfo.fMask = SEE_MASK_FLAG_DDEWAIT;
sinfo.lpFile = progname.c_str();
sinfo.lpParameters = param.c_str();
sinfo.lpVerb = L"";
sinfo.nShow = SW_SHOWNORMAL;
ShellExecuteEx(&sinfo);
// 起動待ち
WaitForInputIdle(sinfo.hProcess, INFINITE);
}
void __fastcall TParentForm::Button1Click(TObject *Sender)
{
App_openOther();
}
//---------------------------------------------------------------------------
#if 1
で囲った部分があると上記のエラーがでない。
sinfoのメンバ変数に未初期化の値が入っていることによりエラーとなっていたようだ。
10.2 Tokyo
10.2 Tokyoの場合、try1でもaccess violationにはならなかった。
念のためにはtry2の方法にしておくのが良いだろう。