【问题标题】:LoadLibrary failing on Win7 32 bit, succeeding on Win XP 32 bitLoadLibrary 在 Win7 32 位上失败,在 Win XP 32 位上成功
【发布时间】:2011-05-18 18:00:59
【问题描述】:

我正在尝试将第 3 方 dll(即我没有源代码)加载到我的应用程序中。在 windows xp 32 位系统上,它加载正常,但在 windows 7 系统上,它无法加载,引用来自 GetLastError() 的错误 #998

我使用 dll 导出查看器查看了 dll 的导入和导出符号,并观察到导入表中列出的除了 3 个 dll 之外的所有 dll 都来自这个第 3 方供应商。那些没有的是:
kernel32.dll
mingwm10.dll
msvcrt.dll

这是我用来进行导入的代码:

SetDllDirectory(L"c:\\dlls");
HMODULE tempDLL = LoadLibrary(L"mydll.dll");
DWORD err = GetLastError();

请提供有关如何进行调试的任何提示?

编辑:感谢大家的回答,这是我迄今为止发现的:
a) 应用程序工具包包并没有被证明是有用的(见下文)
b) 同事 A 可以让 dll 加载到他的 win 7 机器上,而同事 B 不能,所以这是零星的
c)以管理员身份运行并没有改变任何东西

【问题讨论】:

  • 奇怪的是,我可以在 Win7 上加载 kernel32.dll 和 msvcrt.dll 而没有任何问题。您确定 LoadLibrary 在您的情况下返回 NULL 吗?
  • 你的 dll 加载路径中有 mingwm10.dll 吗?
  • 只是我脑海中的猜测。您是否尝试以“管理员身份”运行您的应用程序?如果没有,请尝试告诉我们结果。
  • 感谢您的快速回复。答案是:
  • @Andrew 现在的问题是:您在函数SetDllDirectory(L"c:\\dlls"); 中实际使用的目录。如果您使用的目录在没有管理员权限的情况下无权访问,或者它们受 UAC 限制,则可能会出现此问题。

标签: c++ dll loadlibrary


【解决方案1】:

尝试使用Microsoft Application Compatibility Toolkit(它是一个免费工具集)找出它在 Windows 7 上失败的原因。希望这会有所帮助,它看起来像一个兼容性问题。

【讨论】:

    【解决方案2】:

    您是否尝试过禁用Data Execution Prevention (DEP)?

    这通常在 Vista 及更高版本上默认启用,但在 XP 上禁用。如果您的 DLL 存在导致其执行数据的错误,这可能会在 LoadLibrary 调用期间出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多