- 締切済み
外部アプリケーションの起動について
Windows 7 32ビット機で、VC++ 2010 Express を利用して Windowsフォームアプリケーションを作成しております。文字コードはマルチバイト文字を選択しました。 アプリケーション自体は、メニュー画面にいくつかのボタンを設け、押下すると所定の実行ファイルが起動するといった非常に簡単なものです。 外部アプリケーションの起動方法ですが、ShellExecute()関数またはCreateProcess()関数を使用するのが一般的との事ですので、今回はCreateProces()関数を使うことにしました。大きな理由は、アプリケーションの実行待機機能が使いたかったためです。 とくに問題なくビルドが完了し実行してみたところ、殆どのアプリケーションは起動できるのですが、ひとつだけ起動できないものがありました。正確には、起動できないというよりは、タスクマネージャーにより起動されていることは確認できるのですが、バックグラウンドで動作するかのように肝心の画面が表示されません。 この状態になると(主プロセスである?)メニュー画面の制御がきかず(応答なし状態)、タスクマネージャーにより強制終了すると、ここでやっと表示されなかった画面が表示されるといった具合です。 何故このような現象が起こるのか、どのようにすれば解決するのかわかりません。誠に恐れ入りますがご教示賜りたく、何卒よろしくお願いいたします。 なお、下記にご参考となり得る情報を記載します。 1. 関数部分の記述は以下のとおりです。 rVal = CreateProcess ((LPTSTR)Fname, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); Fnameは、フルパスのファイル名がセットされたchar型変数で、ここでは第1引数に記述していますが、第2引数に記述した場合でも結果は同じです。 2. 上記の(LPTSTR)の記述はおまじない的なもので、この記述が無くても挙動は変わりません。どこかの記事で、Windows 7 で動作しない場合の対応と紹介されていましたので。 3. 実行ファイルは、R社のプリンタドライバーのインストーラ(.exe)です。 4. Z社のプリンタドライバーのインストーラやその他のアプリケーション(.exe)は問題なく動作します。 5. メニュー画面には複数のボタンがありますが、対応するロジックはすべて同じで、Fnameにセットされた値のみ異なります。 6. ShellExecute()関数を利用すると、問題なく動作します。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- davidfox
- ベストアンサー率58% (21/36)
何も判りませんが、ShellExecute()関数で成功するならば、違いはウィンドウ絡みを疑います。 自分なら ShellExecute の nShowCmd を変えてみて何が必要か推測します。
お礼
結局、ShellExecute()関数でパラメータを変えてみましたが、いずれもまったく動作は変わりませんでした。 また、Windows 8.1でも、同様の不具合が発生することもわかりましたが、期待どおりに動作することもしばしばありました。 そこで、CreateProcess()関数でもパラメータのみならず、ソースコード自体もいろいろと変えてテストを行いましたところ、どうやら子プロセスの終了待機に問題があることが判明しました。 即ち、WaitForSingleObject()を使用していましたが、この部分を外すか、直前にダイヤログメッセージを表示してやると本件現象が回避されるのです。 そこでMicrosoft社のWaitForSingleObject()関数解説を読み直してみたところ、最後の方に注意書きがあり、ウィンドウを作成するスレッドではMsgWaitForMultipleObjects()関数等を使用せよという主旨の記述がありました。 早速この部分を修正してみたところ、今度は期待どおりに動作することが確認されました。 なお、何故Windows8.1では動作したのかは現在のところ謎ですので、今後調べてみることにします。 「いろいろ試行してみろ」というアドバイスのおかげをもちまして本件解決に至り、誠にありがとうございました。
補足
davidfox 様 アドバイスありがとうございました。 手元にWindows 7 32ビットOS機がないので、ShellExcute()関数での試行ができていませんが、来週にでも職場で行ってみます。皮肉にも、実行するプリンタドライバーのインストーラが64ビットOSには非対応なのでエラーとなり、その時点で親プロセスには正常終了の戻り値が返ります。 なお、さらに新しい現象が発生しました。 何と、Windows 8.1 では正常に動作したのです。 Vista はありませんが、XP/Server 2003/2008 などは手元にありますので、こちらでも試してみます。 まずは、ご報告まで。