gpt4 book ai didi

windows - 如何让 DLL 在不同的 Windows 版本上工作?

转载 作者:可可西里 更新时间:2023-11-01 13:19:19 30 4
gpt4 key购买 nike

我正在编译我自己的由多个 .o 文件组成的 DLL。其中一个 .o 文件具有调用 SHLoadLibraryFromItem 的函数,该函数仅在 Windows 7 上受支持。除非使用 DLL 的应用程序在 Windows 7 上运行,否则永远不会调用该函数。(是的,我确定。)

但是,当在旧版本的 Windows(比如 XP)上运行该应用程序时,整个应用程序在启动时崩溃并显示错误“找不到指定的过程”。虽然错误没有指定找不到哪个过程,但如果我注释掉对 SHLoadLibraryFromItem 的调用,那么一切正常。

问题:

  1. 为什么 Windows 尝试查找 SHLoadLibraryFromItem,即使它没有在 XP 上调用?
  2. 有没有办法让 Windows 这样做,即仅在运行 Windows 7 时查找 SHLoadLibraryFromItem,即某种延迟绑定(bind)?
  3. 如果不是,最好的解决方法是什么?

我能想到的解决这个问题的唯一方法是:

  1. 使用LoadLibrary 加载SHLoadLibraryFromItem 所在的Windows DLL,并使用GetProcAddress 手动获取地址到函数指针并使用指针来调用 SHLoadLibraryFromItem
  2. 有两个 DLL:一个包含 Windows 7 支持的函数,只有在 Windows 7 上运行时才会加载。

还有其他想法吗?我真的更喜欢上面提到的某种惰性绑定(bind)。

更新

请阅读我实际写的内容。我在第一段中明确指出 SHLoadLibraryFromItem 不会被调用,除非我确定该应用程序确实在 WINDOWS 7 上运行。

仅当 DLL 加载时应用程序崩溃。

最佳答案

链接器在您的模块中嵌入了对每个使用的 API 函数的引用。当 Windows 加载程序加载您的可执行文件及其模块时,它需要将代码中的所有调用“连接”到内存中实际加载 API 函数的位置。如果找不到它们,它将不会继续。

使用 LoadLibraryGetProcAddress 是解决此问题的“标准”方法。

使用两个 DLL 对您没有帮助,因为只要其中一个无法加载,您的应用程序就仍然无法启动。你可以通过使用延迟加载来解决这个问题,将所有依赖于新操作系统的代码放在一个单独的模块中,并将对该模块的所有调用包装在 Win32 SEH 异常处理程序中(延迟加载时你会得到一个 SEH 异常无法加载模块)。优点是您可以使用“自动”链接而不会出现乱七八糟的函数指针,但异常处理可能会非常糟糕。

This article进行了一些解释,并给出了一些示例,说明如何巧妙地将其包装起来。

关于windows - 如何让 DLL 在不同的 Windows 版本上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1750508/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com