c++ - 将状态存储在 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 中。
解决方案
您可以选择使用全局变量来存储数据,也可以将句柄传回给调用者(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 在更多语言中有用。
推荐阅读
- c# - 为什么 C# struct 方法不能返回对字段的引用,但非成员方法可以?
- amazon-web-services - 是否可以使用 AWS Athena 通过压缩文件进行查询?
- python - 将文件名中的字符添加到列名
- nginx - Nginx:第一个文件夹的通配符
- python - 即使设置了路径,pytesseract 也不能在 python 中工作
- javascript - 当我们触发父级调整 div 时,我们如何调整子级 div
- angular - onCellClicked 仅第一个单元格 AgGrid
- asp.net-core - IdP 代理 - 已启动 SLO SP
- javascript - TypeScript/Angular try catch,try 块中的任何错误都不会捕获块
- mysql - 在查询中使用来自同一个 mysql 表的数据