プロが教える店舗&オフィスのセキュリティ対策術

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関数を呼び出しても正しく起動されない』というものとは違うようです。
よろしくお願いします。

A 回答 (3件)

補足ありがとうございます。

なるほど、他社の実行プログラムですか・・・それはやっかいですね。

私ならばこういうところをチェックする・・・というところを挙げてみます。現象の発生頻度が分からないので的外れなところもあるかもしれません。

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であればなんとなく想像はつくのですが、この点がなんとも納得のいかないところです。とりあえず、明日、教えていただいたことを試してみます。ありがとうございます。

補足日時:2005/09/01 22:53
    • good
    • 0

CreateProcessの問題のように書かれてますが、NTで実行していた、おそらくNT4.0用のバイナリをそのままXPに持ってきて動かないという話の方が現実的にありそうな気がします。


DLLなんかも大分いれかわっているはずですし。

2000とXPならかなり差は少ないと思いますが、NT 4.0から2000への変更がかなり大きいと思います。
ですのでXPで安定して動かないというのはありそうな気がしますが。

直接実行させることも可能なら、それでXPで正常に動作するかをまず確認した方がいいと思います。
CreateProcessに問題があるとはちょっと考えづらいです。

あと、VC6.0はちゃんとSPあててますよね?
2000で使うにもアップデートしてないと問題が出るところがあります。
    • good
    • 0

以下の内容について補足願います。

(いずれも、タスクマネージャとデバッガを使えばすぐに分かる事項かと思います。)

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使用ゼロで眠っているような感じです)
また、毎回発生するわけではなく、立ち上がったり、たちあがらなかったりという感じです。調子がよいと必ず正常に起動してくれるのですが・・・
よろしくお願いします。

補足日時:2005/09/01 21:04
    • good
    • 0

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