ошибка в загрузке библиотеки Delphi()

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

попробуйте dllHandle := LoadLibrary(pwidechar(openfiledialog1.filename)) ;

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

конец;

сообщение об ошибке, показанное delphi, - это «выбран неверный образ библиотеки»

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

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


person VibeeshanRC    schedule 15.10.2010    source источник


Ответы (1)


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

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

(изменить: в документации «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;
person Sertac Akyuz    schedule 15.10.2010
comment
В дополнение к этому, LoadLibrary() может изменять управляющие слова FPU загруженной DLL/EXE, поэтому вместо этого лучше использовать SafeLoadLibrary(). - person Remy Lebeau; 19.10.2010