如何使用 DLL 来模拟静态库的“应用程序内全局变量的多个实例”行为?

2024-04-28

我们有一个用 C/C++ 编写的应用程序,它被分解为单个 EXE 和多个 DLL。这些 DLL 中的每一个都使用相同的静态库(utilities.lib).

实用程序静态库中的任何全局变量实际上在应用程序内运行时都会有多个实例。每个模块(即 DLL 或 EXE)都会有一份全局变量的副本utilities.lib已链接到。

(这都是众所周知的,而且很好,但是值得回顾一下静态库在 DLL 上下文中如何行为的一些背景知识。)

现在我的问题..我们想要改变utilities.lib使其成为DLL。它变得非常庞大和复杂,我们希望以 DLL 形式分发它,而不是.lib形式。问题是,对于这个应用程序,我们希望保留当前的行为,即每个应用程序 DLL 在实用程序库中都有自己的全局变量副本。你会怎样做呢?实际上,我们并不需要所有全局变量,只需要一些;但如果我们全部得到它也没关系。


我们的想法:

  1. 库中没有太多我们关心的全局变量,我们可以用一个访问器来包装它们,该访问器会执行一些时髦的技巧来尝试找出哪个 DLL 正在调用它。大概我们可以遍历调用堆栈并找出HMODULE对于每个函数,直到找到一个不是的函数utilities.dll。然后我们可以根据调用的 DLL 返回不同的版本。
  2. 我们可以要求调用者在调用任何函数之前设置一个特定的全局变量(也可能是线程局部变量)utilities.dll。然后,实用程序 DLL 可以使用此全局变量值来确定调用上下文。
  3. 我们可以找到一些加载方式utilities.dll在运行时多次。也许我们需要在构建时制作多个重命名副本,以便每个应用程序 DLL 都可以拥有自己的实用程序 DLL 副本。这首先就否定了使用 DLL 的一些优点,但是还有其他应用程序不需要这种“静态库”样式的行为,并且仍然可以从中受益utilities.lib变得utilities.dll.

您可能最好只是让utilities.dll导出附加函数来分配和取消分配包含变量的结构,然后让每个其他工作DLL在需要时在运行时调用这些函数,例如在DLL_ATTACH_PROCESS和DLL_DETACH_PROCESS阶段DllEntryPoint()。这样,每个 DLL 都会获得自己的变量本地副本,并且可以将结构作为附加参数传递回utilities.dll 函数。

另一种方法是直接在每个工作 DLL 内本地声明各个变量,然后在需要时将它们作为输入/输出参数传递到utilities.dll 中。

无论哪种方式,都不要让utilities.dll尝试自行找出上下文信息。效果不会很好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 DLL 来模拟静态库的“应用程序内全局变量的多个实例”行为? 的相关文章

