プログラムの終了 表示をなんとか。


みゆ  2008-12-09 00:38:01  No: 32854

Delphiのソフト上でループの一環でIEやエクセルを立ち上げて消してという動作があります。
しかし、動かしていると「プログラムの終了」というプログラムの以上終了表示が出て動作がおかしくなってしまいます、たとえばIEをプロセスで消そうとしてもうまくいきません、何か良い案はないでしょうか?


ところで  2008-12-09 04:55:06  No: 32855

今書いているコードはどんなんですか?


ところで  2008-12-09 04:55:06  No: 32856

今書いているコードはどんなんですか?


みゆ  2008-12-09 05:15:39  No: 32857

https://www.petitmonte.com/bbs/answers?question_id=6031

こちらを参考にさせていただきました。
が、これでは消えませんでした。


みえないね  2008-12-09 05:25:57  No: 32858

>が、これでは消えませんでした。
省略しないで、主語をちゃんと書こうよ。
何が消えないの?

>ループの一環でIEやエクセルを立ち上げて消してという動作があります
どうやって立ち上げて、どうやって消してるの?


みゆ  2008-12-09 05:37:47  No: 32859

アプリ名は異なりますが、IEで下のものが出た場合に
http://error.squares.net/archives/2005.01.31_01.png
この後のエラーの送信の可否は設定で非表示にしています。
このエラー文章と固まったIEを終了させていです。

どうやって立ち上げているかですが、現段階では上記の症状が出たときに手動で起動して消えるかのテスト段階です、立ち上げ方法については独立したアプリにしてタイマー実行か、ループの中に組み込もうかと思っております。


みえない  2008-12-09 18:32:24  No: 32860

>しかし、動かしていると「プログラムの終了」というプログラムの以上(異常)終了表示が出て動作がおかしくなってしまいます、
こう書いているんだから、実際に記述したコードを実行して「立ち上げて消して」いるんだよね?
そのコードがどんなものなのかを聞いてるんだけど...

手動で起動したIEを終了させる時にも
http://error.squares.net/archives/2005.01.31_01.png
こんなエラーが出るんじゃ、OSかIE自体がおかしくなってるとか。あるいは...
http://support.microsoft.com/kb/816131/ja


みゆ  2008-12-10 00:43:49  No: 32861

立ち上げるコードはマウスコントロールで実際にクリックして、×を押して消しています。  その際、コンテンツの内容によってまれにIEが固まり
http://error.squares.net/archives/2005.01.31_01.pngこのようなものが出ます、通常に使用していてもたまにこういうものは出ると思います、その場合、うまくクリアする方法を探しています


monaa  2008-12-10 00:59:42  No: 32862

やりたい動作が説明不足でわかりません。
たとえばこんな感じで書いてもらえませんかね?
1.自分のアプリケーションからCreateProcessで「メモ帳」を起動、
2.そのメモ帳を自分のアプリケーションで終了する場合もあるが、
    マウスからの手動処理でメモ帳を終了する場合もある。
問題点は手動でメモ帳を終了した際に、自分のアプリケーションがフリーズしてしまう。自分のアプリケーションはメモ帳を起動した後、終了までループ処理を行っている。
みたいな感じで。


通りすがり  2008-12-10 00:59:49  No: 32863

言葉で説明するんじゃなく、ソースコード見せなさいって言われているんじゃないの?


monaa  2008-12-10 01:04:20  No: 32864

あー、もしかしてプロセスの強制終了の事ですかね?
だとすると、TerminateProcessがそれに当たります。
これだとサンプルはネットにあふれてるはずです。


みゆ  2008-12-10 01:53:38  No: 32865

monaa様そのとおりです。
TerminateProcessで検索以下にたどり着きましたがIEのプロセスIDが分かりません。

var
  ProcessID: Cardinal;
  hProcess: THandle;
begin
  //ProcessIDを得ておく
  //ProcessID := xx;(この部分が不明です。)

  hProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessID);
  TerminateProcess(hProcess , 0 );
  CloseHandle(hProcess);


