【问题标题】:How to test if MIDAS.DLL is loaded?如何测试是否加载了 MIDAS.DLL?
【发布时间】:2019-03-18 19:48:12
【问题描述】:

我在 Delphi 2007 上使用 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 不会产生异常。

有什么想法吗?

谢谢!

【问题讨论】:

  • GetModuleHandle('midas.dll') 会告诉您 DLL 当前是否已在调用进程中加载​​。顺便说一句,当LoadFromFile() 失败时,您会泄漏TClientDataSet
  • 哈哈,没错,我也会 .free 除了:P
  • 最好改用try..finally

标签: delphi delphi-2007 datasnap


【解决方案1】:

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

您会看到这个CheckDBClient 例程会生成您所看到的异常,因此实际上不需要检查是否已加载 Midas.Dll,尽管您可以使用 Remy 在评论中建议的方法来检查由CheckDbClient 初始化(或不初始化)的全局变量DbClientHandle

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

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

【讨论】:

  • 全局变量DbClientHandle在单元外不可访问Datasnap.DSIntf.pas
【解决方案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 仍然活着并且在踢,尽管很多人一直说它已经死了 :)

【讨论】:

  • 如果创建 c 失败你会在异常块中获得一个 AV 怎么办,将创建行放在 try 之外 - 除了 bloc 并选择使用 try - finally 你在 finally 块上释放 c
猜你喜欢
  • 2014-11-10
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多