我在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在评论中建议的方法来检查全局变量DbClientHandle
的值。由CheckDbClient
初始化(或不初始化)。
CheckDBClient
在DBClient.Pas中调用CreateDbClientObject
时通过TCustomClientDataSet.CreateDSBase
调用。
要修复错误,请使用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;
顺便说一句,我很高兴当我发布一个Delphi问题时总会有答案,这表明Delphi仍然活着并且踢尽管很多人一直说它已经死了:)