2017-06-13 3 views
6

私は複数の可能性のDLLのいずれかを使用できるWindows 32ビットプログラムを書いています。だから、SysUtils.SafeLoadLibraryを使用して、順番に各DLLをロードしようとするとロードが成功した場合、それは、そのDLLを使用しています。DLLを読み込んでも依存関係が見つからない場合は、エラーをキャッチする方法はありますか?

は、残念ながら、これらのDLLのいくつかは、静的に他のDLLにリンクされています。これらのdllは、コンピュータに存在しない可能性があります。 [いくつかのdll名]は、コンピュータから欠落しているため、[myprogram.exeという]システムエラー

プログラムが起動できません:その場合、私は

[MYPROGRAM]は私に言ってダイアログを取得します。この問題を修正するプログラムを再インストールしてみてください。」

そのダイアログで[OK]ボタンを押した後、プログラムはエラーコードを取得し、正常に動作し他のDLLのいずれかをしようとします。

よりもむしろ示しますその私は私のプログラムは黙ってそれを無視したいユーザーにダイアログ

どのように私は

場合、重要なことを成し遂げることができます。?は私のプログラムはDelphi(デルファイ)2007年に、Windowsのバージョンを書かれては、Windows 8.1であるが、プログラムは他のWindowsバージョンでも動作する> = Windows XP。

私はSetErrorMode(SEM_FAILCRITICALERRORS)を試してみましたが、それはどんな違いがありませんでした。

+0

[この質問](https://stackoverflow.com/q/44430822/1889329)を参照してください。 – IInspectable

+0

@IInspectableありがとうございますが、答えは1つしかありません。私がそのコメントを正しく理解していれば、それを達成するためにDLLを修正する必要がありますが、それはできません。 – dummzeuch

+0

それはあなたがロードしようDLLをコントロールするかどうか、あなたの質問から明らかではなかったです。 – IInspectable

答えて

2

SafeLoadLibraryは、エラーモードを引数として指定した値に設定してから、LoadLibraryを呼び出した後に復元します。ほとんどの場合、そのパラメーターの値を指定していない可能性があります。その場合は、デフォルト値のSEM_NOOPENFILEERRORBOXが渡されます。その場合はおそらく、表示される動作を説明するSEM_FAILCRITICALERRORSが無効になっている可能性があります。

SafeLoadLibraryを呼び出すたびにSEM_FAILCRITICALERRORSを渡すことで問題を解決できます。または、現在のエラーモードに合格する方が良いでしょう。しかし、これは得るのが難しいです。 Vista以降ではGetErrorModeに電話することができます。しかし、あなたはこれをしなければならない古いバージョンで:

ErrorMode := SetErrorMode(0); 
SetErrorMode(ErrorMode); 

これは、プロセス全体の設定であるため、マルチスレッドのアプリケーションが見破らされるために、あなたは、SetErrorModeには2回の呼び出しの間の機会の窓を持っています。

率直に言えば、起動時にプロセスの有効期間内に正確にSetErrorModeに電話する必要があります。そのことを念頭に置いて、私はSafeLoadLibraryを避けるだろう。

浮動小数点コントロールの状態の変更を防ぐために、他の機能を利用したい場合は、自分でその機能を実装する必要があります。

+3

Windows 7以降には '(Get | Set)ThreadErrorMode()'もあります。 –

関連する問題