随机推荐

  • 如何获取资源文件中所有资源的名称

    在 Visual Basic 项目中 我添加了一个包含一堆图像的资源文件 resx 现在我想查询图像的名称 如果我在 Visual Studio IDE 的设计器视图中打开 resx 文件并选择一个图像 属性网格会显示一个名称属性 默认为
  • 如何使用共享数据库在 Heroku 上进行 GIS 查询?

    我有一张带有纬度和经度的地理编码位置表 我希望我的数据库查询返回它们的过滤列表 按距固定点的距离排序 我探索过以下几个选项 Postgresql 的 Earthdistance 贡献 http www postgresql org docs
  • 无法通过 phantomjs 网络服务器传送图像文件

    我正在尝试让 phantomjs 网络服务器为我工作 我想提供 2 个文件 html 文件和 png 图像文件 html 文件服务良好并在浏览器中正确呈现 但 png 文件不是 这是服务器的代码 var fs require fs func
  • 使用 CORS 进行 React 中的 Fetch 时出现问题

    我对 CORS 完全陌生 并且遇到以下问题 我正在使用 create react app 端口 3000 调用 spring boot 端口 8080 中创建的一些 REST 服务 我将 JWT 身份验证添加到我的 REST API 中 因
  • 如何根据本地目录中的requirements.txt 文件使用pip 安装软件包?

    问题是这样的 我有一个要求 txt文件看起来像 BeautifulSoup 3 2 0 Django 1 3 Fabric 1 2 0 Jinja2 2 5 5 PyYAML 3 09 Pygments 1 4 SQLAlchemy 0 7
  • mongodb 聚合随机化(shuffle)结果

    我正在浏览一堆 mongo 文档 但找不到洗牌或随机化结果内容的可能性 有没有 特别是对于聚合框架本身来说 实际上并没有任何本地方法 因为还没有可用的运算符来执行诸如生成随机数之类的操作 因此 无论您可能投射一个字段进行排序的任何匹配 都不
  • 打开和关闭 RDP 窗口

    我有很多服务器 我想检查是否可以使用 RDP 连接到它们 我有 2000 台服务器 所以我想实现自动化 我对 PowerShell 不太熟悉 以下是我所掌握的 列表 txt ip1 ip2 ip3 ipn 这是我的代码 我在每个 ip 上循
  • 解决 emacs 错误的想法:“应用:生成子进程:exec 格式错误”

    我正在尝试将 rdebug 与 emacs 和 cygwin 一起使用 但遇到了麻烦 每当我执行 M x rdebug 并为其提供适当的脚本来运行时 它都会因错误而停止 apply Spawning child process exec f
  • 是否可以在 Cython 中声明和定义位字段?

    在 C C 中你可以声明一个位域 https en cppreference com w cpp language bit field作为结构体 通过指定用于结构体中给定字段的位数 例如 typedef struct char threeB
  • 如何在 ActionBar Sherlock 中使用滑动菜单?

    我正在尝试在使用操作栏 Sherlock 的现有项目中使用滑动菜单 但我无法做到这一点 如果您能给我一个简单的演示或教程来向我展示如何做到这一点 那就太好了 我们必须使用片段来实现滑动菜单吗 Update 当用户单击滑动菜单列表中的某个项目
  • 检查 ARReferenceImage 是否在相机视图中不再可见

    我想检查一下是否AR参考图像 https developer apple com documentation arkit arreferenceimage在相机视图中不再可见 目前我可以检查图像的节点是否在相机的视图中 但是当AR参考图像
  • 将 NSSet 转换为 Swift 数组

    在 CoreData 中我定义了一个无序的一对多关系 这种关系在 Swift 中定义如下 NSManaged var types NSMutableSet 然而 为了最好地使用 Swift 我想使用一个普通的 Swift 数组 比如Type
  • Grails 中数据库迁移的良好工作流程是什么?

    我想使用数据库迁移 http grails org plugin database migration用于数据库迁移的 grails 插件 当我第一次启动 Grails 应用程序时 所有数据库表都会自动创建 我的 DataSource gr
  • Visual Studio 2015 折叠所有快捷方式

    I have gone thru http visualstudioshortcuts com 2015 http visualstudioshortcuts com 2015 this link and Keyboard shortcut
  • gcc何时编译未使用的模板代码?

    我有以下 诚然是人为的 代码 可以在 gcc 6 中编译得很好 但不能在 gcc 7 中编译 请注意 在定义中使用了未声明的构造函数bar 如果函数在代码中的其他地方被引用 取消注释 这应该打印一个错误foo bar 导致 gcc 6 打印
  • Cakephp 图像 - 无法确定 mimetype

    蛋糕PHP 2 3 我正在上传图像 但出现错误 Can not determine the mimetype Error An Internal Error Has Occurred 在我的模型上 这是我的 validation 的一部分
  • 使用 Silverlight 在运行时在 tabcontrol 中添加 TabItem

    嗨朋友们 我是 silverlight 应用程序的新手 我创建了带有 4 个 tabitem 的 tabcontrol tabitem 的名称类似于 tab1 tab2 tab3 tab4 我需要在运行项目中添加一个选项 通过以下代码添加成
  • 字符串文字的行为令人困惑

    下面的代码中字符串文字的行为非常令人困惑 我可以理解第 1 行 第 2 行和第 3 行是true 但为什么是第 4 行false 当我打印两者的哈希码时 它们是相同的 class Hello public static void main
  • 使用 JavaScript 访问 Jekyll 变量并通过 DOM 操作传递它

    我很可能有错误逻辑 但我刚刚学习 JavaScript 和 Jekyll 我的目标是通过 JavaScript 操作 HTML 元素 并将一些 Jekyll 变量放置在该元素的内部 HTML 中 一切都从本地开发目录加载jekyll ser
  • 如何使用 DLL 来模拟静态库的“应用程序内全局变量的多个实例”行为?

    我们有一个用 C C 编写的应用程序 它被分解为单个 EXE 和多个 DLL 这些 DLL 中的每一个都使用相同的静态库 utilities lib 实用程序静态库中的任何全局变量实际上在应用程序内运行时都会有多个实例 每个模块 即 DLL