亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? idataobj.cpp

?? 英文版的 想要的話可以下載了 為大家服務(wù)
?? CPP
字號:
/*
 * IDATAOBJ.CPP
 * Data Transfer Object Chapter 12
 *
 * Implementation of the IDataObject interface for CDataObject.
 *
 * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
 *
 * Kraig Brockschmidt, Microsoft
 * Internet  :  kraigb@microsoft.com
 * Compuserve:  >INTERNET:kraigb@microsoft.com
 */


#include "dataobj.h"


/*
 * CImpIDataObject::CImpIDataObject
 * CImpIDataObject::~CImpIDataObject
 *
 * Parameters (Constructor):
 *  pObj            PCDataObject of the object we're in.
 *  pUnkOuter       LPUNKNOWN to which we delegate.
 */

CImpIDataObject::CImpIDataObject(PCDataObject pObj
    , LPUNKNOWN pUnkOuter)
    {
    m_cRef=0;
    m_pObj=pObj;
    m_pUnkOuter=pUnkOuter;
    return;
    }

CImpIDataObject::~CImpIDataObject(void)
    {
    return;
    }



/*
 * CImpIDataObject::QueryInterface
 * CImpIDataObject::AddRef
 * CImpIDataObject::Release
 *
 * Purpose:
 *  IUnknown members for CImpIDataObject object.
 */

STDMETHODIMP CImpIDataObject::QueryInterface(REFIID riid, PPVOID ppv)
    {
    return m_pUnkOuter->QueryInterface(riid, ppv);
    }


STDMETHODIMP_(ULONG) CImpIDataObject::AddRef(void)
    {
    ++m_cRef;
    return m_pUnkOuter->AddRef();
    }

STDMETHODIMP_(ULONG) CImpIDataObject::Release(void)
    {
    --m_cRef;
    return m_pUnkOuter->Release();
    }





/*
 * CImpIDataObject::GetData
 *
 * Purpose:
 *  Retrieves data described by a specific FormatEtc into a StgMedium
 *  allocated by this function.  Used like GetClipboardData.
 *
 * Parameters:
 *  pFE             LPFORMATETC describing the desired data.
 *  pSTM            LPSTGMEDIUM in which to return the data.
 *
 * Return Value:
 *  HRESULT         NOERROR or a general error value.
 */

STDMETHODIMP CImpIDataObject::GetData(LPFORMATETC pFE
    , LPSTGMEDIUM pSTM)
    {
    UINT        i, cItems;
    PRENDERING  pRen;
    DWORD       cb;
    HWND        hList;

    if (NULL==m_pObj->m_hList || NULL==pFE || NULL==pSTM)
        return ResultFromScode(DATA_E_FORMATETC);

    hList=m_pObj->m_hList;
    cItems=(UINT)SendMessage(hList, LB_GETCOUNT, 0, 0L);

    for (i=0; i < cItems; i++)
        {
        cb=SendMessage(hList, LB_GETTEXT, i, (LPARAM)&pRen);

        if (LB_ERR!=cb)
            {
            /*
             * Check if the requested FORMATETC is the same as one
             * that we already have. If so, then copy that STGMEDIUM
             * to pSTM and AddRef ourselves for pUnkForRelease.
             */
            if (pFE->cfFormat==pRen->fe.cfFormat
                && (pFE->tymed & pRen->fe.tymed)
                && pFE->dwAspect==pRen->fe.dwAspect)
                {
                /*
                 * ReleaseStgMedium will Release both storage
                 * and stream elements regardless of the value
                 * of pUnkForRelease, so we have to AddRef the
                 * element and bump our own ref count here.
                 */
                if (TYMED_ISTORAGE==pRen->fe.tymed)
                      pRen->stm.pstg->AddRef();

                if (TYMED_ISTREAM==pRen->fe.tymed)
                      pRen->stm.pstm->AddRef();

                *pSTM=pRen->stm;
                AddRef();
                return NOERROR;
                }
            }
        }

    return ResultFromScode(DATA_E_FORMATETC);
    }



/*
 * CImpIDataObject::GetDataHere
 *
 * Purpose:
 *  Copies a piece of data in this data object to another
 *  STGMEDIUM.  This is only supported for TYMED_ISTORAGE
 *  and TYMED_ISTREAM.
 *
 * Parameters:
 *  pFE             LPFORMATETC describing the desired data.
 *  pSTM            LPSTGMEDIUM pointing to the medium into which
 *                  we copy.
 *
 * Return Value:
 *  HRESULT         NOERROR or a general error value.
 */

