代码之家  ›  专栏  ›  技术社区  ›  Paul J. Lucas

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

  •  6
  • Paul J. Lucas  · 技术社区  · 16 年前

    我正在编译我自己的DLL,它由几个 .o o SHLoadLibraryFromItem 这仅在Windows 7上受支持。除非使用DLL的应用程序在Windows 7上运行,否则永远不会调用该函数。(是的,我肯定。)

    SHLoadLibraryFromItem

    问题:

    1. 即使在XP上没有调用它?
    2. 有没有办法打开窗户 这样做,即找到 SHLoadLibraryFromItem
    3. 如果没有,最好的解决方法是什么?

    我能想到的唯一解决办法是:

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

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

    更新

    请看我写的东西。我在第一段中明确指出 SHLoadLibraryFromItem

    应用程序仅在DLL被激活时崩溃 加载 .

    2 回复  |  直到 16 年前
        1
  •  10
  •   Tim Sylvester    16 年前

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

    使用 LoadLibrary GetProcAddress 是解决这个问题的“标准”方法。

    This article

        2
  •  2
  •   cdonner    16 年前

    为什么Windows试图查找 SHLoadLibraryFromItem,即使它是 没有在XP上被调用?

    Windows在应用程序加载到内存时解析引用,而不是在调用时解析引用。这称为“动态链接”(与链接器的静态链接相反),但它不是真正的动态链接。因此,它不知道是否会在运行时调用某个特定方法。