我知道这个话题经常被问到,但我没有找到 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/