vc中如何将access数据库中的长二进制数据写成gif文件,存储在硬盘上?望各位指点

解决方案 »

  1.   

    GetChunk得到二进制数据,创建一个后缀名为gif的空文件,直接写入.
      

  2.   

    long lDataSize = m_pRst->GetFields()->GetItem("VSGif")->ActualSize;
     DWORD m_nFileLen = (DWORD)lDataSize;
     if(lDataSize > 0)
     {
      _variant_t varBLOB;
      varBLOB = m_pRst->GetFields()->GetItem("VSGif")->GetChunk(lDataSize);
      //把二进制格式的图片转为图片格式
      char * m_pJPGBuffer;
      IStream * pStream;
      IPicture * pPicture;
     
      if(varBLOB.vt == (VT_ARRAY | VT_UI1))
      {
    if(m_pJPGBuffer = new char[lDataSize+1])
    {
     char *pBuf = NULL;
     SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
     memcpy(m_pJPGBuffer,pBuf,lDataSize);        
     SafeArrayUnaccessData (varBLOB.parray);
     m_nFileLen = lDataSize;        
     //m_pJPGBuffer -> pPicture
     HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, m_nFileLen );
     LPVOID lpBuf = ::GlobalLock( hMem );
     memcpy(lpBuf,m_pJPGBuffer,m_nFileLen);
     ::GlobalUnlock( hMem );
     CreateStreamOnHGlobal( hMem, TRUE, &pStream );
     OleLoadPicture( pStream, m_nFileLen, TRUE, IID_IPicture, ( LPVOID * )&pPicture );
     ////////////////////////图片另存为//////////////////////////////////
     CString ljname;//路径名
    TCHAR szFilePath[MAX_PATH + 1]; //得到当前运行程序所在路径(其实得到的是当前执行程序存放路径)
      GetModuleFileName(NULL, szFilePath, MAX_PATH);       
      (_tcsrchr(szFilePath, _T('\\')))[1] = 0; 
    CString WorkPath=szFilePath;
    ljname=WorkPath+"Flash_Indexed_Gif\\"+GifFileName;
      CFile destFile(ljname, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
      //写文件
      destFile.Write(pBuf, m_nFileLen); //Write it
      destFile.Close();
    }
      }
     }