如何测试是否加载了MIDAS.DLL?

时间:2019-03-18 19:48:13

标签: delphi delphi-2007 datasnap

我在Delphi 2007上使用Datasnap。在一些特定的计算机上,当用户尝试打开应用程序时,他收到“错误加载Midas.DLL”错误,应用程序崩溃。

我永远无法确定在什么情况下会发生这种情况,因为我总是随应用程序一起分发MIDAS.DLL,并且此文件始终与应用程序EXE放在同一文件夹中。

我知道我可以使用MidasLib来避免这种情况,但是我不能这样做,因为我的应用程序使用了对EXE进行加密的破解保护,最终与Midaslib嵌入式程序不兼容。所以Midaslib对我来说不是一个选择。

所以我要做的是在应用崩溃之前运行一个小的测试,以检查Midas.DLL是否已加载,因此我可以在应用崩溃之前主动进行注册DLL。 / p>

这是我尝试过的:

function testMidas : boolean;
var c : tclientdataset;
begin
try 
c := tclientdataset.create(nil);
c.loadfromfile('c:\somefile.dat');
c.free;
result := true;
// everything fine
except
result := false;
// problem, do something to fix
end;
end;

此功能有效,如果未加载Midas.dll且结果为false,它将失败,因此我可以采取一些措施来解决此问题。但是我想得到相同的结果而不必调用“ loadfromfile”。仅通过创建TClientDataset不会生成异常。

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

Delphi通过检查注册表项来确定从何处加载Midas.Dll。看一下DSIntf.Pas中CheckDBClient的源代码,该源代码应该在[Delphi \ Source \ VCL文件夹中。

您将看到此CheckDBClient例程会生成您所看到的异常,因此尽管您可以使用Remy建议在注释中使用的方法来检查是否已加载Midas.Dll,但实际上并不需要检查它是否已加载。全局变量DbClientHandle的值,该值由CheckDbClient初始化(或不初始化)。

在对DBClient.Pas中的CheckDBClient的调用中,通过CreateDbClientObject调用了

TCustomClientDataSet.CreateDSBase

要解决该错误,请使用Delphi的TRegSvr.Exe或Windows的RegSvr32在命令提示符下注册Midas.Dll。或者,您可以自己在项目的启动代码中注册它。 Delphi附带了TRegSvr的源代码(请检查您的delphi \ demos \ activex文件夹),以便您可以亲自了解它如何完成注册过程。

答案 1 :(得分:-2)

感谢大家的建议,但最终我发现,按照我的意愿调整下面的代码是可以的:

function testMidas : boolean;
var c : tclientdataset;
begin
try 
c := tclientdataset.create(nil);
c.FieldDefs.Add('test', ftString, 20);
c.createdataset;
c.open;
c.free;
result := true;
// everything fine
except
c.free;
result := false;
// problem, do something to fix
end;
end;

顺便说一句,我很高兴当我发布一个Delphi问题时总是有答案,这表明尽管很多人不断说它死了,但Delphi仍然活着并且踢着了:)