delphi - 在delphi中调用DLL时发生异常?

标签 delphi winapi dll error-handling

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

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的正确路径后一切正常,但是如果我在path参数中输入错误的路径(其他文件路径),则会显示 pop 错误,提示这不是一个Win32 DLL,但是我不想用这种类型的错误来打扰用户,因此我需要一个函数来检查DLL,如果不是,那么它将自动再次请求另一个文件而不显示 pop 错误?

最佳答案

是您的代码引发了异常。您的代码通过引发异常做出了显式选择来处理错误。您的代码在这里引发了异常:

Win32Check(lib <> 0);

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

您对Win32Check的其他使用也存在相同的问题。

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

因此,如果在调试器外部运行时看到对话框,则说明系统正在生成对话框。您应该通过在启动时传递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

关于delphi - 在delphi中调用DLL时发生异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33591762/

相关文章:

android - DELPHI XE5 如何在 ANDROID 中发送带送达通知的短信

c++ - WINAPI 光标在应用程序窗口上的单击位置

c++ - 无限窗口消息循环

delphi - 如何在TCL中使用Delphi编译的DLL?

dictionary - 使用 Delphi TDictionary 将字符串用作 case 语句的索引

delphi - 为什么 Delphi 在将 ShortString 分配给字符串时会发出警告?

c# - 在将 C++ exe 转换为 dll 并将其用于 C# 后找到入口点

C++ - 解决使用静态和动态库时的链接器错误

image - 如何在Firemonkey中拉伸(stretch)图像?

go - 从SID获取组名