アプリ版:「スタンプのみでお礼する」機能のリリースについて

ちょっとした変換ツールを作ろうと思い、ダイアログベースの
MFCアプリケーションを作成しました。

OKボタンが押された時にCreateProcess()で子プロセスを
起動して、終了したら結果表示して親プロセスも終了する
様にしようと思ったのですが、結果表示までは正常に
実行されるのですが、親プロセスが終了しません。

恐らくCreateProcess()に渡す引数が悪いのだと思うのですが、
どなたかわかる方がいらしたらご教示願います。

void CMscGenSelectorDlg::OnBnClickedOk()
{
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory( &si, sizeof si );
  si.cb = sizeof si;
  ZeroMemory( &pi, sizeof pi );

  // 子プロセス起動
  CreateProcess(
    NULL,                // モジュール名
    _T("mscgen.exe -Tpng hoge.msc"),  // コマンドライン
    NULL,                // セキュリティ記述子
    NULL,                // セキュリティ記述子
    FALSE,               // ハンドルの継承オプション
    0,                 // 作成のフラグ
    NULL,                // 新しい環境ブロック
    NULL,                // カレントディレクトリ名
    &si,                // スタートアップ情報
    &pi);                // プロセス情報

  // 子プロセス終了待ち
  WaitForSingleObject( pi.hProcess, INFINITE );
  CloseHandle( pi.hProcess );
  CloseHandle( pi.hThread );

  // シーケンスチャート表示
  ShellExecute( NULL, _T("open"), _T("hoge.png"), NULL, NULL, SW_SHOW );
  // 終了
  OnOK();
}

A 回答 (2件)

問題の解決として次の点を試してください。


1.子プロセスは起動しているのか?
CreateProcessの戻り値は何ですか
2.子プロセスは終了しているか?
タスクマネージャでプロセスが消えますか

この回答への補足

子プロセス(mscgen.exe)は起動して、それによって生成された
PNG画像もその後のShellExecute()で表示されています。
実際のソースでは、
if( !CreateProcess(...) ) {
  エラー処理;
  return;
}
としていますので、TRUEが返って来ていると思います。

補足日時:2012/02/25 01:53
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
タスクマネージャの件は、会社にしかVCがないため、
現在は確認ができませんので、申し訳ありませんが、
月曜日に補足させて頂きます。

お礼日時:2012/02/25 01:53

実はボタンを複数回押してしまった。

とか…。
OSに応答なしプロセスとして無視されている。とか…。

この回答への補足

結論から言いますと、プロジェクトのプロパティで文字セットを
変更したら親プロセスも終了するようになりました。

当初、プロジェクト生成時のデフォルトのまま「Unicode文字
セットを使用する」にしていたのですが、「マルチバイト文字
セットを使用する」に変更して、関数や関数の引数をそれに
合わせて変更したら無事終了できました。

Unicodeを使う設定の時の子プロセスの起動には何か注意が
必要なのでしょうか?

補足日時:2012/02/28 01:44
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
unicode環境でのプロセス呼び出しについては、
もう少し自分で調べて分からなければ別途質問
したいと思います。

お礼日時:2012/03/06 10:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!