VC++6.0を使用し、NT上で以下のようなプログラムを作成していました。
Prcess_sts = ::CreateProcess(***_FULLPATH, NULL, NULL, NULL, FALSE, 0, NULL, ***_DIR, &pscinfo, &lpProcessInfo );
***は起動する実行形名称です。作成したプログラムをNT上で動作させるには全く問題なかったのですが、OSがXPに変わった途端、この命令でアプリケーションの起動ができなくなりました。具体的な症状は、
・カーソルは砂時計を表示し、フリーズしている
・タスクマネージャの『プロセス』を確認すると、99%がアイドル状態で、起動したアプリ及びCallしたアプリがリソースを食い潰している状態ではない。
という変な現象が発生しています。ちなみに、このような状態になるのは、コールしたプログラムの先でシリアル通信を行うものに頻発しているように感じます(気のせいかも?)また、全く問題なく起動することもあります。これはOSのせいなのでしょうか?もちろん、NT上で動作させていたときは全くなかった現象です。VC++がXPに対応していないからなのでしょうか?全く分からずに困っています。その道に明るい方がいましたら、ご教示ください。
PS
マイクロソフトが発表している『32ビットプロセスでCreateProcess関数を呼び出しても正しく起動されない』というものとは違うようです。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
補足ありがとうございます。
なるほど、他社の実行プログラムですか・・・それはやっかいですね。私ならばこういうところをチェックする・・・というところを挙げてみます。現象の発生頻度が分からないので的外れなところもあるかもしれません。
1. 念のため、タスクマネージャは常に「他社の実行プログラム」がプロセス一覧に表示される状態にしておく。もしかしたら何らかの原因で多重起動しており、多重起動が障害を引き起こしているのかもしれない。
2. CreateProcess()を実行した後、どこで止まっているのかを把握。あまり期待はできないが、CreateProcess()から「止まっているコード」までの間で何かヒントがあるかもしれない。(補足の文章の感じですとWaitForSingleObject()で他社プログラムの終了待ちで止まっているのかなという感じなのですが。)
3. CreateProcess()の直前に「CreateProcess()の場所に来たぞ」という意味のMessasgeBoxを表示し、「MessageBoxを閉じる」人手を介してCreateProcess()を実行する。こうすることで現象発生の頻度が下がるかどうかを確認。頻度が下がるとすればタイミング問題である可能性が高い。
4. CreateProcess()の直前に「CreateProcess()の場所に来たぞ」という意味のMessasgeBoxを表示し、CreateProcess()自体はコメントアウトしてしまう。MessageBoxによる表示が現れたら、その都度手作業で他社プログラムを起動し、それからMessageBoxを閉じる。(もしプロセスIDが必要であれば、その入力ルーチンも追加する必要があります。)こうすることで現象発生の頻度が下がるとすれば、CreateProcess()の実行自体に何らかの問題(パラメータが不適切等)がある可能性が高い。
5. 同上。ただし、他社プログラム起動時にWindows XPの「互換性機能」でWindows NT 4互換設定を使用してみる。何か変化があれば、「他社プログラム」自体がWindowsのバージョン番号に依存している可能性大。
6. 停止している(ように見える)他社プログラムのプロセス自体をデバッガにかけてスタックトレースを見る(ソースはないのでコードダンプを見てもしょうがない:どうしても必要になれば見ざるを得ませんが)。何度やっても違うアドレスでブレークするようであれば目に見えないだけでいちおう何らかの動作はしているし、毎回必ずWaitForXxxObjectの類でブレークするようであれば何かオブジェクト待ちになっていること「だけ」は分かる。
7. 「CreateProcess()による他社プログラムの実行とWaitForSingleObject()を繰り返すだけ」のような単純なサンプルプログラムを作成し、同様の現象が発生するかどうか確認する。このサンプルプログラムは、現象発生の頻度が高いほど、また内容がシンプルであればあるほど望ましい。ある程度の再現性が得られたら、再現性がなくなるまでプログラムをさらに単純化していく。単純化の過程で削った部分に原因のヒントがあるはず。
8. SysInternalsのHandleユーティリティ(http://www.sysinternals.com/utilities/handle.html)、Process Explorer (http://www.sysinternals.com/Utilities/ProcessExp …、MicrosoftのOpen Handles (http://www.microsoft.com/windows2000/techinfo/re …等を使って、他社プログラムがどのようなハンドルを開いているかを確認する。ひょっとしたらヒントになるかも。
うーん、あと何がありますかね・・・
この回答への補足
ありがとうございます。
気になっているのは、NT上で動作させていたときは全く問題なく動作していたのに、XPに換えたとたん発生しているという点です。95系からXPであればなんとなく想像はつくのですが、この点がなんとも納得のいかないところです。とりあえず、明日、教えていただいたことを試してみます。ありがとうございます。
No.3
- 回答日時:
CreateProcessの問題のように書かれてますが、NTで実行していた、おそらくNT4.0用のバイナリをそのままXPに持ってきて動かないという話の方が現実的にありそうな気がします。
DLLなんかも大分いれかわっているはずですし。
2000とXPならかなり差は少ないと思いますが、NT 4.0から2000への変更がかなり大きいと思います。
ですのでXPで安定して動かないというのはありそうな気がしますが。
直接実行させることも可能なら、それでXPで正常に動作するかをまず確認した方がいいと思います。
CreateProcessに問題があるとはちょっと考えづらいです。
あと、VC6.0はちゃんとSPあててますよね?
2000で使うにもアップデートしてないと問題が出るところがあります。
No.1
- 回答日時:
以下の内容について補足願います。
(いずれも、タスクマネージャとデバッガを使えばすぐに分かる事項かと思います。)1. CreateProcessは実行を終了しているか。
2. CreateProcessでプロセスは作成されているか。
3. CreateProcessを実行したプロセス(スレッド)は、CreateProcess実行後も正常に動作しているか。
4. CreateProcessで作成したプロセスのmainないしWinMainは実行開始しているのか。
5. 「CreateProcessで指定している実行プログラム」は、単独で実行した場合は予期したとおり動作するのか。
この回答への補足
ご指摘ありがとうございます。
1について
実行を終了しています
2について
プロセスは作成されています
3について
実行したプロセスは正常動作していません。Call したプロセス(画面)の後ろに隠れている状態
ですが、タスクマネージャーを見ると立ち上がっ ています。が、リソース使用はゼロです。
4について
他社のexeを起動しているので不明です
5について
単独で動作させると、通常通り(予期した)動作
します。
それと、今テストをしてみて分かってきたことなのですが、CreateProcessを2回使うとNGになることが多いようです。ちなみに
CreateProcess() ⇒実行プログラムA
WaitForSingleObject()
Sleep(100)
CreateProcess() ⇒実行プログラムB
WaitForSingleObject()
ここで実行プログラムBがメイン画面の後ろに隠れてしまう状態です(タスクマネージャで見るといるのですが、CPU使用ゼロで眠っているような感じです)
また、毎回発生するわけではなく、立ち上がったり、たちあがらなかったりという感じです。調子がよいと必ず正常に起動してくれるのですが・・・
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- デスクトップパソコン 「自動修復でPCを修復できませんでした」と表示されPCが起動しないのですが対処法はありますか? 5 2022/05/13 09:16
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- au(KDDI) 特定の画面を見るとスマホが固まります ご覧頂き有難うございます。 特定のページを見るとスマホが固まり 1 2023/08/21 19:29
- Windows 10 Windows11タスクバーやエクスプローラー、スタートメニュー 動画全画面時にカーソルが見えない 1 2022/04/08 00:03
- その他(コンピューター・テクノロジー) Windows 11 Version 22H2 の (KB5023706)のアップデートに失敗する 2 2023/03/25 21:06
- BTOパソコン 数時間使用しない状態からPCを起動に失敗後、 自動修復画面で再起動をすると正常に動き出す 3 2022/09/26 22:01
- Outlook(アウトルック) OCN WEBメールについて 1 2022/05/18 23:33
- Excel(エクセル) Excel2010 VBAが特定動作で実行出来なくなる 7 2022/12/29 14:26
- レトロゲーム 小学生の頃にやっていた未クリアのゲームをプレイしたい 3 2023/05/07 23:37
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
プログラミング ソースコード
-
なんかC言語でプログラム書いて...
-
バックグラウンドからフォアグ...
-
C言語で途中までしか、プログラ...
-
他のPC上にあるexeを、そのP...
-
MACで動く実行ファイルをWindow...
-
sendkeysにてALT+CTRL+INSERTを...
-
終了してもプログラムが実行し...
-
C++でCtrl+Cを無効化したい
-
clock関数は正確じゃないの?
-
VB上で実行中の無限ループの止め方
-
コマンドプロンプト プログラム...
-
C言語でプログラムを再起動
-
アセンブリ言語の問題
-
実行時エラー429
-
sleep()関数について
-
system関数を使用してsuコマン...
-
VB.NETで作ったプログラムがサ...
-
プリントスクリーンをプログラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
MACで動く実行ファイルをWindow...
-
sendkeysにてALT+CTRL+INSERTを...
-
他のPC上にあるexeを、そのP...
-
VB上で実行中の無限ループの止め方
-
system関数を使用してsuコマン...
-
VBAで外部プログラムを非表示で...
-
実行時エラー429
-
プロセス間通信について
-
並列計算をしたときのシステム...
-
終了してもプログラムが実行し...
-
システム資源とは?
-
C言語で途中までしか、プログラ...
-
PIC のデータEEPROMに書き込み...
-
RPG パラメーターについて
-
Windows10でDOSゲーム
-
ラズパイ プログラム 自動起動 ...
-
プログラムを走らせる
-
C言語でフォルダを開く
-
アクセス[ファイルを開かずに、...
おすすめ情報