c - Win32 - 在纯 C 中分离多个加载的 DLL 实例中的数据

标签 c multithreading winapi dll ipc

我知道这个话题经常被问到,但我没有找到 C 的答案。
由于几个兼容性问题(跨平台编译),我无法使用 C++。 所以我不得不用C重写引擎。引擎本身使用Lua和几个全局变量(我知道全局是邪恶的)。

引擎被闭源程序(单线程)用作DLL插件。当程序使用多个引擎克隆时会出现此问题。都是同一个DLL加载了好几次。问题是如果我不能使用 C++,最好的方法是什么?

我考虑将全局数据放置在某种结构表中,并根据唯一 ID 通过宏访问它。但是如何在 Win32 中确定 DLL 实例呢?
也许还有其他模式?

最佳答案

设计良好的插件系统一定不需要插件拥有任何全局变量。常见的C风格插件API设计看起来像

ObjectHandle CreateObject(...);
ReturnType CallSomeMethod(ObjectHandle handle, ...);

在 CreateObject 中,您分配一个包含所有所需数据的结构(例如 MyObject)并返回指向 MyObject 的指针。在 CallSomeMethod 中,您将句柄转换为 MyObject* 并获取数据。

如果你处理的插件系统设计良好,就遵循这个规则。 如果不是,则将其丢弃或按照上面的建议克隆您的 DLL。 顺便说一句,语言(C、C++)在这里根本不重要。

关于c - Win32 - 在纯 C 中分离多个加载的 DLL 实例中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28511347/

相关文章:

c++ - 如何更改已映射和已提交内存空间的权限?

c - 如何在不丢失主要轮廓的情况下将字母的灰度图像转换为二进制图像?

c - 矩阵索引自动更新?

c# - ASP.NET Web API 异步任务,发送邮件

c++ - GetCurrentConsoleFont 未在范围内声明,我做错了什么?

perl - 测试::更多:由于转义序列而导致的糟糕计划

c - select() 的返回值为空集

c++ - 如何在 Linux 中找到具有写时复制的 fork 进程之间共享多少内存?

multithreading - Google Compute Engine 上的 1 个 vCPU 基本上是 1 个物理 CPU 核心的一半吗?

java - vertx-web 路由处理程序是单例还是每次都会实例化一个新的?