有没有办法强制返回在dll中进行的调用?

时间:2014-01-29 14:18:26

标签: delphi debugging dll exception-handling firemonkey-fm2

我必须使用没有源的库,它也不处理异常。每当在其中发生异常时,实际上包含的许多析构函数都不会返回。在应用程序中,我在异常处理程序中包含一个标志来检测DLL的错误状态。

  • 我需要一些东西,这样我的程序在破坏时不会卡在DLL中,同时试图破坏包含的对象,因为析构函数永远不会返回也不会抛出异常。

OR

  • 当出现这种情况时,我是否应该忽略破坏并希望操作系统清理僵尸?

1 个答案:

答案 0 :(得分:0)

两种选择都是可能的。

1-尝试破坏对象
如果你想推测性地调用DLL中的例程,你必须将它放在一个单独的线程中。将平均线程置于睡眠状态,如果呼叫未在规定时间内返回,则假定它挂起。

2-刚刚结束该计划
Windows将清除程序终止时使用的所有内存和GDI对象 如果您有未打开数据的打开文件,则会丢失数据,因此根据应用程序的性质,这可能是一个坏主意。

以下是如何在单独的线程中进行清理:

interface

....

TCleanUpThread = class(TThread)
  procedure Execute; override;
end;

implementation

procedure TCleanUpThread.Execute;
var
  Status: integer;
begin
  Status:= FirstDllCleanUp;
  LogProgress('first cleanup is done, statuscode: '+IntToStr(Status));
  Status:= SecondDllCleanUp;
  LogProgress('Second cleanup is done, statuscode: '+IntToStr(Status));
  ....
end;

procedure TForm1.TryCleanup;
const
  StartNow = false;
var
  CleanUpThread: TCleanUpThread;
begin
  CleanUpThread:= TCleanUpThread.Create(StartNow);
  Sleep(1000); // wait a while to see if clean exit occurs
  if not(CleanUpThread.Terminated) then begin
    //Take measures if needed, depending on the logged data.
  end;
end; //Continue with the shutdown from here.  

警告
请注意,您无法调用synchronize,否则您的线程将不再并行运行。 另请注意,您不能在代码中添加更多不安全的调用。 所有GDI和所有用户界面的东西都已经出来了,那些需要在主线程中处理(即程序本身)。