首页 > 解决方案 > 将状态存储在 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 中。

标签: c++dll

解决方案


您可以选择使用全局变量来存储数据,也可以将句柄传回给调用者(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 在更多语言中有用。


推荐阅读