我有一段用Delphi编写的遗留代码,早在我加入公司之前,IDE的行为让我怀疑自己的很多技能。
加载DLL并从DLL中分配函数OpenDB,GetError和GetErrorStr后,将调用此代码:
If @OpenDB <> nil then
begin
DB_num := OpenDB((PAnsiChar(file)));
if DB_num = -1 then
begin
err := GetError;
ErrorString := GetErrorString(err);
raise Exception.Create(ErrorString);
Exit;
end
end else
Exit;
OpenDB返回-1并且GetErrorString返回错误消息并引发异常。没有什么大不了的,存在错误的数据库,并且总是会发生错误。让我感到惊讶的是,在引发异常之后,“...应用程序定义的异常(代码0x0eedfade)在...”弹出。之后,我得到了访问权限。
答案 0 :(得分:2)
错误消息表示您将跨模块边界的Delphi异常提升为一段不知道如何处理Delphi异常的代码。 0x0EEDFADE
是Delphi raise
语句传递给Win32 RaiseException()
函数的dwExceptionCode
参数的值。只有Delphi和C ++ Builder RTL知道如何处理这些异常。您绝不能跨模块边界引发异常,因为一个模块不知道另一个模块是否可以处理它。不同的模块可以用不同的语言/框架编写。