Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我有一个从本机 DLL 获取的位图图像的 char* 缓冲区。
我正在使用 C++/CLI 将本机 DLL 导出到 .Net
我想在没有额外副本的情况下创建一个 Drawing.Bitmap 对象形式的缓冲区。 这可以通过其中一个构造函数来完成。
问题是管理内存,当 GC 收集图像时如何删除缓冲区?
我想扩展位图,保留指向缓冲区的指针,并覆盖析构函数。
但是,如您所知,位图是密封的,图像不能被继承....有 什么想法吗?
恭喜,您遇到了一个很好的例子,说明为什么强烈建议 DLL 填充调用者提供的缓冲区,而不是返回指向在 DLL 中分配的内存的指针。通过使用调用者提供的缓冲区,您允许调用者使用他喜欢的任何方法来管理其生命周期。C++ 调用者可以使用智能指针。.NET 调用者可以使用垃圾收集。与图像关联的缓冲区可以归位图实例所有。
在您的情况下,最好的解决方案是创建适当大小和像素格式的位图,调用LockBits以访问其内部缓冲区,并将指向该缓冲区的指针传递给 DLL,然后 DLL 可以将其输出直接放入位图中。最后,调用UnlockBits.
LockBits
UnlockBits