QQ图文发送方式?可否将OCX控件当作OLE对象插入CRichEditCtrl?ADO如何读取XML中的记录集?寻求技术高人请进...................................
不知何时才可解决..............................................

解决方案 »

  1.   

    1,可以添加,自己再次封装CRichEditCtrl
    2.读xml,网上有很多,搜下即可
      

  2.   

    如何做呀,给点代码呀,我在网上找不到呀.............................,
    QQ图文发送方式?是用流的方式吗,动态GIF也可以?????
    可否将OCX控件当作OLE对象插入CRichEditCtrl?怎么写.................?
    ADO如何读取XML中的记录集,网上很多吗?
      

  3.   

    为什么要用ADO读XML?DOM或者SAX不是很好用么
      

  4.   

    ////////ocx包含{***idl.h && ***_i.c} dll包含{}
    #define USERCTRL linectlLib::_Dlinectl*   //替换此处
    BOOL InsertOleItem(IRichEditOle* lpRichEditOle,const CLSID clsid,const IID iid)
    {
    USERCTRL lpicontrl = NULL;//控件
    IStorage*    lpStorage    = NULL;//存储接口
    IOleObject*    lpOleObject    = NULL;//OLE对象
    LPLOCKBYTES    lpLockBytes    = NULL;//LOCKBYTE
    IOleClientSite* lpOleClientSite = NULL; 
    //IPolyCtl*         lpPolyCtl = NULL;     
    CLSID     clsidobj;
    REOBJECT    reobject;
    HRESULT     hr;
    if(lpRichEditOle == NULL)
       return FALSE;
    //创建PolyCtl对象并获取接口
    hr = ::CoCreateInstance(clsid,NULL,CLSCTX_INPROC,iid,(LPVOID*)&lpicontrl);
    if( lpicontrl == NULL )
    {
       return FALSE;
    }// USES_CONVERSION;
    BOOL bRet = TRUE;try{
       hr = lpicontrl->QueryInterface(&lpOleObject);//获得数据对象接口
       if( hr != S_OK ) 
        AfxThrowOleException(hr);
       hr = lpOleObject->GetUserClassID(&clsidobj);
       if ( hr != S_OK)
        AfxThrowOleException(hr);   hr = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);//创建LOCKBYTE对象
       if (hr != S_OK)
        AfxThrowOleException(hr);
       ASSERT(lpLockBytes != NULL);   hr = ::StgCreateDocfileOnILockBytes(lpLockBytes,//创建复合文档
        STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage);
       if (hr != S_OK)
       {
        VERIFY(lpLockBytes->Release() == 0);
        lpLockBytes = NULL;
        AfxThrowOleException(hr);
       }   lpRichEditOle->GetClientSite(&lpOleClientSite);   ZeroMemory(&reobject, sizeof(REOBJECT));//初始化一个对象  
       reobject.cbStruct = sizeof(REOBJECT);
       reobject.clsid    = clsidobj;
       reobject.cp     = REO_CP_SELECTION;
       reobject.dvaspect = DVASPECT_CONTENT;
       reobject.dwFlags = REO_BELOWBASELINE;
       reobject.poleobj = lpOleObject;
       reobject.polesite = lpOleClientSite;
       reobject.pstg    = lpStorage;   hr = lpRichEditOle->InsertObject( &reobject );
       if (hr != S_OK)
        AfxThrowOleException(hr);
       OleSetContainedObject(lpOleObject,TRUE);
       //在此处调用函数..............
    }catch( COleException* e )
    {
       TRACE(_T("OleException code:%d"),e->m_sc);
       e->Delete();
       bRet = FALSE;
    }// release the interface
    if( lpicontrl       != NULL )    lpicontrl->Release();
    if( lpOleObject    != NULL )    lpOleObject->Release();
    if( lpOleClientSite != NULL ) lpOleClientSite->Release();
    if( lpStorage    != NULL ) lpStorage->Release();return bRet;
    }//template<typename t,const IID *_IID> //\\_com_ptr_t< _com_IIID<t,_IID> >
    //#improt ".....***.dll" || #improt ".....***.ocx"
    #define CTRL_PTR _DlinectlPtr      //IGifAnimatorPtr      //将此处替换
    BOOL InsertOleItem2(IRichEditOle* lpRichEditOle,LPOLESTR progid,HWND hparent)
    {
    CTRL_PTR      m_ctrlptr;//控件
    LPLOCKBYTES lpLockBytes = NULL;
    SCODE sc;
    HRESULT hr;LPOLECLIENTSITE m_lpClientSite;
    CLSID clsid;
    //ptr 2 storage 
    LPSTORAGE m_lpStorage;
    //the object 2 b insert 2
    LPOLEOBJECT m_lpObject;//Create lockbytes
    sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
    if (sc != S_OK)
       AfxThrowOleException(sc);
    ASSERT(lpLockBytes != NULL);//use lockbytes to create storage
    sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
       STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &m_lpStorage);
    if (sc != S_OK)
    {
       VERIFY(lpLockBytes->Release() == 0);
       lpLockBytes = NULL;
       AfxThrowOleException(sc);
    }
    ASSERT(m_lpStorage != NULL);//get the ClientSite of the very RichEditCtrl
    lpRichEditOle->GetClientSite(&m_lpClientSite);
    ASSERT(m_lpClientSite != NULL);try
    {
       //Initlize COM interface
       hr = ::CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
       if( FAILED(hr) )
        _com_issue_error(hr);   //here, I used a smart point, so I do not need to free it
       //LPOLESTR* pstr;
       //::ProgIDFromCLSID(mclsid,pstr);
       //::CoCreateInstance()
       hr = m_ctrlptr.CreateInstance(progid);//ProgID
       if( FAILED(hr) )
        _com_issue_error(hr);   //get the IOleObject
       hr = m_ctrlptr.QueryInterface(IID_IOleObject, (void**)&m_lpObject);
       if( FAILED(hr) )
        _com_issue_error(hr);   //Set it 2 b inserted
       OleSetContainedObject(m_lpObject, TRUE);//可有可无??????   sc = m_lpObject->GetUserClassID(&clsid);
       if (sc != S_OK)
        AfxThrowOleException(sc);   //2 insert in 2 richedit, you need a struct of REOBJECT
       REOBJECT reobject;
       ZeroMemory(&reobject, sizeof(REOBJECT));   reobject.cbStruct = sizeof(REOBJECT); 
       reobject.clsid = clsid;//设置OLE对像ID
       reobject.cp = REO_CP_SELECTION;//能够被选中
       reobject.dvaspect = DVASPECT_CONTENT;//嵌入显示
       reobject.dwFlags = REO_BELOWBASELINE;//与文字在同一行 | REO_RESIZABLE ;可拉伸
       reobject.poleobj = m_lpObject;//OLE实例
       reobject.polesite = m_lpClientSite;//位置
       reobject.pstg = m_lpStorage;//存储对像 
       //reobject.dwUser = 0;
       //SIZEL sizel;
       //sizel.cx = sizel.cy = 0;
       //reobject.sizel = sizel;
       //HWND hWndRT = this->m_hWnd;
       //Sel all text
       //    ::SendMessage(hWndRT, EM_SETSEL, 0, -1);
       //    DWORD dwStart, dwEnd;
       //    ::SendMessage(hWndRT, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd);
       //    ::SendMessage(hWndRT, EM_SETSEL, dwEnd+1, dwEnd+1);
       //Insert after the line of text
       lpRichEditOle->InsertObject(&reobject);   //::SendMessage(hWndRT, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0);
       //VARIANT_BOOL ret;
       //show it    note
       m_lpObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, m_lpClientSite, 0, hparent, NULL);
       m_lpObject->DoVerb(OLEIVERB_SHOW, NULL, m_lpClientSite, 0, hparent, NULL);
       //RedrawWindow();
       if (m_lpClientSite)
       {
        m_lpClientSite->Release();
        m_lpClientSite = NULL;
       }
       if (m_lpObject)
       {
        m_lpObject->Release();
        m_lpObject = NULL;
       }
       if (m_lpStorage)
       {
        m_lpStorage->Release();
        m_lpStorage = NULL;
       }
    }
    catch( _com_error e )
    {
       AfxMessageBox(e.ErrorMessage());
       ::CoUninitialize(); 
    }
    return TRUE;
    }
    void Cdlg2Dlg::OnBnClickedInsert()
    {
    // TODO: 在此添加控件通知处理程序代码
    IRichEditOle* lpRichEditOle = m_rc.GetIRichEditOle();
    linectlLib::_Dlinectl*   mctrl = NULL;//{ocx
    //InsertOleItem(lpRichEditOle,CLSID_linectl,DIID__Dlinectl);
    //mctrl->Release();
    InsertOleItem2(lpRichEditOle,L"LINECTL.linectlCtrl.1",m_rc.m_hWnd);
    //ocx}//{dll
    //InsertOleItem2(lpRichEditOle,L"ImageOle.GifAnimator.1",m_rc.m_hWnd);
    //dll}
    }