如何关闭GDI+扁平接口GdipCreateStreamOnFile创建的流?
如何关闭GdipCreateStreamOnFile创建的流
嘿,这个问题我太清楚了!用GdipCreateStreamOnFile创建的流本质上是一个标准的COM对象,它实现了IStream接口,所以正确的关闭/释放方式完全遵循COM对象的生命周期管理规则:
- 当你通过
GdipCreateStreamOnFile成功获取到IStream*类型的流指针后,这个对象的引用计数会被初始化为1; - 当你完成所有流操作后,只需要调用指针的
Release()方法,让引用计数递减。当引用计数降到0时,COM系统会自动关闭关联的文件句柄,并释放流占用的所有系统资源。
简单代码示例
#include <gdiplusflat.h> int main() { // 先确保GDI+已初始化(如果还没的话) GdiplusStartupInput startupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &startupInput, nullptr); IStream* pFileStream = nullptr; // 创建指向文件的流,第二个参数TRUE表示可写 GpStatus status = GdipCreateStreamOnFile(L"example.png", TRUE, &pFileStream); if (status == Ok) { // 在这里执行你的流操作:比如写入图像数据、读取文件内容等 // ... // 用完流后,调用Release释放资源 pFileStream->Release(); pFileStream = nullptr; // 好习惯:置空避免野指针 } // 最后别忘了关闭GDI+ GdiplusShutdown(gdiplusToken); return 0; }
关键注意事项
- 绝对不要直接用
delete操作符删除IStream*指针!COM对象的内存由系统管理,直接delete会触发未定义行为,导致程序崩溃或资源泄漏。 - 如果你在操作过程中调用过
AddRef()手动增加了引用计数,一定要确保Release()的调用次数和AddRef()完全对应,否则会导致资源无法正常释放。
内容的提问来源于stack exchange,提问作者user1274247
相关产品推荐
相关产品推荐

