如何在c++中实现有状态dll
How to implement a stateful dll in c++
(抱歉,无法发布代码(
在实现dll时,具有无状态的优点。一个例子是视频分析,其中结果取决于最近的帧。dll的操作具有一个状态(=最近的帧(。但是,这种状态是基于内存的,因此它可以由调用方拥有,并且dll保持无状态。
但是,您不能总是使dll成为无状态。考虑依赖于另一个状态为的第三方dll的dll。这种状态可以基于GPU、线程和通信资源。您不想将调用方暴露给其他第三方dll,因此需要(从dll中(保持状态。
如何在dll中使用c++最优雅、最有效地实现这一点
我当前的实现有一个名为DllContext
的类。DllContext
只实例化一次,就永远只有一个对象。有一个类型为DllContext*
的静态指针,它将在该对象的生存期内保持该对象。这里的静态表示作用域:它是在任何函数体之外定义的,而不是任何类的一部分。它只能从定义3个dll入口点的最小文件访问:
dllinit()
:使用new
创建对象
dlldeInit()
:使用delete
删除对象
dlldoWork()
:调用DllContext
对象的对应doWork()
我不喜欢这种解决方案。我想说它不是一个单例解决方案,因为对象只能从一个最小文件访问。然而,它仍然很丑陋,有什么建议吗?
您没有太多选择。在第一次无状态调用时调用init
。使用一个小的包装器静态对象,而不是裸露的DllContext
指针,以便能够在其析构函数中调用deInit
。或者甚至不用担心deInit
。为什么要清理要拆迁的房子?除非真的有一个原因不是"防止内存泄漏"。
相关文章:
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- 如何在c++中实现有状态dll
- 在 C++ DLL 中存储状态
- 全局挂钩 DLL 仅在 C# 主窗口处于活动状态/前台时调用 C# 回调方法
- 如何防止我的dll在某个进程未处于活动状态时运行
- C++DLL依赖状态模式
- 在来自C++应用程序的成功调用之间保留dll中的状态