谢了先!!

解决方案 »

  1.   

    HRESULT   hr;
    HDC hdc;
    char *pBuf;
    VARIANT varBLOB;
    VARIANT rgvValues;
    BSTR Bstr1;
    long lDataSize;
    COleVariant rValueData;
    hr=CoInitialize(NULL);
    CString Constr,wCmdString;
    CComPtr<ADOField> pField;
    // if(FAILED(hr))
    m_Conn = NULL;
    m_Rec = NULL;
    pFields = NULL;
    hr = ::CoCreateInstance((REFCLSID)CLSID_CADOConnection,NULL,CLSCTX_INPROC_SERVER,\
    (REFIID)IID_IADOConnection,(LPVOID*)&m_Conn);
    if (FAILED(hr))
    return ;
    hr = ::CoCreateInstance((REFCLSID)CLSID_CADORecordset,NULL,CLSCTX_INPROC_SERVER,\
    (REFIID)IID_IADORecordset,(LPVOID*)&m_Rec);
    if (FAILED(hr))
    return ;
    Constr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+tempstr+";Persist Security Info=False";
    hr = m_Conn->Open(CComBSTR(Constr),CComBSTR(""),CComBSTR(""),adOpenUnspecified);
    if (FAILED(hr))
    {
    ::AfxMessageBox("连接数据库错误!");
    return ;
    }
    wCmdString=_T("select * from userphoto");//
    hr = m_Rec->Open(CComVariant(wCmdString),CComVariant(m_Conn),adOpenKeyset,adLockOptimistic,adCmdText);
    if (FAILED(hr))
    {
    ::AfxMessageBox("打开表错误!");
    return ;
    }
    m_Rec->get_Collect(CComVariant(1),rValueData);
    Bstr1= (_bstr_t) rValueData;
    m_UserName.Format("%s",(CString)Bstr1);
    rValueData.Clear(); 
    m_Rec->get_Collect(CComVariant(2),rValueData);    ///为新记录填充username字段
    m_UseOld=rValueData.intVal;
    pField=NULL;
    m_Rec->get_Fields(&pFields);//加入BLOB类型的数据
    pFields->get_Item(CComVariant(3),&pField);
    pField->get_ActualSize(&lDataSize);
    if(lDataSize > 0)
    {
    rgvValues.vt = VT_ERROR;
    rgvValues.scode = DISP_E_PARAMNOTFOUND;
    pField->GetChunk(lDataSize,&varBLOB);
    if(varBLOB.vt == (VT_ARRAY | VT_UI1))                                 ///判断数据类型是否正确
    {
    SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);              ///得到指向数据的指针
    /*****在这里我们可以对pBuf中的数据进行处理*****/
    SafeArrayUnaccessData (varBLOB.parray);
    }
    }
    hdc=::GetDC(m_Show.m_hWnd);
    CRect r_Show;
    m_Show.GetClientRect(r_Show);
    int xpos=r_Show.left;
    int ypos=r_Show.top;// IPicture *pPic; 
    IStream *pStm; 
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, lDataSize); 
    LPVOID pvData = NULL; 
    if (hGlobal != NULL) 

    if ((pvData = GlobalLock(hGlobal)) != NULL) 

    memcpy(pvData,pBuf,lDataSize);
    GlobalUnlock(hGlobal); 
    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); 
    if(SUCCEEDED(OleLoadPicture(pStm,lDataSize,TRUE,IID_IPicture,(LPVOID*)&pPic))) 

    m_ok=TRUE;
    OLE_XSIZE_HIMETRIC hmWidth; 
    OLE_YSIZE_HIMETRIC hmHeight; 
    pPic->get_Width(&hmWidth); 
    pPic->get_Height(&hmHeight); 
    double fX,fY; 
    fX = r_Show.Width();
    fY = r_Show.Height();
    if(FAILED(pPic->Render(hdc,xpos,ypos,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL))) 
    AfxMessageBox("Failed To Render The picture!"); 
    // pPic->Release(); 

    else 
    AfxMessageBox("Error Loading Picture From Stream!"); 


    GlobalFree(hGlobal);