BorlandC++メモ2

外部プロセスの起動

	STARTUPINFO sInfo;         // ステータス情報(実行設定)
	PROCESS_INFORMATION pInfo; // プロセス情報(実行結果)
	ZeroMemory(&sInfo, sizeof(sInfo));
	ZeroMemory(&pInfo, sizeof(pInfo));

	sInfo.cb = sizeof(sInfo);
	// Windows95対応
	MSG msgDummy;
	PeekMessage(&msgDummy, NULL, 0, 0, PM_NOREMOVE);

	if(!CreateProcess(
		NULL,          // モジュール名称
		"notepad.exe", // コマンドライン文字列
		NULL,          // セキュリティ記述子
		NULL,          // セキュリティ記述子
		TRUE,          // ?
		0,             // ?
		NULL,          // ?
		NULL,          // カレントディレクトリ
		&sInfo, &pInfo))
	{
		ShowMessage("実行に失敗しました");
	}

	// プロセス終了を待つ場合、コメントを外す
	// WaitForSingleObject(pInfo.hProcess, INFINITE);
	
	// プロセスハンドラを閉じる
	CloseHandle(pInfo.hProcess);
	CloseHandle(pInfo.hThread);

外部プロセスの起動(標準出力を書き出す場合)

	SECURITY_ATTRIBUTES sAttr;
	sAttr.lpSecurityDescriptor = NULL;
	sAttr.nLength              = sizeof(sAttr);
	sAttr.bInheritHandle       = TRUE;
	// ファイルハンドラの取得
	HANDLE hFile = CreateFile(
		ChangeFileExt(Application->ExeName, ".log").c_str(), // 実行ディレクトリにログファイルを出力
		GENERIC_WRITE,
		FILE_SHARE_READ,
		&sAttr,
		CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,
		NULL);

	STARTUPINFO sInfo;         // ステータス情報(実行設定)
	PROCESS_INFORMATION pInfo; // プロセス情報(実行結果)
	ZeroMemory(&sInfo, sizeof(sInfo));
	ZeroMemory(&pInfo, sizeof(pInfo));

	sInfo.cb = sizeof(sInfo);
	// コンソール画面を出したくない場合、以下のコメントを外す
	//sInfo.dwFlags =
	//	STARTF_USESHOWWINDOW     // wShowWindowフラグを使用する
	//	| STARTF_USESTDHANDLES;  // hStdOutputフラグを使用する
	//sInfo.wShowWindow = SW_HIDE; // ウィンドウを表示しない

	// Windows95対応
	MSG msgDummy;
	PeekMessage(&msgDummy, NULL, 0, 0, PM_NOREMOVE);
	
	sInfo.hStdOutput = (void*)hFile; // 標準出力にファイルハンドラを設定
	sInfo.hStdError  = (void*)hFile; // エラー出力にファイルハンドラを設定

	if(!CreateProcess(
		NULL,          // モジュール名称
		"console.exe", // コマンドライン文字列
		NULL,          // セキュリティ記述子
		NULL,          // セキュリティ記述子
		TRUE,          // ?
		0,             // ?
		NULL,          // ?
		NULL,          // カレントディレクトリ
		&sInfo, &pInfo))
	{
		ShowMessage("実行に失敗しました");
	}

	// プロセス終了を待つ場合、コメントを外す
	// WaitForSingleObject(pInfo.hProcess, INFINITE);
	
	// プロセスハンドラを閉じる
	CloseHandle(pInfo.hProcess);
	CloseHandle(pInfo.hThread);
    CloseHandle(hFile);