【问题标题】:error in Delphi loadlibrary()Delphi loadlibrary() 中的错误
【发布时间】:2010-10-15 07:51:52
【问题描述】:

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

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

赶上 { 如果不是 dll 则显示消息(但它可以是任何 dll,它会检查这是我的 dll 或稍后的第 3 方)}

结束;

delphi 显示的错误信息是 'bad library image selected'

但是如果用户选择了无效的 dll,try catch 将不起作用,它会显示自己的错误消息并被触发。

谁能帮帮我,我用的是delphi 2009

【问题讨论】:

    标签: delphi delphi-2009 try-catch loadlibrary


    【解决方案1】:

    没有异常可捕获,因为LoadLibrary 失败时不会引发异常;它只是返回“0”。

    您应该检查“dllHandle”是否为 0,如果是,请使用 GetLastError 向用户显示错误信息,如文档所述。或者,您可以在 RTL 中使用 Win32Check 函数,该函数将引发异常并显示相应的错误消息:

    编辑:“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;
    

    【讨论】:

    • 补充一点,LoadLibrary()可以改变加载的DLL/EXE的FPU控制字,所以最好用SafeLoadLibrary()代替。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多