我有一个过程可以从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/