关于DLL异常处理(100分)

  • 主题发起人 主题发起人 fridaydream
  • 开始时间 开始时间
F

fridaydream

Unregistered / Unconfirmed
GUEST, unregistred user!
比较少看到相关资料。
好像说是最好保证DLL中不抛出异常。
但又在另一个资料上说到用safecall;不过如何调用又说得不太详细。自己试了一下,DLL中的异常是无法在dll内部处理的。
不用异常,DLL事务的复杂度又决定了必须用异常来简化。
总之,如何在DLL中处理异常呢?

thx!
 
可以处理异常呀?不过通常的做法就是定义异常代码,返回给调用它的程序处理
例 function aaa():integer
通常情况下我是这么做,返值-1为调用失败,0为成功,若还有其它原因,则1、2、3...下去
 
我明白这种方式的。我想要做的是在DLL内部自已处理异常:
eg.
library Project1;
uses
...
type
MyException=class(Exception);
{$R *.res}
function Test(i:Integer):Integer;safecall;
begin
Result:=100;
try
raise MyException.Create('');
except
on E:MyException do
Result:=-1;
end;//try ...except...
end;

exports
Test;
begin
end.
按正常的方式,这个函数返回值为-1,而实际上不是。而是一个不确定的值。
我想这大概跟DLL的调用方式有关。不知如何可以像正常的方式一样在内部
处理异常呢?

bow~~~~~
 
{delphi 5开发人员指南}9.8.2 异常和Safecall指示符
Safecall指示符用于C O M和异常处理。如果函数用S a f e c a l l声明,就可确保任何异常都被传播给函
数的调用者,并且将异常转换为H R e s u l t类型的返回值。S a f e c a l l也意味着采用S t d C a l l调用约定。因此,
S a f e c a l l函数声明如下:
编译器是这样看这行代码的:
然后编译器就会给整个函数内容加上t r y. . e x c e p t外套,并且捕获触发的任何异常。e x c e p t块调用
S a f e c a l l E x c e p t i o n H a n d l e r ( ),将异常转换为H R e s u l t类型值。这个类似于1 6位的捕捉异常并返回错误值
的方法。
 
我看的也是这一段来的。
只是自己做,想按一般的方式来处理这个异常,却没有成功。
不知有没有现成的例子:)
 
这是delphi2学习文章中的一段:不知现在的delphi7是否有比较好的处理方法。不过DLL跟平台没什么关系吧。所以处理可能还是比较麻烦。不知大家如何做的。
  由于DLLs无法控制应用程序的运行,导致很难进行异常处理,因此编写DLLs时要十分小心,以确保被调用时能正常执行 。当DLLs中发生一个运行时间错时,相应DLLs并不一定从内存中移去(因为此时其它应用程序可能正在用它),而调用DLLs的程序异常中止。这样造成的问题是当DLLs已被修改,重新进行调用时,内存中保留的仍然可能是以前的版本,修改后的程序并没有得到验证。对于这个问题,有以下两种解决方法:
  1.在程序的异常处理部分显式将DLL卸出内存;
  2.完全退出Windows,而后重新启动,运行相应的程序。
  同一般的应用程序相比,DLL中运行时间错的处理是很困难的,而造成的后果也更为严重。因此要求程序设计者在编写代码时要有充分、周到的考虑。

难道只能,一个个异常自己用if..else做吗?
if ...
 
if ...
reslut:=错误码1
else
if ..
reslut:=错误码2
else
if...
reslut:=错误码3
else
if ...
reslut:=错误码
else
....
....
难道只能这么错吗?让调用者去检查返回值判断。
结构上觉得太复杂了:(
用异常来处理就简单多了

 
接受答案了.
 
后退
顶部