将状态存储在C ++ dll中

时间:2019-08-29 08:16:07

标签: c++ dll

我在使用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中。

1 个答案:

答案 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在该过程中可以多次使用,并避免使用全局变量。

我发现您同时使用namespaceextern "C"很奇怪;我认为您应该坚持使用C-Linkage来使DLL在更多语言中有用。