STDMETHODIMP CImpIDataObject::GetDataHere(LPFORMATETC pFE
    , LPSTGMEDIUM pSTM)
    {
    UINT        i, cItems;
    PRENDERING  pRen;
    DWORD       cb;
    HWND        hList;

    if (NULL==m_pObj->m_hList || NULL==pFE || NULL==pSTM)
        return ResultFromScode(DATA_E_FORMATETC);

    //We only support IStorage and IStream
    if (!(TYMED_ISTORAGE & pFE->tymed)
        && !(TYMED_ISTREAM & pFE->tymed))
        return ResultFromScode(DATA_E_FORMATETC);

    hList=m_pObj->m_hList;
    cItems=(UINT)SendMessage(hList, LB_GETCOUNT, 0, 0L);

    for (i=0; i < cItems; i++)
        {
        cb=SendMessage(hList, LB_GETTEXT, i, (LPARAM)&pRen);

        if (LB_ERR!=cb)
            {
            /*
             * When we find a matching FORMATETC, we know we're
             * only looking for IStorage or IStream (we checked
             * above), so use IStorage::CopyTo or IStream::CopyTo
             * to make the copy.
             */
            if (pFE->cfFormat==pRen->fe.cfFormat
                && (pFE->tymed & pRen->fe.tymed)
                && pFE->dwAspect==pRen->fe.dwAspect)
                {
                if (TYMED_ISTORAGE==pFE->tymed)
                    {
                    pSTM->tymed=TYMED_ISTORAGE;
                    return pRen->stm.pstg->CopyTo(NULL, NULL
                        , NULL, pSTM->pstg);
                    }
                else
                    {
                    STATSTG     st;

                    pRen->stm.pstm->Stat(&st, STATFLAG_NONAME);
                    pSTM->tymed=TYMED_ISTREAM;

                    return pRen->stm.pstm->CopyTo(pSTM->pstm
                        , st.cbSize, NULL, NULL);
                    }
                }
            }
        }

    return ResultFromScode(DATA_E_FORMATETC);
    }







/*
 * CImpIDataObject::QueryGetData
 *
 * Purpose:
 *  Tests if a call to GetData with this FormatEtc will provide
 *  any rendering; used like IsClipboardFormatAvailable.
 *
 * Parameters:
 *  pFE             LPFORMATETC describing the desired data.
 *
 * Return Value:
 *  HRESULT         NOERROR or a general error value.
 */

STDMETHODIMP CImpIDataObject::QueryGetData(LPFORMATETC pFE)
    {
    UINT        i, cItems;
    PRENDERING  pRen;
    DWORD       cb;
    HWND        hList;

    if (NULL==m_pObj->m_hList || NULL==pFE)
        return ResultFromScode(S_FALSE);

    hList=m_pObj->m_hList;
    cItems=(UINT)SendMessage(hList, LB_GETCOUNT, 0, 0L);

    for (i=0; i < cItems; i++)
        {
        cb=SendMessage(hList, LB_GETTEXT, i, (LPARAM)&pRen);

        if (LB_ERR!=cb)
            {
            /*
             * Check if the requested FORMATETC is the same as one
             * that we already have.
             */
            if (pFE->cfFormat==pRen->fe.cfFormat
                && (pFE->tymed & pRen->fe.tymed)
                && pFE->dwAspect==pRen->fe.dwAspect)
                {
                return NOERROR;
                }
            }
        }

    return ResultFromScode(S_FALSE);
    }




/*
 * CImpIDataObject::SetData
 *
 * Purpose:
 *  Places data described by a FormatEtc and living in a StgMedium
 *  into the object.  The object may be responsible to clean up the
 *  StgMedium before exiting.
 *
 * Parameters:
 *  pFE             LPFORMATETC describing the data to set.
 *  pSTM            LPSTGMEDIUM containing the data.
 *  fRelease        BOOL indicating if this function is responsible
 *                  for freeing the data.
 *
 * Return Value:
 *  HRESULT         NOERROR or a general error value.
 */

STDMETHODIMP CImpIDataObject::SetData(LPFORMATETC pFE
    , LPSTGMEDIUM pSTM, BOOL fRelease)
    {
    PRENDERING      prn;

    //We have to remain responsible for the data.
    if (!fRelease)
        return ResultFromScode(E_FAIL);

    //If we're handed NULLs, that means clean out the list.
    if (NULL==pFE || NULL==pSTM)
        {
        m_pObj->Purge();
        return NOERROR;
        }

    /*
     * Here we take the rendering we're given and attach it to the
     * end of the list.  We save the original pSTM->pUnkForRelease
     * and replace it with our own such that each 'copy' of this
     * data is actually just a reference count.
     */

    prn=new RENDERING;

    if (NULL==prn)
        return ResultFromScode(E_OUTOFMEMORY);

    prn->fe=*pFE;
    prn->stm=*pSTM;
    prn->pUnkOrg=pSTM->pUnkForRelease;
    prn->stm.pUnkForRelease=this;

    SendMessage(m_pObj->m_hList, LB_ADDSTRING, 0, (LONG)prn);
    return NOERROR;
    }






