以前工作的基于 Matlab Compiler 的 DLL 突然无法初始化

Formerly working Matlab Compiler-based DLL suddenly cannot initialize

更新:结果是安装 Delphi 10.4 CE 时出现了一些问题,导致我的应用程序崩溃(感谢 DelphiCoder!);具体来说,是 Windows 注册表中的某些东西被破坏了。在使用 ProcessMonitor 确保没有 Delphi 10.4(又名 21.0)被调用后,我最终清理了所有 10.4 引用的注册表,完全重建(不清楚是否需要),瞧瞧,它再次工作!我正在添加此更新,以防遇到类似情况的人发现此问题 - 请记住先备份您的注册表并小心!

原创 Post:10 年前,我用 Matlab Compiler 创建了几个 DLL,使用 C 包装器,使它们在 Delphi 中可用。一旦我让它们开始工作,它们就会一直工作——直到今天!有问题的 C 包装器初始化函数中的代码在下面的代码框中;当我 运行 我的 Delphi 应用程序

时,“无法初始化库”被打印到控制台
mclmcrInitialize();
if (!mclInitializeApplication(NULL, 0)) {
    fprintf(stderr, "Could not initialize application\n");
}
if (!libMyDllInitialize()) {
    fprintf(stderr, "Could not initialize library\n");
}

问题是,自从我们第一次写这些以来,这可能已经有 10 年了,这在以前从未发生过!我的机器安装了正确版本的 32 位 2021a MCR,多年来一直如此;我已经在从 Windows XP 到 Windows 10 的许多机器上安装了它,DLL 最后一次构建是在 5 - 7 年前;无论如何,我无法再使用 Matlab 编译器了。唯一发生变化的是我的应用程序,但在调用此 DLL 初始化代码的位置附近没有任何变化;此外,当问题第一次发生时,我的应用程序正在运行,然后没有运行 - 没有任何更改。最后,我回去几天重新构建了我的应用程序,但仍然失败。

所以我真的被卡住了,需要一些高级帮助来调试 Windows 上的 DLL 启动问题。我尝试查看 Windows 事件记录器,但那里似乎什么也没有显示。要检查的日志?注册表中的设置以某种方式被清除了?月相错误?当被迫将其视为黑盒时,如何调试 loading/initializing 以前工作的 DLL?求助!

How does one debug loading/initializing a formerly working DLL [...]?

我认为你的问题没有确定的答案。

这就是我们调试 DLL 和应用程序 loading/initializing 的方式,可能会对您有所帮助:

  • 我们经常使用没有 DLL 源代码的系统(通常我们也没有任何应用程序源代码)。我们经常遇到 DLL 冲突。在测试为什么应用程序没有按预期启动时,我们发现 Sysinternal's Process Monitor by Mark Russinovich 的使用非常重要。

    这将向您显示系统级别 activity。您可以过滤您的进程,然后您将看到所有文件、注册表、线程和网络 activity(尽管线程和网络非常有限)。如果 DLL 具有依赖性,那么系统会尝试找到它们,因此您将能够发现它正在寻找的所有依赖性 DLL 和 COM 接口(通过查看该接口的注册表查找)。 Process Monitor 将在找不到资源或访问被拒绝时显示。

  • 稍微更难发现的是,如果依赖项之一存在但导出 table 已更改(因此函数具有不同的签名或导出序号)。有一些方法可以检查(通过查看导出和导入 tables),但通常(如果您可以访问工作环境)检查文件大小、时间戳(以及 VERSIONINFO resource 如果DLL 之间有一个)。