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

Win32 - separating data in multiple loaded DLL instances in pure C

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

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

我考虑将全局数据放在某种结构中-table 并根据唯一 ID 通过宏访问它。但是我如何才能在 Win32 中确定地识别 DLL 实例呢?
可能还有其他模式吗?

设计良好的插件系统不能要求插件具有任何全局变量。 Common C-style Plugin API 设计看起来像

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

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

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