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()関数を利用すると、問題なく動作します。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
何も判りませんが、ShellExecute()関数で成功するならば、違いはウィンドウ絡みを疑います。
自分なら ShellExecute の nShowCmd を変えてみて何が必要か推測します。
この回答への補足
davidfox 様
アドバイスありがとうございました。
手元にWindows 7 32ビットOS機がないので、ShellExcute()関数での試行ができていませんが、来週にでも職場で行ってみます。皮肉にも、実行するプリンタドライバーのインストーラが64ビットOSには非対応なのでエラーとなり、その時点で親プロセスには正常終了の戻り値が返ります。
なお、さらに新しい現象が発生しました。
何と、Windows 8.1 では正常に動作したのです。
Vista はありませんが、XP/Server 2003/2008 などは手元にありますので、こちらでも試してみます。
まずは、ご報告まで。
結局、ShellExecute()関数でパラメータを変えてみましたが、いずれもまったく動作は変わりませんでした。
また、Windows 8.1でも、同様の不具合が発生することもわかりましたが、期待どおりに動作することもしばしばありました。
そこで、CreateProcess()関数でもパラメータのみならず、ソースコード自体もいろいろと変えてテストを行いましたところ、どうやら子プロセスの終了待機に問題があることが判明しました。
即ち、WaitForSingleObject()を使用していましたが、この部分を外すか、直前にダイヤログメッセージを表示してやると本件現象が回避されるのです。
そこでMicrosoft社のWaitForSingleObject()関数解説を読み直してみたところ、最後の方に注意書きがあり、ウィンドウを作成するスレッドではMsgWaitForMultipleObjects()関数等を使用せよという主旨の記述がありました。
早速この部分を修正してみたところ、今度は期待どおりに動作することが確認されました。
なお、何故Windows8.1では動作したのかは現在のところ謎ですので、今後調べてみることにします。
「いろいろ試行してみろ」というアドバイスのおかげをもちまして本件解決に至り、誠にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- デスクトップパソコン windows7を使っているパソコンでの質問です。先日動作が遅く再起動かけると「windowsを起動 9 2022/06/16 21:31
- BTOパソコン 数時間使用しない状態からPCを起動に失敗後、 自動修復画面で再起動をすると正常に動き出す 3 2022/09/26 22:01
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- Windows Vista・XP windows xp proが起動しなくなりました 10 2022/05/20 00:49
- Windows 10 (緊急)windowsのタスクバーやアプリ?が反応しない 3 2023/03/28 05:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba アプリケーションが立ち上...
-
現在起動中のアプリケーション...
-
VB.NETでフォームアクティブの...
-
自分自身を更新するプログラム
-
httpd.pidって何ですか?
-
OSの”シャットダウン中”のステ...
-
外字文字の登録
-
vb6で異なるのプロジェクト間で...
-
タスクマネージャーの表示が・・
-
C#で共有変数の定義をするには
-
フレームワーク「4.8.1」で、[S...
-
LINUX QTで作成したCSVファイル
-
VB.NETでMessageBoxを表示した...
-
Accessフォームからの外部アプ...
-
Java Web Start アプリケーショ...
-
イラストレーターCS4のシリアル...
-
Console Applicationをタスクト...
-
VBSでのSendKeysでの画面の最小化
-
実行時のコマンドプロンプトを...
-
プログラムの二重起動防止
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Vba アプリケーションが立ち上...
-
VBSでのSendKeysでの画面の最小化
-
コンソールアプリケーションの...
-
フレームワーク「4.8.1」で、[S...
-
WSH(VBScript)でアプリケーショ...
-
Accessフォームからの外部アプ...
-
VB6での二重起動(複数起動)の制...
-
イラストレーターCS4のシリアル...
-
VB.NETでMessageBoxを表示した...
-
Console Applicationをタスクト...
-
Java Web Start アプリケーショ...
-
VB.NETでフォームアクティブの...
-
C#でGUI・CUIの判断する仕方を...
-
vb6で異なるのプロジェクト間で...
-
MFCアプリケーションでの終了コ...
-
pccNTmon.exeとntrtscan.exeの違い
-
自分自身を更新するプログラム
-
excel VBAで、外部アプリケーシ...
-
vcxprojファイルの修正法???
-
実行時のコマンドプロンプトを...
おすすめ情報