我目前正在开发一些简单的自动更新应用程序。最重要的特性是自我更新的可能性。这就是为什么我计划把大部分逻辑放在外部DLL中。在我的动态链接库增长了一点之后,我开始在主应用程序中使用FreeLibrary调用时遇到问题。在dll调试期间,我发现了导致该错误的函数:
function TpmDSServerUpdateDownloader.DownloadUpdates: Boolean;
var
LSQLConnection: TSQLConnection;
LSQLServerMethod: TSqlServerMethod;
LUpdatePackageLink: string;
begin
try
{$IFDEF DEBUG}
Sleep(10000);
{$ENDIF}
// Getting update package link
FUpdateServerIP := '127.0.0.1';
FUpdateServerPort := 8080;
LSQLConnection := TSQLConnection.Create(nil);
LSQLServerMethod:= TSQLServerMethod.Create(nil);
LSQLConnection.DriverName :='DataSnap';
LSQLConnection.LoginPrompt := False;
LSQLConnection.Params.Add('CommunicationProtocol=HTTP');
LSQLConnection.Params.Add('Hostname=' + FUpdateServerIP);
LSQLConnection.Params.Add('Port=' + IntToStr(FUpdateServerPort));
LSQLConnection.Params.Add('ConnectTimeout=' + IntToStr(10000));
LSQLConnection.Connected := True;
LSQLServerMethod.SQLConnection:= LSQLConnection;
LSQLServerMethod.ServerMethodName:= 'TServerMethods1.GetUpdatePackageLink';
LSQLServerMethod.Params[0].AsInteger := 1;
LSQLServerMethod.ExecuteMethod;
LUpdatePackageLink := LSQLServerMethod.Params[1].AsString;
// Downloading update package with LUpdatePackage link
finally
LSQLConnection.Connected := False;
LSQLServerMethod.Free;
FreeAndNil(LSQLConnection);
end;
end;当我使用该函数中的dbExpress组件时,问题出现了。我想知道释放TSQLConnection/TSQLServerMethod是否会留下一些像IBObjects中的SQLMonitor一样工作的dbExpress线程/对象。也许你有一些想法来解决这个问题?如果能帮上忙,我将非常感激。
问候Michal
发布于 2018-12-20 17:22:46
这是一个Delphi错误。
然而,有一个解决方案:
下面的微软关闭线程不能从DLL unload中调用,因此在TDBXScheduler的TThread.WaitFor进程中的WaitForMultipleObject无限循环上的FreeLibrary freez是在Data.DBXCommon的初始化部分中创建的,并将在该单元的finialization部分中自动关闭。这就产生了错误。所以我们必须早点关闭这个线程。
解决方案是,您需要导出新过程并在FreeLibrary之前调用它:
uses
Data.DBXCommon
.....
procedure FinishDLLWork; stdcall; export;
begin
TDBXScheduler.Instance.Free;
end;在FreeLibrary之前调用它;在释放TDBXScheduler.Instance时,TDBXScheduler会自动将它设置为Nil,所以这个调用没有问题(请检查TDBXScheduler.Destroy;)
不幸的是,不能在DLL_THREAD_DETACH或DLL_PROCESS_DETACH中调用它-为时已晚。
https://stackoverflow.com/questions/33676974
复制相似问题