/**函数介绍:将文件加载到内存流中*入口参数: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;}