我在一些客户端声明MidasLib以避免由Midas.dll引起的dll地狱。
以下代码运行时间约为2350毫秒。如果我在使用中删除了MidaLib声明,它将在45毫秒内开始运行!!
data.xml文件使用TClientDataSet.SaveToFile方法保存,有5000条记录,大小约为600Kb。
有人知道如何解释这种奇怪的行为吗?
我可以在Delphi XE2 upd 3和Delphi XE3 upd 2中确认问题。
感谢。
program Loader;
{$APPTYPE CONSOLE}
{$R *.res}
uses
MidasLib,
System.SysUtils,
Winapi.Windows,
Data.DB,
Datasnap.DBClient;
var
cds : TClientDataSet;
start, stop : Cardinal;
begin
cds := TClientDataSet.Create(nil);
try
start := GetTickCount;
cds.LoadFromFile('c:\temp\data.xml');
stop := GetTickCount;
Writeln(Format('Time elapsed: %dms', [stop-start]));
finally
cds.Free;
end;
end.
答案 0 :(得分:6)
这是一个已知的错误/回归,请参阅质量控制报告
答案 1 :(得分:1)
我们只使用Midas DLL的本地副本,无论系统中安装了什么,只有在找不到本地版本时才会回退到全局版本。
我们使用XE2 upd4 hf1然后我们切换到XE4的Midas DLL(主项目仍然用xe2制作)
git config log.decorate none
答案 2 :(得分:0)
我不确定为什么你认为你需要使用MidasLib来避免DLL地狱"。
当RTL调用TCustomClientDataSet.CreateDSBase
时,会在DSIntf.Pas中调用CheckDbClient
。正是这个例程通过检查注册表来确定加载了哪个Midas.Dll实例。
因此,您可以通过确保注册表在调用CheckDbClient
之前反映其位置来确保使用Midas.Dll的特定实例。注册表设置为InProcServer32
下的HK_Classes_Root\CLSId\{9E8D2FA1-591C-11D0-BF52-0020AF32BD64}
。当然,可以通过调用RegisterComServer
指定Midas路径和文件名来更新它,但必须符合必要的注册表访问权限。