我在Delphi2007上使用Datasnap。在一些特定的机器上,当用户试图打开应用程序时,他得到‘错误加载Midas.DLL’错误,应用程序崩溃。
我从来不知道这是在什么情况下发生的,因为我总是和我的应用程序一起分发MIDAS.DLL,而这个文件总是存在于与应用程序EXE相同的文件夹中。
我知道我可以使用MidasLib来避免这一点,但我不能这样做,因为我的应用程序使用了加密可执行文件的破解保护,最终与Midaslib embedded不兼容。所以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没有加载,它将失败,结果为假,所以我可以做一些事情来解决这个问题。但我希望在不调用“loadfromfile”的情况下获得相同的结果。只有通过创建TClientDataset才不会产生异常。
有什么想法吗?
谢谢!
发布于 2019-03-19 04:08:56
Delphi通过检查注册表项来确定加载Midas.Dll的位置。看看DSIntf.Pas中CheckDBClient的源代码,它应该在你的[Delphi\VCL]文件夹中。
您将看到此CheckDBClient例程生成了您所看到的异常,因此实际上不需要检查Midas.Dll是否已加载,尽管您可以使用Remy在注释中建议的方法来检查由CheckDbClient初始化(或未初始化)的全局变量DbClientHandle的值。
在调用DBClient.Pas中的TCustomClientDataSet.CreateDSBase时,通过CreateDbClientObject调用CheckDBClient。
要修复此错误,请在命令提示符下使用Delphi的TRegSvr.Exe或Windows的RegSvr32注册Midas.Dll。或者你可以自己在项目的启动代码中注册它。Delphi附带了TRegSvr的源代码(请查看您的delphi\demos\activex文件夹),这样您就可以自己了解它是如何完成注册过程的。
发布于 2019-03-19 06:07:33
感谢大家的建议,但我最终发现,按照下面的方式调整我的代码是我想要的:
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已经死了,但它仍然活着。)
https://stackoverflow.com/questions/55229025
复制相似问题