【问题标题】:About Dynamic linking library in C++关于 C++ 中的动态链接库
【发布时间】:2011-12-22 10:54:17
【问题描述】:

这个问题是关于动态链接库和应用程序中动态链接库的使用。

例如,我们正在使用 Visual Studio 环境使用 C++ 开发应用程序。

这里是我们在附加包含目录中指定的包含头文件,以及 在附加依赖项中:Mylibrary.lib 在其他库目录中:我们指定库的路径

在 Windows 中,我们还有用于加载动态链接库的“LoadLibrary”API。

我的问题是

  1. 当我们在附加依赖库中包含 dll 时,为什么我们应该使用“LoadLibrary”API?
  2. 什么时候应该使用“LoadLibrary”API?

谢谢!

【问题讨论】:

    标签: c++ dll


    【解决方案1】:

    LoadLibrary 允许您在 dll 不在运行的机器上时继续执行程序。它返回一个可以检查的错误状态并可以继续执行。

    另外,链接可以让你做一些事情,比如使用来自其他二进制文件和其他文件的类。 LoadLibrary 只允许您通过GetProcAddress 查找函数。

    【讨论】:

    • 实际上,还有第三种选择(我不太推荐):延迟加载。有了这个,您可以像平常一样使用 lib 文件使用 dll,但在加载时不需要它,而是在首次访问时需要它。由于这是由编译器隐式完成的(据我所知),它有些隐藏并导致难以调试的错误。请参阅msdn.microsoft.com/en-us/library/151kt790.aspx 了解更多信息。
    【解决方案2】:

    假设您有一个软件,例如需要在确定的时间进行转换 Internet 网络地址转换成字符串。 在 windows vista 或更高版本上,您可以使用也能够处理 ipv6 的“InetNtop”功能,但如果您直接链接到 DLL,您的程序将无法在较低的操作系统上运行(例如:windows xp)。 因此,最好的解决方案可能是制作 2 个 DLL,一个使用“InetNtop”,另一个使用“inet_ntoa”。 然后,根据他安装的操作系统,您的“主”程序将在运行时执行“InetNtop DLL”或“inet_ntoa DLL”的 LoadLibrary。

    【讨论】:

      【解决方案3】:

      你问你可以在附加依赖库中包含 dll,然后为什么要使用 loadlibrary。

      首先让我们理清思路:

      静态链接时,需要程序员将 .lib 文件添加到 附加库依赖,在编译时链接到调用者程序,

      但是,Dll 是动态加载的,因此当您使用 LoadLibrary 时,您无需在附加库依赖项中添加 dll,即;如果您明确链接 Dll,则无需在附加库依赖项中提供您的 dll 路径。

      请注意: 使用 LoadLibrary 您将能够获取 Dll 句柄,您可以使用 GetProcAddress 调用导出的函数。

      参考: https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-12
        • 1970-01-01
        • 2018-09-23
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多