【问题标题】:Use two different versions of a .lib file in one C++ project?在一个 C++ 项目中使用两个不同版本的 .lib 文件?
【发布时间】:2011-07-06 22:40:19
【问题描述】:

我正在开发卷影复制程序。我刚刚发现我需要使用一组不同的 .h 文件 (vsbackup.h) 和相关的 .lib 文件 (vssapi.lib) 来为 Windows XP 编译项目(与 Vista 和 7 相比)。这是由于 .h 文件中的一系列细微变化:在 XP 中,CreateVssBackupComponents() 之类的调用是对 API 的调用(只有 vsbackup.h 中的声明);较新的 vsbackup.h 将其更改为 CreateVssBackupComponents() { CreateVssBackupComponentsInternal(); },当我使用较新的 .h 和 .lib 文件编译我的项目并在 XP 下运行该程序时,它说

在 DLL“vssapi.dll”中找不到过程入口点“CreateVssBackupComponentsInternal”。

有没有可能将这两个不同的lib文件合并到一个项目中,这样我就不必编译两个不同版本的程序了?

【问题讨论】:

    标签: c++ dll shadow-copy


    【解决方案1】:

    如果您需要使用两个不同版本的 dll(因为如果我理解正确,问题就在那里,不同的 lib/headers 只是冰山一角)您应该使用LoadLibrary 动态加载它,检查GetProcAddress 需要的入口点的存在,并使用它返回的函数指针调用所需的函数。

    【讨论】:

      【解决方案2】:

      您还可以创建两种项目配置,一种用于 XP,另一种用于较新的 Windows 版本。然后将这两个文件添加到您的安装程序中,让安装程序检查它正在安装的 Windows 版本并选择正确的程序版本。 (这基本上就是我遇到你的问题时所做的)

      虽然更合适的解决方案是将其放入 DLL,创建该 DLL 的两个版本,然后运行时检查并加载正确的 DLL。这样一来,Windows 更新就不会造成问题。

      【讨论】:

      • 有问题的代码已经在 DLL 中。我只是想避免发布 6 个版本的 DLL(XP 与 Server 2003 与所有其他 Windows 版本,并且它们都处于 32 位和 64 位模式)——我知道我不能用 64 位编译 DLL位和 32 位函数,但除此之外,我想将所有 32 位代码合并到一个 DLL 中。
      • 好吧,如果它只是一个薄的包装纸,就不应该有太多的膨胀。如前所述,另一种选择是尝试使用 LoadLibrary 从 DLL 手动加载函数
      【解决方案3】:

      就个人而言,当库开始变得有点 /crazy/ 时,我开始考虑为有问题的库提供自己的进程,并使用某种 RPC 与它们进行交互。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多