You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关闭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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:42:18