Delphi loadlibrary()中的错误

Vib*_*nRC 3 delphi try-catch loadlibrary delphi-2009

我有机会让我的软件用户从openfile对话框中选择dll.(因此我的用户可以从我的网站下载dll并将其与主项目一起使用).一切都工作正常,甚至可以发现dll是由我提供或选择了一个无效的DLL.但如果用户选择重命名的文件(例如:apple.txt文件重命名为apple.dll),问题就会引发.我输入了这样的代码

尝试dllHandle:= LoadLibrary(pwidechar(openfiledialog1.filename));

catch {showmessage如果它不是一个dll(但它可以是任何dll,它会检查这是我的dll或第三方之后)}}

结束;

delphi显示的错误信息是"选择了错误的库图像"

但是如果用户选择了无效的dll,它会显示自己的错误消息并且被攻击,那么尝试catch是行不通的.

任何人都可以帮助我,我正在使用delphi 2009

Ser*_*yuz 11

捕获没有异常,因为LoadLibrary失败时不会引发异常; 它只返回'0'.

您应该检查'dllHandle'是否为0,如果是,则使用GetLastError记录的方式向用户显示错误信息.或者,您可以使用Win32CheckRTL中的函数,该函数将引发异常并显示相应的错误消息:

(编辑:'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;
Run Code Online (Sandbox Code Playgroud)