各位高手:我在做程序的时候遇到这个问题:
   1、我需要动态的将Icon文件的图标导入到HICON变量中去,因为icon文件未知,所以只能动态的根据icon文件的路径导入到HICON变量中。
      已知icon文件的路径->导入到HICON中!
   2、将HICON变量的图形数据存到SQL SERVER数据库中。
   3、从数据库中读出HICON.
最好能给我一点例子,不胜感激!!!!!

解决方案 »

  1.   

    2。下面程序可以保存二进制文件 不过是连接到ACCESS 你修改一下就可以连接SQL SERVER 
    HRESULT   hr;
    DWORD FileSize,count;
    char *pBuf;
    VARIANT varBLOB;
    SAFEARRAY *psa;
    VARIANT rgvFields;
    VARIANT rgvValues;
    CFile f;
    CFileException e;
    HGLOBAL hfilemem;

    SAFEARRAYBOUND rgsabound[1];
    hr=CoInitialize(NULL);
    CString Constr,wCmdString;
    CComPtr<ADOField> pField;
    if(FAILED(hr))
    m_Conn = NULL;
    m_Rec = NULL;
    pFields = NULL; if(!f.Open(m_PhotoPath,CFile::modeRead,&e))
    {
    AfxMessageBox("打开文件错误!");
    return;
    }
    f.SeekToBegin();
    FileSize=f.GetLength();
    hfilemem=GlobalAlloc(GMEM_MOVEABLE,(FileSize));
    if(!hfilemem)
    {
    ::AfxMessageBox("内存不够!");
    return;
    }
    pBuf=(char *)GlobalLock(hfilemem);
    count=f.Read(pBuf,FileSize);
    if(count!=FileSize)
    {
    ::AfxMessageBox("数据错误");
    f.Close(); 
    return;
    }
    f.Close();
    JudgeAdo();
    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 ;
    }
    /*     添加新的记录 需要两个参数 所以添加两个空的参数*/
    rgvFields.vt = VT_ERROR;
    rgvFields.scode = DISP_E_PARAMNOTFOUND;
    rgvValues.vt = VT_ERROR;
    rgvValues.scode = DISP_E_PARAMNOTFOUND;
    UpdateData(); 
    m_Rec->AddNew(rgvFields, rgvValues);
    m_Rec->put_Collect(CComVariant(1),(CComVariant)(m_UserName));
    m_Rec->put_Collect(CComVariant(2),CComVariant((long)m_UseOld));             ///为新记录填充username字段
    pField=NULL;
    if(pBuf)
    {    
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = FileSize;
    psa = SafeArrayCreate(VT_UI1, 1, rgsabound);                      ///创建SAFEARRAY对象
    for (long i = 0; i < (long)FileSize; i++)
    SafeArrayPutElement (psa, &i, pBuf++);                         ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中
    varBLOB.vt = VT_ARRAY | VT_UI1;                                   ///将varBLOB的类型设置为BYTE类型的数组
    varBLOB.parray = psa;                                             ///为varBLOB变量赋值
    m_Rec->get_Fields(&pFields);//加入BLOB类型的数据
    pFields->get_Item(CComVariant(3),&pField);
    pField->AppendChunk(varBLOB);///加入BLOB类型的数据

    hr=m_Rec->Update(rgvFields, rgvValues);  
    if(FAILED(hr))
    {
    ::AfxMessageBox("保存失败!");
    return ;
    }
    // m_Rec->UpdateBatch(adAffectAll);
    GlobalUnlock(hfilemem);
    GlobalFree(hfilemem);
    if(m_Rec)
    {
    m_Rec->Close();
    }
    if(m_Conn)
    {
    m_Conn->Close();
    // m_Conn->Release();
    }
      

  2.   

    3。将数据从数据库读出到内存里面BUF 如果你要显示需要自己处理一下
    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);
    }
    }