// =====================================================
// 根据文件创建流对象
// 参数:pszFile 文件路径
// ppStream 保存创建的流对象
// 返回值:返回创建成功与否
// 说明:用完ppStream需释放
// =====================================================
BOOL CreateStreamFromFile (LPCTSTR pszFile, IStream** ppStream)
{
//打开文件
HANDLE hFile = ::CreateFile (pszFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if (hFile == INVALID_HANDLE_VALUE)
return FALSE;
BOOL bSuccess = TRUE;
do
{
bSuccess = FALSE;
//获取文件长度
LARGE_INTEGER lSize;
if (!::GetFileSizeEx (hFile, &lSize))
break;
//分配文件长度大小的内存块
HGLOBAL hGlobal;
hGlobal = ::GlobalAlloc (GPTR, lSize.LowPart);
if (hGlobal == NULL)
break;
//将文件数据读入内存块
void* pBuffer = (void*)hGlobal;
DWORD dwReaded(0);
if (::ReadFile (hFile, pBuffer, lSize.LowPart, &dwReaded, NULL))
{
//在内存块上创建流
bSuccess = SUCCEEDED (::CreateStreamOnHGlobal (hGlobal, TRUE, ppStream));
}
} while (FALSE);
::CloseHandle (hFile);
return bSuccess;
}