【问题标题】:Call static lib function embedded in DLL调用嵌入在 DLL 中的静态库函数
【发布时间】:2011-10-13 20:28:56
【问题描述】:

假设如下架构:

  • 在 DLL 中使用/链接静态库
  • DLL 由可执行文件加载(隐式或显式)

是否可以从可执行代码访问静态库的代码,而无需显式重新链接或在 DLL 中插入包装函数? 换句话说,我正在寻找一种方法来对依赖的静态库代码进行 dll 导出。

【问题讨论】:

  • 自己链接静态库会有什么问题?
  • 仅仅因为DLL与静态库链接,并不意味着整个静态库都包含在内。

标签: c winapi dll


【解决方案1】:

鉴于您的限制,答案是否定的。

原因是可执行文件对 DLL 的依赖项或“被调用方”没有任何可见性。就可执行文件而言,他只知道 DLL 本身:在链接时,可执行文件只知道它从 DLL 消耗的那些导出。他将针对 DLL 执行 LoadLibrary()(如果所述 DLL 的依赖项不可解析,则会失败),然后调用所述 DLL 的导出。

如果由于某种原因无法与 DLL 使用的库进行静态链接,另一种方法是将调用包装到所述静态库。这可能会让人很痛苦,因为有很多电话,但是其他人已经创建了一些自动化工具来提供帮助。特别是我之前用它来为一个 DLL 创建一个包装器,当我想拦截一个特定的函数时,它导出了数百个函数:http://www.codeproject.com/KB/DLL/CreateYourProxyDLLs.aspx

【讨论】:

    【解决方案2】:

    答案很可能是:是的。

    唯一的要求是:

    在您的静态 LIB 文件中,您必须为所有要导出的内容定义 __declspec(dllexport)。 然后,当您将此 LIB 文件包含到您的 DLL 项目中时,您声明为 __declspec(dllexport) 的所有函数将自动成为 DLL 导出,并且可以从您的 Exe 访问。

    【讨论】:

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