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