首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试是否加载了MIDAS.DLL?

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

Stack Overflow用户
提问于 2019-03-19 03:48:13
回答 2查看 1.2K关注 0票数 1

我在Delphi2007上使用Datasnap。在一些特定的机器上,当用户试图打开应用程序时,他得到‘错误加载Midas.DLL’错误,应用程序崩溃。

我从来不知道这是在什么情况下发生的,因为我总是和我的应用程序一起分发MIDAS.DLL,而这个文件总是存在于与应用程序EXE相同的文件夹中。

我知道我可以使用MidasLib来避免这一点,但我不能这样做,因为我的应用程序使用了加密可执行文件的破解保护,最终与Midaslib embedded不兼容。所以Midaslib对我来说不是一个选择。

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

这是我尝试过的:

代码语言:javascript
复制
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才不会产生异常。

有什么想法吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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文件夹),这样您就可以自己了解它是如何完成注册过程的。

票数 3
EN

Stack Overflow用户

发布于 2019-03-19 06:07:33

感谢大家的建议,但我最终发现,按照下面的方式调整我的代码是我想要的:

代码语言:javascript
复制
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已经死了,但它仍然活着。)

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55229025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档