/*
 * CImpIDataObject::EnumFormatEtc
 *
 * Purpose:
 *  Returns an IEnumFORMATETC object through which the caller can
 *  iterate to learn about all the data formats this object can
 *  provide through either GetData[Here] or SetData.
 *
 * Parameters:
 *  dwDir           DWORD describing a data direction, either
 *                  DATADIR_SET or DATADIR_GET.
 *  ppEnum          LPENUMFORMATETC * in which to return the
 *                  pointer to the enumerator.
 *
 * Return Value:
 *  HRESULT         NOERROR or a general error value.
 */

STDMETHODIMP CImpIDataObject::EnumFormatEtc(DWORD dwDir
    , LPENUMFORMATETC *ppEnum)
    {
    PCEnumFormatEtc     pEnum;

    *ppEnum=NULL;

    /*
     * From an external point of view there are no SET formats,
     * because we want to allow the user of this component object
     * to be able to stuff ANY format in via Set.  Only external
     * users will call EnumFormatEtc and they can only Get.
     */

    switch (dwDir)
        {
        case DATADIR_GET:
             pEnum=new CEnumFormatEtc(m_pUnkOuter);
             break;

        case DATADIR_SET:
        default:
            pEnum=NULL;
            break;
        }

    if (NULL==pEnum)
        return ResultFromScode(E_FAIL);
    else
        {
        //Let the enumerator copy our format list.
        if (!pEnum->Init(m_pObj->m_hList))
            {
            delete pEnum;
            return ResultFromScode(E_FAIL);
            }

        pEnum->AddRef();
        }

    *ppEnum=pEnum;
    return NOERROR;
    }





/*
 * CImpIDataObject::GetCanonicalFormatEtc
 * CImpIDataObject::DAdvise
 * CImpIDataObject::DUnadvise
 * CImpIDataObject::EnumDAdvise
 *
 * Trivial member functions.
 */

STDMETHODIMP CImpIDataObject::GetCanonicalFormatEtc
    (LPFORMATETC pFEIn, LPFORMATETC pFEOut)
    {
    return ResultFromScode(DATA_S_SAMEFORMATETC);
    }

STDMETHODIMP CImpIDataObject::DAdvise(LPFORMATETC pFE
    , DWORD dwFlags, LPADVISESINK pIAdviseSink, LPDWORD pdwConn)
    {
    return ResultFromScode(E_FAIL);
    }

STDMETHODIMP CImpIDataObject::DUnadvise(DWORD dwConn)
    {
    return ResultFromScode(E_FAIL);
    }