monaa  2008-12-10 02:27:29  No: 32866

GetWindowThreadProcessId()でWindowハンドルからプロセスIDが取得可能です。
これもググればすぐ出てくると思いますよ。


みゆ  2008-12-10 02:55:09  No: 32867

上記方法は成功したのですが結局
http://error.squares.net/archives/2005.01.31_01.png
が消えません。

taskkill /IM iexplore.exe
でプロセスKILLしてみても成功しましたと出ますが
http://error.squares.net/archives/2005.01.31_01.png
が消えません。

ですが、タスクマネージャのプロセスから終了したらきえます。
なにか方法はありませんか?


nia  2008-12-10 03:10:46  No: 32868

いいかげん、情報を小出しにするのはやめてください。
回答してくれている皆さんに失礼極まりないです。

実行したいのはIEやOfficeではないのですか?
仮にOfficeであれば、ドキュメント変更後の保存動作をどうするのですか?
そもそもそれらのアプリケーションを開いて何をするのですか?
最終的に何がしたいのか、さっぱりわかりません。
現在の該当箇所すべてのソースコードを提示した上で質問してください。

しかも、http://error.squares.net/archives/2005.01.31_01.png
これは自分のエラーではなく、どこかのHPから適当に引っ張ってきてますよね?
自分のエラーを提示してください。


みゆ  2008-12-10 03:30:15  No: 32869

情報を小出しにしてるわけではありません、経過を追って報告しているのですが、しかも、実行したいわけではなく既に実行されたIEが固まってどうしようもなくなるので固まったIEを消したいのです。
monaa 様には私の提案であるプロセスでのKILLの方法を教えていただきましたがそれでは固まったIEは消えませんでした。という経過です。

いっている事がややこしくなるので申し訳ないのですが単純に固まってしまったIEを消したいということです。


monaa  2008-12-10 04:00:23  No: 32870

XRayさんとこのコピペです。
固まったIEの強制終了サンプル。
IEは特殊なアプリケーションで、複数のトップレベルウィンドウを持つことができます。その統括プロセスを切ってやらないと終了できません。
個別のIEウィンドウに対してはもっとぬるいWM_CLOSEなんかを送ってあげたほうが良いと思います。
まぁとにかく分かりにくい質問ですね、
とりあえず一番最初の質問からはかけ離れている気がします。

//uses tlhelp32
procedure TForm1.Button1Click(Sender: TObject);
var
    ListHandle  : THandle;
    Pr          : TProcessEntry32;
    ProcessID   : DWORD;
    hProcess    : THandle;
    //fdwAccess   : DWORD;
    //PStr        : array[0..MAX_PATH-1] of Char;
    //ExeFullPath : String;
    ExeName     : String;
begin
    ListHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if ListHandle <> THandle(-1) then begin
     try
       Pr.dwSize := sizeof(TProcessEntry32);
       Process32First( ListHandle,Pr);
       repeat
         ExeName   := Pr.szExeFile;
         ProcessID := Pr.th32ProcessID;
         if ExeName='iexplore.exe' then
         begin
           beep;
           hProcess := OpenProcess(PROCESS_TERMINATE,False,ProcessID);
           TerminateProcess(hProcess, 0);
           CloseHandle(hProcess);
         end;
       until Process32Next( ListHandle,Pr )=False;
     finally
       CloseHandle( ListHandle );
     end;
    end;
end;


そもそも  2008-12-10 05:00:21  No: 32871

自分でIEを起動しているのなら(Exの付くShellExecuteExなりCreateProcessなり使っていれば)
プロセスID/ハンドルは教えてもらえるので、わざわざ探し回る必要もないですよね。
逆にプロセス名やウィンドウ名で検索するやり方だと、自分で立ち上げたのではないIEに誤爆してしまわないか心配です。
そういった意味でも「どうやって立ち上げているのか」は重要な情報なので、きちんと提示してほしかったところです。

もっとも、IEやOfficeアプリケーションの場合、返されたプロセスID=最終的に立ち上がったプロセスのID が成り立つかどうかわかりませんが。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加