封装几个关于流IStream的功能函数

2014-11-15 20:41:42 · 作者: · 浏览: 32

  // =====================================================


  // 根据文件创建流对象


  // 参数: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;


  }