- 締切済み
OSによるWinExecの動作の違いについて
開発環境:VC6.0 MFCアプリケーションとして作成しています。 メインアプリケーションから、データ編集用アプリケーションをWinExecで起動しています。メインアプリケーション、データ編集用アプリケーションともに内部でスレッドを生成して動作しています。 当初、Windows2000で動作させていましたが、両アプリケーションともに問題なく動作していました。最近、WindowsXP上で動作させたところ、以下のような現象が発生することがわかりました。 1.メインアプリケーションを起動。 2.メインアプリケーション内のInitInstance内でWinExecにより、目的のアプリケーションを起動。 3.Windows2000であれば、WinExecより即戻り、メインアプリケーションの処理が継続実行されます。WindowsXPだと、こうはならず、一定時間戻らず、一定時間(約30秒)経過後、メインアプリケーションの処理が継続実行されます。 WinExecの説明の中で、この関数は、Win32 上では、呼び出されたプロセスが GetMessage 関数を呼び出したときか、タイムアウト時間が経過したときに制御を返すとありました。今回の場合はタイムアウト時間が経過した場合に相当すると思われますが、Windows2000で問題なく、制御が呼び元に戻り、WindowsXPだと、タイムアウトと思われる動作となっているようで、今後、新しいOSで使用していくうえで不安です。 (今回のWinExecに限らないと思いますが) 何か今回のWinExecに関連する技術情報等ご存知であれば教えていただければ助かります。 以上分かり難い説明とは思いますがよろしくお願いします。 ※実用上は、Win32上ではWinExecは推奨されていないようで、CreateProcessを使用すればWindows2000のときと同じレベルで動作することは確認できています。 ※WindowsXPはProfessionalを使用しています。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
★『WinExec』API関数は古いです。 ・質問者さんもそのことは分かっていますよね。 ・『CreateProcess』関数で同じレベルで動作することを確認しているのならば、 何も『WinExec』関数を使う必要はないのでは? ・私も最初は『WinExec』関数で他のプログラムを手軽に起動していましたが、 その後に『ShellExecute』関数に切り替えました。 ・この『ShellExecute』関数は『CreateProcess』関数よりも手軽に使えますので 乗り換えたらどうでしょうか? ・下にマクロ関数を紹介します。 ●マクロ #define MacroWinExec(s,p,n) ShellExecute(NULL,TEXT("open"),s,p,NULL,n) ●使い方 ・引数『s』にプログラム名 ・引数『p』にプログラムの引数 ・引数『n』に表示状態 ●紹介 HINSTANCE ShellExecute( HWND hwnd, // 親ウィンドウのハンドル LPCTSTR lpVerb, // 操作 LPCTSTR lpFile, // 操作対象のファイル LPCTSTR lpParameters, // 操作のパラメータ LPCTSTR lpDirectory, // 既定のディレクトリ INT nShowCmd // 表示状態 ); 最後に: ・『ShellExecute』関数は、ファイルに関連付けられたものならばすべてを起動できます。 ・『http://~』をプログラム名に指定するとブラウザを起動してウェブサイトを開くます。 ・『mailto:~』をプログラム名に指定するとメーラーを起動してメールを送れます。 ・類似関数で『ShellExecuteEx』関数もあります。こちらは構造体にいろいろセットして 呼び出す形になります。→ちょっとだけ面倒です。 ・以上。おわり。
お礼
回答いただいたマクロを、自分の環境で確認してみました。WindowsXP上でもCreateProcessと同様の動作となりました。用法の簡便さなどを踏まえて、今回のShellExecuteのほうを使用していくことを考えています。 ありがとうございました。
補足
早速、回答いただきありがとうございます。 お勧め下さった「ShellExecute」を使用したマクロで動作を見てみようと思います。 ありがとうございました。