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

Delphi 如何测试是否加载了MIDAS.DLL?,delphi,delphi-2007,datasnap,Delphi,Delphi 2007,Datasnap,我在Delphi2007上使用Datasnap。在一些特定的机器中,当用户尝试打开应用程序时,他会出现“加载Midas.DLL时出错”错误,应用程序会崩溃 我永远无法确定在什么情况下会发生这种情况,因为我总是将MIDAS.DLL与我的应用程序一起分发,并且此文件始终位于与应用程序EXE相同的文件夹中 我知道我可以使用MidasLib来避免这种情况,但我不能这样做,因为我的应用程序使用了破解保护,对EXE进行加密,结果与嵌入的MidasLib不兼容。所以Midaslib不是我的选择 所以我要做的是

我在Delphi2007上使用Datasnap。在一些特定的机器中,当用户尝试打开应用程序时,他会出现“加载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中的
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仍然活着,尽管很多人一直说它死了:)

GetModuleHandle('midas.dll')
会告诉你dll当前是否在调用过程中加载。顺便说一句,当
LoadFromFile()
失败,你泄漏了
TClientDataSet
。哈哈,没错,我会。在例外上免费:PBetter使用
try..finally
而不是如果创建c失败,你会在异常组中得到一个AV,将创建行放在try之外-例外组并选择使用try-finally,在finally blocGlob上释放c所有变量
DbClientHandle
无法在装置外部访问
Datasnap.DSIntf.pas