3

私は自分のソフトウェア ユーザーに、openfile ダイアログから dll を選択する機会を与えました。すべてが正常に機能しており、dll が私によって提供されているか、無効な dll が選択されていることさえわかります。ただし、ユーザーが名前を変更したファイル (例: apple.dll に名前を変更した apple.txt ファイル) を選択すると、問題が発生します。私はこのようなコードを入力しました

dllHandle を試してください := LoadLibrary( pwidechar(openfiledialog1.filename)) ;

catch { dll でない場合はメッセージを表示します (ただし、任意の dll である可能性があります。後で、これが自分の dll またはサード パーティであることを確認します)}

終わり;

Delphi によって表示されるエラー メッセージは、「不適切なライブラリ イメージが選択されました」です。

ただし、ユーザーが無効な dll を選択すると、独自のエラー メッセージが表示され、攻撃されると、catch が機能しません。

誰か助けてくれませんか、私は Delphi 2009 を使用しています

4

1 に答える 1

11

LoadLibrary失敗しても例外は発生しないため、キャッチする例外はありません。「0」を返すだけです。

'dllHandle' が 0 であるかどうかを確認する必要があります。0 である場合は、GetLastErrorドキュメントに従って使用してエラー情報をユーザーに表示します。または、RTL で関数を使用Win32Checkして、適切なエラー メッセージとともに例外を発生させることもできます。

編集:「LoadLibrary」のドキュメントには次のように記載されています:To enable or disable error messages displayed by the loader during DLL loads, use the SetErrorMode function.したがって、OSに追加のダイアログを表示させたくない場合は、LoadLibraryを呼び出す前にエラーモードを設定します。)

var
  dllHandle: HMODULE;
  ErrorMode: UINT;
begin
  if OpenDialog1.Execute then begin
    ErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS); // disable OS error messages
    try
      dllHandle := LoadLibrary(PChar(OpenDialog1.FileName));
    finally
      SetErrorMode(ErrorMode);
    end;
    if Win32Check(Bool(dllHandle)) then begin  // exception raised if false
      // use the libary

      end;
  end;
end;
于 2010-10-15T10:19:45.840 に答える