0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

c++ builder XE4, 10.2 Tokyo > 他のアプリを開く > access violationが出た > ZeroMemory()したら回避できた

Last updated at Posted at 2015-12-18
動作確認
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);
実行直後に以下のエラーが出ている。調査中。

qiita.png

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の方法にしておくのが良いだろう。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?