小编Ale*_*lex的帖子

延迟DLL指令导致FireDAC查询上的应用程序死锁

我在Delphi XE5中以下列方式设置了一个应用程序:

main.exe:使用export delayed指令调用sub.dll中的函数

function MyFunction: boolean; external 'sub.dll' delayed;
Run Code Online (Sandbox Code Playgroud)

sub.dll:包含运行简单SELECT查询的FireDAC查询对象.

在打开查询时,使用延迟指令,当主窗体关闭时,应用程序不会终止(进程main.exe保留在任务管理器中).进程资源管理器显示了sub.dll的剩余线程.当我没有指定延迟指令时,main.exe进程正确终止.我错过了什么?我觉得我没有释放一个物体,但我无法弄清楚它是什么.

简化代码:

MAIN.EXE:

program Main;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

  function MyFunction: boolean; external 'Sub.dll' delayed;

begin
  try
    MyFunction;
  except
    on E: Exception do begin
      Writeln(E.ClassName, ': ', E.Message);
      readln;
    end;
  end;
end.
Run Code Online (Sandbox Code Playgroud)

Sub.dll

library Sub;

uses
  System.SysUtils,
  System.Classes,
  DBConn in 'DBConn.pas';

{$R *.res}

function MyFunction: boolean; export;
var Conn: TConn;
begin
  Conn := TConn.Create;
  Conn.Destroy;
  Result := True;
end;

exports
  MyFunction;

begin
end.
Run Code Online (Sandbox Code Playgroud)

DBConn.pas

unit DBConn;

interface …
Run Code Online (Sandbox Code Playgroud)

delphi dll deadlock firedac delphi-xe5

2
推荐指数
1
解决办法
434
查看次数

标签 统计

deadlock ×1

delphi ×1

delphi-xe5 ×1

dll ×1

firedac ×1