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

How to test if MIDAS.DLL is loaded?

我在 Delphi 2007 年使用 Datasnap。在一些特定的机器上,当用户尝试打开应用程序时,他会收到 'Error loading Midas.DLL' 错误并且应用程序崩溃。

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

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

所以我想做的是 运行 一个小测试,当应用程序检查是否 Midas.DLL 在应用程序崩溃之前加载,所以我可以主动注册应用程序崩溃前的 DLL。

这是我尝试过的:

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才不会产生异常。

有什么想法吗?

谢谢!

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

您会看到此 CheckDBClient 例程会生成您所看到的异常,因此实际上没有必要检查 Midas.Dll 是否已加载,尽管您可以使用 Remy 在 a 中建议的方法注释以检查由 CheckDbClient.

初始化(或未初始化)的全局变量 DbClientHandle 的值

CheckDBClient 在 DBClient.Pas 中调用 TCustomClientDataSet.CreateDSBase 时通过 CreateDbClientObject 调用。

要修复错误,请使用 Delphi 的 TRegSvr.Exe 或 Windows 的 RegSvr32 从命令提示符注册 Midas.Dll。或者您可以自己在项目的启动代码中注册它。 Delphi 附带了 TRegSvr 的源代码(检查你的 [delphi]\demos\activex 文件夹)所以你可以自己看看它是如何进行注册过程的。

感谢大家的建议,但我最终发现按如下方式调整我的代码它可以按我想要的方式工作:

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;

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