我在使用c ++将状态存储在dll中时遇到问题。我目前拥有的是这样的:
#ifndef FOO
#define FOO
#ifdef BUILD_DLL
#define DECLSPEC __declspec(dllexport)
#else
#define DECLSPEC __declspec(dllimport)
#endif
namespace FOO
{
extern "C"
{
DECLSPEC bool initialize();
DECLSPEC void addSomething();
DECLSPEC void removeSomething();
DECLSPEC void shutDown();
}
}
#endif // FOO
现在,我希望我的dll能够具有某种状态。例如,我希望通过addSomething()添加的内容存储在dll内的std :: vector中,并能够从removeSomething()获取相同的向量。由于我的dll仅导出了一组函数,因此我真的看不到一种干净的方法。我现在唯一想到的是dll中的全局变量。有没有比这更好的解决方案?我有点想避免使用全局变量,即使它们仅位于dll中。
答案 0 :(得分:2)
您可以选择使用全局变量来存储数据,也可以将句柄传递回调用方(例如,从initialize()
开始)并将数据挂起。然后,调用者在调用任何公开的方法时都将传递此句柄;例如:
typedef void *MyHandle;
// NULL would be an error
DECLSPEC MyHandle initialize();
DECLSPEC void addSomething(MyHandle handle);
DECLSPEC void destroy(MyHandle handle);
在实现中,您将MyHandle
转换为不会暴露给调用者的具体类型。
这使您的DLL在该过程中可以多次使用,并避免使用全局变量。
我发现您同时使用namespace
和extern "C"
很奇怪;我认为您应该坚持使用C-Linkage来使DLL在更多语言中有用。