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

问题描述 投票:1回答:2

我在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 delphi-2007 datasnap
2个回答
3
投票

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

你会看到这个CheckDBClient例程生成你看到的异常,所以真的没有必要检查Midas.Dll是否被加载,尽管你可以使用Remy在评论中建议的方法来检查全局变量DbClientHandle的值。由CheckDbClient初始化(或不初始化)。

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

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


-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仍然活着并且踢尽管很多人一直说它已经死了:)

© www.soinside.com 2019 - 2024. All rights reserved.