2011-05-01 8 views
2

を拒否したとき、私はこのように、モーダルウィンドウコードから呼び出され、ブラウザでURLを開き、ShellExecuteを使用してきた:のShellExecuteブロック(返すことはありません)ファイアウォールがインターネット

procedure TfmAbout1.BtnHomePageClick(Sender: TObject); 
begin 
    inherited; 
    if ConnectedToWeb then 
    ShellExecute(Handle, 'open', URL_PRODUCT_HOMEPAGE, nil, nil, SW_SHOWNORMAL); 
end; 

しかし持つマシン上でZone Alarmファイアウォールを使用すると、ユーザーはインターネットへのアプリケーションアクセスを許可または拒否するポップアッププロンプトを表示することがあります。ユーザーが「拒否」をクリックすると、ShellExecuteは返されません。私のアプリケーションは次に掛けられます&プロセスは外部(つまり、タスクマネージャーから)シャットダウンする必要があります。

これを予測または防止するには、どうすればよいですか?このような状況では、非ブロックであるShellExecuteのようなものが必要です。

私は何か考えていただければ幸いです。

+0

私はそれが本当に問題がある 'ConnectedToWeb'だと思っています。 ShellExecuteはネットワークアクセスを要求すべきではありません。レジストリの "http"プレフィックスに関連付けられているものを実行します。ゾーンアラームは、インターネットにアクセスできるかどうかを判断するためにインターネットにアクセスしようとしているため、あなたのプログラムにフラグを立てます。あなたのプログラムが実際にインターネットにアクセスする必要がない場合は、Zone Alarmが*ブラウザ*にアクセスできるようにしてもプログラムが拒否される可能性があり、関数が間違った結果を返すため。 **無条件にShellExecuteを呼び出す。**​​ –

+0

@Rob - 私はすでにそれを考えていた。 ConnectedToWebは問題ではありません。それをコメントアウトすると、ShellExecuteの呼び出しはブロックされます。ちなみにZone Alarmでは、[My appname]実行可能ファイルが "http://www.goflagship.com"にアクセスしようとしています。私は現時点で他の火災を出していますが、解決策が見つかったら返信します(ほとんどの場合、ShellExecuteを別のスレッドや殺される別のプロセス経由で呼び出す)。別の考え方:私は、より優雅な解決策として、タイムアウトを使ってWebサイトにpingできるかどうかを調べるつもりです。 –

+0

(以前のコメントでリンクが正しく入力されなかったため、ZoneAlarmはhttp:// –

答えて

3

ゾーンアラームのバグを回避したいのですか?

私はおそらくゾーンアラームのバージョンをチェックし、それに応じて小さな「ブートストラップ」プログラムで私のためにShellExecuteを実行してください。そうすれば、小さなブートストラッププログラムだけがぶら下がります。

タイムアウト(15秒または30秒後)が戻ってこない場合は、そのブートストラッププログラムを(親プロセスが所有者であるため)強制終了できます。注:

あなたも、あるユーザーに警告する可能性は、ゾーンアラーム:)

編集のバグのバージョンを持っている私は、プロセスを殺すことは、スレッドを殺すよりも安全だと思います。

+1

Inc(AmountIHateZoneAlarm、LargeConstantValue);. –

0

スレッドでShellExecuteを実行します。ある時点で、それが完了したかどうかを見ることができます。もしそうでなければ、あなたはそれを終了することができます。

関連する問題