将文件加载到内存流

本文介绍了一个用于将指定文件加载到内存流中的函数实现。该函数通过读取文件内容到内存,并利用COM对象IStream来封装这些数据。具体步骤包括打开文件、获取文件大小、分配内存、读取文件内容到内存中、解锁已分配的内存,最后创建并返回内存流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
*函数介绍:将文件加载到内存流中
*入口参数:tszFilename:表示要打开的文件
*出口参数: ppStream : 表示内存流,将文件中的内容输出到此内存流中
*返回值:S_OK :表示成功,否则失败
*/
HRESULT CreateStreamOnFile(const TCHAR * tszFilename, IStream ** ppStream)
{
    HRESULT hrRet = S_FALSE;
    HGLOBAL hg = NULL;
    HANDLE hFile = NULL;
    DWORD dwSize, dwRead;
    BYTE* pbLocked = NULL;

    //打开文件
    hFile = CreateFile(tszFilename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (INVALID_HANDLE_VALUE == hFile)
    {
        goto error;
    }

 //得到文件大小
    dwSize = GetFileSize(hFile, NULL);
    if (0xffffffff == dwSize)
    {
        goto error;
    }

    //分配内存
    hg = GlobalAlloc(GMEM_MOVEABLE, dwSize);
    if (NULL == hg)
    {
        goto error;
    }

    //得到已经分配的内存指针
    pbLocked = (BYTE*) GlobalLock(hg);
    if (NULL == pbLocked)
    {
        goto error;
    }

    //读取文件内容到内存中
    if (!ReadFile(hFile, pbLocked, dwSize, &dwRead, NULL))
    {
        goto error;
    }

 //解锁已经分配全局内存,对应GlobalLock(hg)
    GlobalUnlock(hg);
   
    //创建Stream对象
    hrRet = CreateStreamOnHGlobal(hg, TRUE, ppStream);

 //关闭文件流
    CloseHandle(hFile);
    return hrRet;
error: //错误处理,并释放内存
    if (pbLocked)
        GlobalUnlock(hg);
    if (hg)
        GlobalFree(hg);
    if (hFile)
        CloseHandle(hFile);
    return hrRet;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值