STDMETHODIMP CImpIDataObject::EnumDAdvise(LPENUMSTATDATA *ppEnum)
    {
    return ResultFromScode(E_FAIL);
    }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91在线国产福利| 蜜桃视频免费观看一区| 91麻豆精品国产91久久久久| 狠狠色丁香久久婷婷综| 亚洲一卡二卡三卡四卡无卡久久 | 蜜桃久久av一区| 亚洲人妖av一区二区| 久久久久国产成人精品亚洲午夜| 欧美天堂亚洲电影院在线播放| 成人一级片网址| 久久国产精品99久久久久久老狼| 亚洲午夜精品在线| 亚洲日本在线视频观看| 欧美国产国产综合| 久久久久久久久久看片| 日韩免费视频一区| 91精品欧美久久久久久动漫| 在线精品国精品国产尤物884a| 成人综合在线视频| 日本亚洲三级在线| 久久综合色鬼综合色| av在线不卡电影| 国产精品一区二区三区四区| 久久成人免费网站| 日韩电影在线看| 日本成人在线看| 青青草国产精品亚洲专区无| 亚洲成年人网站在线观看| 亚洲一区二区欧美日韩 | 麻豆精品在线看| 天天综合日日夜夜精品| 亚洲bt欧美bt精品| 天天综合天天综合色| 日韩激情一区二区| 日本欧美加勒比视频| 日本一区中文字幕| 免费成人在线视频观看| 捆绑调教一区二区三区| 精品影视av免费| 国产一区二区不卡| 风流少妇一区二区| 99久久精品国产麻豆演员表| 91女人视频在线观看| 91麻豆国产福利在线观看| 91麻豆精东视频| 欧美午夜在线一二页| 欧美日本韩国一区| 日韩欧美一区二区不卡| 精品国产乱码久久久久久蜜臀 | 亚洲成a人v欧美综合天堂下载 | 91久久久免费一区二区| 91久久久免费一区二区| 欧美另类久久久品| 精品久久久久99| 国产色综合久久| 亚洲视频资源在线| 香蕉加勒比综合久久| 久久99国产精品免费| 国产成人激情av| 日本韩国一区二区| 欧美一区二区三区免费| 国产日韩精品一区二区三区在线| 亚洲天堂精品在线观看| 天堂蜜桃一区二区三区| 国产精品一区二区在线播放| 91网站黄www| 欧美精品在线观看一区二区| 久久久久久免费网| 一级日本不卡的影视| 日韩国产在线一| 从欧美一区二区三区| 欧美日韩五月天| 久久精品无码一区二区三区| 亚洲激情图片小说视频| 久久国产福利国产秒拍| 91污片在线观看| 精品国产一区二区三区忘忧草| 国产精品久久久久久久久晋中| 三级久久三级久久| 成人久久视频在线观看| 7777精品伊人久久久大香线蕉完整版| 久久影院电视剧免费观看| 一区二区三区在线影院| 国产在线精品免费av| 欧美男女性生活在线直播观看| 国产日韩欧美a| 日韩高清在线一区| 本田岬高潮一区二区三区| 日韩限制级电影在线观看| 日韩一区在线免费观看| 久久99国产精品久久99| 欧美色爱综合网| 国产精品久久久99| 国产专区综合网| 欧美美女直播网站| 综合欧美亚洲日本| 国产精品一区二区在线观看不卡| 欧美喷潮久久久xxxxx| 国产精品久久久久久久蜜臀| 久久99国产精品尤物| 欧美日韩国产高清一区二区三区 | 欧美精品一区二区三区一线天视频| 亚洲色图.com| 高清av一区二区| 欧美成人在线直播| 亚洲va欧美va人人爽午夜 | 欧美欧美午夜aⅴ在线观看| 成人免费在线观看入口| 国产一区二区影院| 精品乱人伦一区二区三区| 亚洲成人激情社区| 91久久一区二区| 亚洲欧洲日韩av| 大陆成人av片| 欧美激情一区二区三区全黄| 激情伊人五月天久久综合| 91精品国产综合久久久久久久 | 91电影在线观看| 国产精品久久久久久久久快鸭 | 成人理论电影网| 欧美国产日韩一二三区| 国产精品自在在线| 欧美成人欧美edvon| 捆绑紧缚一区二区三区视频| 91精品国产91久久久久久一区二区| 亚洲一区在线电影| 欧洲亚洲国产日韩| 亚洲综合免费观看高清完整版| 色伊人久久综合中文字幕| 国产精品国产三级国产三级人妇| 成人中文字幕电影| 国产精品女主播在线观看| 国产99精品国产| 中文字幕av一区二区三区高| 高清在线观看日韩| 国产精品欧美久久久久一区二区| 不卡一卡二卡三乱码免费网站| 国产欧美一区二区精品性色| 成人性生交大片免费看视频在线 | 伊人夜夜躁av伊人久久| 在线观看免费成人| 调教+趴+乳夹+国产+精品| 日韩一区二区精品| 国产一二三精品| 国产精品短视频| 色噜噜久久综合| 三级不卡在线观看| 精品国产乱码久久久久久免费| 国产一区二区调教| 中文字幕一区二区三区在线播放| 一本色道综合亚洲| 天天亚洲美女在线视频| 精品久久国产字幕高潮| 成人性生交大片免费看在线播放| 亚洲免费观看高清在线观看| 欧美色图免费看| 激情综合一区二区三区| 国产精品日韩成人| 欧美伊人久久久久久久久影院| 日本不卡1234视频| 国产欧美日韩视频一区二区| 99久久国产综合精品色伊 | 97久久人人超碰| 天天av天天翘天天综合网色鬼国产 | 国产在线不卡视频| 亚洲婷婷在线视频| 欧美一区二区精品在线| 国产精品一区不卡| 一区二区三区在线观看网站| 欧美一区二区三区四区高清| 粉嫩嫩av羞羞动漫久久久| 亚洲午夜免费电影| 欧美精品一区二区在线播放| 色综合天天狠狠| 精品一二线国产| 亚洲美女视频一区| 国产精品 欧美精品| 美女视频一区二区| 欧美性一二三区| 国产精品一区二区在线播放 | 亚洲青青青在线视频| 欧美一区二区三区四区高清| 99精品一区二区三区| 久久国产日韩欧美精品| 亚洲精品乱码久久久久久久久 | 粉嫩高潮美女一区二区三区| 亚洲国产精品久久人人爱蜜臀 | 中文字幕一区二区三区在线观看 | 欧美欧美午夜aⅴ在线观看| 国产激情91久久精品导航| 午夜精品免费在线观看| 国产精品无遮挡| 日韩欧美aaaaaa| 欧美日韩综合色| av在线综合网| 国产一区二区91| 免费在线观看视频一区| 亚洲黄色av一区| 国产精品美女久久久久久| 2024国产精品|