ошибка в Delphi loadlibrary () - PullRequest
       17

ошибка в Delphi loadlibrary ()

3 голосов
/ 15 октября 2010

Я дал своему пользователю программного обеспечения возможность выбрать dll в диалоге openfile (чтобы мой пользователь мог скачать dll с моего сайта и использовать его с основным проектом). все работает нормально, и он даже может обнаружить, что dll предоставлен мной или выбран недействительным dll.но проблема возникает, если пользователь выбирает переименованный файл (например, файл apple.txt, переименованный в apple.dll) я набрал код как этот

попытка dllHandle: = LoadLibrary (pwidechar (openfiledialog1.filename));

задвижка {showmessage, если это не dll (но это может быть любая dll, позже она проверяет, что это моя dll или третья сторона)}

конец;

сообщение об ошибке, отображаемое delphi: «выбрано плохое изображение библиотеки»

, но попытка catch не работает, если пользователь выбирает недопустимую dll, он показывает свое собственное сообщение об ошибке и выдает ошибку.

Может ли кто-нибудь мне помочь, я использую Delphi 2009

1 Ответ

11 голосов
/ 15 октября 2010

Нет исключения для перехвата, потому что исключение не вызывается при сбое LoadLibrary;он просто возвращает «0».

Вы должны проверить, равно ли «dllHandle» 0 или нет, если это так, показать пользователю информацию об ошибке, используя GetLastError, как задокументировано.В качестве альтернативы вы можете использовать функцию Win32Check в RTL, которая вызовет исключение с соответствующим сообщением об ошибке:

( edit : Документирование состояний «LoadLibrary»что: To enable or disable error messages displayed by the loader during DLL loads, use the SetErrorMode function. Так что, если вы не хотите, чтобы ОС показывала дополнительный диалог, вы должны установить режим ошибки перед вызовом 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;
...