Delphiのソフト上でループの一環でIEやエクセルを立ち上げて消してという動作があります。
しかし、動かしていると「プログラムの終了」というプログラムの以上終了表示が出て動作がおかしくなってしまいます、たとえばIEをプロセスで消そうとしてもうまくいきません、何か良い案はないでしょうか?
今書いているコードはどんなんですか?
今書いているコードはどんなんですか?
https://www.petitmonte.com/bbs/answers?question_id=6031
こちらを参考にさせていただきました。
が、これでは消えませんでした。
>が、これでは消えませんでした。
省略しないで、主語をちゃんと書こうよ。
何が消えないの?
>ループの一環でIEやエクセルを立ち上げて消してという動作があります
どうやって立ち上げて、どうやって消してるの?
アプリ名は異なりますが、IEで下のものが出た場合に
http://error.squares.net/archives/2005.01.31_01.png
この後のエラーの送信の可否は設定で非表示にしています。
このエラー文章と固まったIEを終了させていです。
どうやって立ち上げているかですが、現段階では上記の症状が出たときに手動で起動して消えるかのテスト段階です、立ち上げ方法については独立したアプリにしてタイマー実行か、ループの中に組み込もうかと思っております。
>しかし、動かしていると「プログラムの終了」というプログラムの以上(異常)終了表示が出て動作がおかしくなってしまいます、
こう書いているんだから、実際に記述したコードを実行して「立ち上げて消して」いるんだよね?
そのコードがどんなものなのかを聞いてるんだけど...
手動で起動したIEを終了させる時にも
http://error.squares.net/archives/2005.01.31_01.png
こんなエラーが出るんじゃ、OSかIE自体がおかしくなってるとか。あるいは...
http://support.microsoft.com/kb/816131/ja
立ち上げるコードはマウスコントロールで実際にクリックして、×を押して消しています。 その際、コンテンツの内容によってまれにIEが固まり
http://error.squares.net/archives/2005.01.31_01.pngこのようなものが出ます、通常に使用していてもたまにこういうものは出ると思います、その場合、うまくクリアする方法を探しています。
やりたい動作が説明不足でわかりません。
たとえばこんな感じで書いてもらえませんかね?
1.自分のアプリケーションからCreateProcessで「メモ帳」を起動、
2.そのメモ帳を自分のアプリケーションで終了する場合もあるが、
マウスからの手動処理でメモ帳を終了する場合もある。
問題点は手動でメモ帳を終了した際に、自分のアプリケーションがフリーズしてしまう。自分のアプリケーションはメモ帳を起動した後、終了までループ処理を行っている。
みたいな感じで。
言葉で説明するんじゃなく、ソースコード見せなさいって言われているんじゃないの?
あー、もしかしてプロセスの強制終了の事ですかね?
だとすると、TerminateProcessがそれに当たります。
これだとサンプルはネットにあふれてるはずです。
monaa様そのとおりです。
TerminateProcessで検索以下にたどり着きましたがIEのプロセスIDが分かりません。
var
ProcessID: Cardinal;
hProcess: THandle;
begin
//ProcessIDを得ておく
//ProcessID := xx;(この部分が不明です。)
hProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessID);
TerminateProcess(hProcess , 0 );
CloseHandle(hProcess);
GetWindowThreadProcessId()でWindowハンドルからプロセスIDが取得可能です。
これもググればすぐ出てくると思いますよ。
上記方法は成功したのですが結局
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
が消えません。
ですが、タスクマネージャのプロセスから終了したらきえます。
なにか方法はありませんか?
いいかげん、情報を小出しにするのはやめてください。
回答してくれている皆さんに失礼極まりないです。
実行したいのはIEやOfficeではないのですか?
仮にOfficeであれば、ドキュメント変更後の保存動作をどうするのですか?
そもそもそれらのアプリケーションを開いて何をするのですか?
最終的に何がしたいのか、さっぱりわかりません。
現在の該当箇所すべてのソースコードを提示した上で質問してください。
しかも、http://error.squares.net/archives/2005.01.31_01.png
これは自分のエラーではなく、どこかのHPから適当に引っ張ってきてますよね?
自分のエラーを提示してください。
情報を小出しにしてるわけではありません、経過を追って報告しているのですが、しかも、実行したいわけではなく既に実行されたIEが固まってどうしようもなくなるので固まったIEを消したいのです。
monaa 様には私の提案であるプロセスでのKILLの方法を教えていただきましたがそれでは固まったIEは消えませんでした。という経過です。
いっている事がややこしくなるので申し訳ないのですが単純に固まってしまったIEを消したいということです。
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;
自分でIEを起動しているのなら(Exの付くShellExecuteExなりCreateProcessなり使っていれば)
プロセスID/ハンドルは教えてもらえるので、わざわざ探し回る必要もないですよね。
逆にプロセス名やウィンドウ名で検索するやり方だと、自分で立ち上げたのではないIEに誤爆してしまわないか心配です。
そういった意味でも「どうやって立ち上げているのか」は重要な情報なので、きちんと提示してほしかったところです。
もっとも、IEやOfficeアプリケーションの場合、返されたプロセスID=最終的に立ち上がったプロセスのID が成り立つかどうかわかりませんが。
ツイート | ![]() |