【问题标题】:Exception when calling DLL in delphi?在delphi中调用DLL时出现异常?
【发布时间】:2015-11-08 07:36:45
【问题描述】:

我有一个从 DLL 调用名为 [main()] 的函数的过程,这是 Caller 过程:

procedure call_dll(path:string);
var
  lib: HMODULE;
  mainfn: procedure(); stdcall;
begin
if FileExists(path) then
 begin
   try
     lib := LoadLibrary(PAnsiChar(path));
     Win32Check(lib <> 0);
     try
       @mainfn := GetProcAddress(lib, 'main');
       Win32Check(Assigned(mainfn));
       mainfn();
     finally
       FreeLibrary(lib);
     end;
   except
   end;
 end;
end;

直到一切正常,我的意思是在编写 DLL 的正确路径后一切正常,但如果我在路径参数中写了错误的路径(其他文件路径),它会向我显示一个弹出错误is 不是 Win32 DLL,但我不想用这种类型的错误来打扰用户,所以我需要一个函数来检查 DLL,如果不是,那么它会自动再次请求另一个文件而不显示弹出错误?

【问题讨论】:

    标签: delphi winapi dll error-handling


    【解决方案1】:

    是您的代码引发了异常。您的代码明确选择通过引发异常来处理错误。您的代码在此处引发了异常:

    Win32Check(lib <> 0);
    

    如果您不想引发异常,请不要使用Win32Check。而是检查lib 的值并通过您认为合适的任何方式处理任何错误。

    您对Win32Check 的其他用途也存在同样的问题。

    当然,您正在使用 catch all 异常处理程序吞下所有异常。捕获所有异常处理程序通常是一个坏主意。我不明白你为什么把它包括在内。我认为你应该删除它。

    因此,如果您在调试器外部运行时看到对话框,则表明系统正在生成对话框。您应该通过在启动时调用SetErrorMode 并传递SEM_FAILCRITICALERRORS 来禁用系统的错误消息对话框。

    var
      Mode: DWORD;
    ....
    Mode := SetErrorMode(SEM_FAILCRITICALERRORS);
    SetErrorMode(Mode or SEM_FAILCRITICALERRORS);
    

    这里解释了有点笨拙的双重调用:http://blogs.msdn.com/b/oldnewthing/archive/2004/07/27/198410.aspx

    【讨论】:

    • 对不起先生,但我在每一行之后都做了一个showmessage();,错误是由lib := LoadLibrary(PAnsiChar(path));引起的,而不是由Win32Check引起的,那该怎么办?
    • 按照我最后一段所说的去做。调用 SetErrorMode 以禁用这些对话框。您的代码处理错误的方式有些混乱。我认为您在不理解的情况下从某个地方复制了代码。
    • hhhhhhhh 这是真的我是一个初学者,但有一天我将能够编写我自己的函数;),无论如何我会尝试你所说的:) 只是一秒钟
    • 我刚刚使用了SetErrorMode(SEM_FAILCRITICALERRORS);这一行,它运行良好 thaaaaaaaaank yoooooooooooou 先生
    • 我不能给你一个赞,但我能做到的那一天我会做到的 :) :) :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多