【问题标题】:My DLL doesn't work properly when it's placed on System's directory [closed]当我的 DLL 放在系统目录中时,它无法正常工作 [关闭]
【发布时间】:2013-09-20 10:30:15
【问题描述】:

我编写了一个从第三方应用程序(使用 VBA 编写脚本)加载的 COM DLL。

在启动时,应用程序将一个值传递给 DLL,以便之后找到它的实例。

这个(非托管)值是我创建的应用程序的特定类型 static 和全局(它在任何类之外)。

DLL 在注册表中正确注册(使用regasm)并且第三方应用程序正确加载了 DLL。

DLL 被放置在系统的目录中(即 System32 或 SysWoW64)。

在 Windows XP 中,DLL 的工作方式非常棒,但在 Windows 7(64 位)中,存在一个问题:静态值变为空!但是,DLL 的其余部分运行良好,只是这个值有问题。

另一方面,当我们将 DLL 放在非系统的文件夹中时,就可以了。

我认为GC破坏了值,但不可能,因为有静态和非托管。

GC 的问题是什么?为什么系统的文件夹不起作用(即使具有管理员权限)? Windows7有什么特长吗?

【问题讨论】:

  • 不,垃圾收集器不会在您放置 DLL 的位置发出提示。你离使用调试器诊断问题还有很长的路要走,数据断点会创造奇迹。在你完成这项工作之前,猜测原因是没有意义的。
  • 如果我错了,请纠正我,但是 DLL 是由第三方应用程序加载的事实使得无法调试。就位,我在代码中放了一些MessageBox
  • MessageBox 显示静态值已正确初始化,然后直接变为nullptr
  • 当然你可以在这种情况下调试DLL,只需在Debugging settings中选择客户端EXE作为Command设置即可。如果你从来没有这样做过,那么几乎可以肯定你有一个错误。你还没有调试它。
  • 非常感谢!我会尽快尝试的。

标签: .net windows dll com c++-cli


【解决方案1】:

现在问题很清楚了:错误出在第三方应用程序上,而不是我的代码上。当我们将 DLL 放入系统文件夹时,发生了一些奇怪的事情。

【讨论】:

  • 系统文件夹用于系统库而不是应用程序库——是的,即使在 Windows 上也是如此。
  • 它们是防止或限制从该文件夹访问应用程序库的一些机制?
  • 不。一旦管理员允许您的安装程序运行,您就可以执行您选择的任何操作。这只是一个最佳实践(抱歉找不到 MS 指南的链接)来设计可以安装在其他地方的应用程序,例如CommonFilesFolder 中的常用应用程序文件。解决方案需要从程序的开发者开始;有些问题无法在安装程序中解决。
  • 事实上,即使拥有完整的管理员权限,第三方应用程序在从系统文件夹加载 DLL 时也会出现奇怪的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2023-04-04
  • 2015-11-04
  • 2017-06-30
  • 2013-01-11
  • 2021-08-08
  • 1970-01-01
相关资源
最近更新 更多