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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? beeper.cpp

?? 英文版的 想要的話可以下載了 為大家服務
?? CPP
字號:
/*
 * BEEPER.CPP
 * Simple Automation Object #5 Chapter 14
 *
 * Implementation of the CBeeper class demonstrating the use of
 * CreateStdDispatch instead of DispInvoke, DispGetIDOfNames, and
 * a custom IDispatch implementation.  In this case we don't have
 * our own IDispatch at all, which CreateStdDispatch provides for
 * us, but at the loss of multiple language support and the ability
 * to define exception.
 *
 * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
 *
 * Kraig Brockschmidt, Microsoft
 * Internet  :  kraigb@microsoft.com
 * Compuserve:  >INTERNET:kraigb@microsoft.com
 */


#include "beeper.h"


/*
 * CBeeper::CBeeper
 * CBeeper::~CBeeper
 *
 * Parameters (Constructor):
 *  pUnkOuter       LPUNKNOWN of a controlling unknown.
 *  pfnDestroy      PFNDESTROYED to call when an object
 *                  is destroyed.
 */

CBeeper::CBeeper(LPUNKNOWN pUnkOuter, PFNDESTROYED pfnDestroy)
    {
    m_cRef=0;
    m_pUnkOuter=pUnkOuter;
    m_pfnDestroy=pfnDestroy;

    m_lSound=0;
    m_pITINeutral=NULL;
    m_pIUnkStdDisp=NULL;
    return;
    }


CBeeper::~CBeeper(void)
    {
    ReleaseInterface(m_pIUnkStdDisp);
    ReleaseInterface(m_pITINeutral);
    return;
    }



/*
 * CBeeper::Init
 *
 * Purpose:
 *  Performs any intiailization of a CBeeper that's prone to failure
 *  that we also use internally before exposing the object outside.
 *
 * Parameters:
 *  None
 *
 * Return Value:
 *  BOOL            TRUE if the function is successful,
 *                  FALSE otherwise.
 */

BOOL CBeeper::Init(void)
    {
    LPUNKNOWN       pIUnknown=this;
    ITypeLib       *pITypeLib;
    HRESULT         hr;

    if (NULL!=m_pUnkOuter)
        pIUnknown=m_pUnkOuter;

    /*
     * Load our type library.  Since this sample uses
     * CreateStdDispatch we can only support one locale,
     * which is neutral (English) in this case.
     */

    if (FAILED(LoadRegTypeLib(LIBID_BeeperTypeLibrary, 1, 0
        , LANG_NEUTRAL, &pITypeLib)))
        {
        /*
         * If LoadRegTypeLib fails, try loading directly with
         * LoadTypeLib, which will register the library for us.
         *
         * NOTE:  You should prepend your DIR registry key to the
         * .TLB name so you don't depend on it being it the PATH.
         * This sample will be updated later to reflect this.
         */
        if (FAILED(LoadTypeLib(OLETEXT("BEEP0000.TLB"), &pITypeLib)))
            return FALSE;
        }

    //Get the type information out of the type library.
    hr=pITypeLib->GetTypeInfoOfGuid(DIID_DIBeeper, &m_pITINeutral);

    if (FAILED(hr))
        {
        pITypeLib->Release();
        return FALSE;
        }

    m_pImpIProvideCI=new CImpIProvideClassInfo(this, pITypeLib);
    pITypeLib->Release();

    if (FAILED(hr))
        return FALSE;

    /*
     * CreateStdDispatch always returns an IUnknown pointer
     * because such is required in aggregation, which is
     * involved here.  In other words, the Beeper is aggregating
     * on the OLE-provided "StdDispatch" object in order to
     * directly expose IDispatch from that object.  See the
     * implementation of QueryInterface.
     */
    hr=CreateStdDispatch(pIUnknown, (IBeeper *)this, m_pITINeutral
        , &m_pIUnkStdDisp);

    if (FAILED(hr))
        return FALSE;

    return TRUE;
    }



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

STDMETHODIMP CBeeper::QueryInterface(REFIID riid, PPVOID ppv)
    {
    *ppv=NULL;

    /*
     * The only calls for IUnknown are either in a nonaggregated
     * case or when created in an aggregation, so in either case
     * always return our IUnknown for IID_IUnknown.
     */
    if (IID_IUnknown==riid || IID_IBeeper==riid)
        *ppv=this;

    /*
     * We specifically have to ask the object returned from
     * CreateStdDispatch for our dispinterface.  Note that
     * it only understands IID_IDispatch and not DIID_DIBeeper,
     * so we convert requests for DIID_DIBeeper into IID_IDispatch
     * which amounts to exactly the same thing.
     */
    if (IID_IDispatch==riid || DIID_DIBeeper==riid)
        return m_pIUnkStdDisp->QueryInterface(IID_IDispatch, ppv);

    //AddRef any interface we'll return.
    if (NULL!=*ppv)
        {
        ((LPUNKNOWN)*ppv)->AddRef();
        return NOERROR;
        }

    return ResultFromScode(E_NOINTERFACE);
    }


STDMETHODIMP_(ULONG) CBeeper::AddRef(void)
    {
    return ++m_cRef;
    }


STDMETHODIMP_(ULONG) CBeeper::Release(void)
    {
    if (0L!=--m_cRef)
        return m_cRef;

    //Inform the server about destruction so it can handle shutdown
    if (NULL!=m_pfnDestroy)
        (*m_pfnDestroy)();

    delete this;
    return 0L;
    }



//IBeeper interface functions

/*
 * CBeeper::get_Sound
 * CBeeper::put_Sound
 *
 * Purpose:
 *  Functions called from DispInvoke to handle the Sound property.
 *
 * Parameters (Set only):
 *  lSound          long, new sound to save after validation.
 *
 * Return Value: (Get only):
 *  ULONG           Current sound.
 */

STDMETHODIMP_(long) CBeeper::get_Sound(void)
    {
    return m_lSound;
    }


STDMETHODIMP_(void) CBeeper::put_Sound(long lSound)
    {
    if (MB_OK!=lSound && MB_ICONEXCLAMATION!=lSound
        && MB_ICONQUESTION!=lSound && MB_ICONHAND!=lSound
        && MB_ICONASTERISK!=lSound)
        {
        /*
         * We cannot return error information to the StdDispatch
         * given the way we've defined the return value of this
         * methods, so we can't raise an exception.
         */
        return;
        }

    m_lSound=lSound;
    return;
    }



/*
 * CBeeper::Beep
 *
 * Purpose:
 *  Function called from DispInvoke to invoke the Beep method.
 *
 * Return Value:
 *  long            The sound played.
 */

STDMETHODIMP_(long) CBeeper::Beep(void)
    {
    MessageBeep((UINT)m_lSound);
    return m_lSound;
    }




/*
 * Since CreateStdDispatch provides an IDispatch implementation
 * for us, there's no specific code for that interface needed here.
 *
 * So to not get rid of too much code, we'll add an
 * IProvideClassInfo
 */



/*
 * CImpIProvideClassInfo::CImpIProvideClassInfo
 * CImpIProvideClassInfo::~CImpIProvideClassInfo
 *
 * Parameters (Constructor):
 *  pUnkOuter       LPUNKNOWN of a controlling unknown.
 *  pITypeLib       ITypeLib * to return from this interface.
 */

CImpIProvideClassInfo::CImpIProvideClassInfo(LPUNKNOWN pUnkOuter
    , ITypeLib *pITypeLib)
    {
    m_cRef=0;
    m_pUnkOuter=pUnkOuter;

    /*
     * Get the coclass type info.  If this fails then we'll
     * just fail GetClassInfo below.
     */
    m_pITI=NULL;
    pITypeLib->GetTypeInfoOfGuid(CLSID_Beeper, &m_pITI);
    return;
    }


CImpIProvideClassInfo::~CImpIProvideClassInfo(void)
    {
    ReleaseInterface(m_pITI);
    return;
    }


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

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


STDMETHODIMP_(ULONG) CImpIProvideClassInfo::AddRef(void)
    {
    return m_pUnkOuter->AddRef();
    }


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




/*
 * CImpIProvideClassInfo::GetClassInfo
 *
 * Purpose:
 *  Returns the type information for this coclass.
 *
 * Parameters:
 *  ppITI           ITypeInfo ** in which to store the ITypeInfo
 *                  for this coclass.
 *
 * Return Value:
 *  HRESULT         NOERROR on success, error otherwise.
 */

STDMETHODIMP CImpIProvideClassInfo::GetClassInfo(ITypeInfo **ppITI)
    {
    if (NULL==ppITI)
        return ResultFromScode(E_POINTER);

    *ppITI=m_pITI;

    if (NULL!=m_pITI)
        {
        m_pITI->AddRef();
        return NOERROR;
        }

    return ResultFromScode(E_FAIL);
    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产.精品.日韩.另类.中文.在线.播放| 91麻豆高清视频| 99久久精品免费观看| 欧美一区永久视频免费观看| 国产欧美日韩综合精品一区二区| 夜夜嗨av一区二区三区| 国产精品小仙女| 欧美精品少妇一区二区三区| 国产精品久线观看视频| 久久99国内精品| 欧美三级午夜理伦三级中视频| 久久先锋影音av鲁色资源网| 日韩在线播放一区二区| 91美女片黄在线观看| 久久免费的精品国产v∧| 亚洲v中文字幕| 91浏览器在线视频| 中文字幕一区二区三区四区| 极品少妇一区二区| 欧美不卡在线视频| 日韩电影在线看| 欧美色视频一区| 夜夜操天天操亚洲| 欧美视频日韩视频在线观看| 亚洲成av人综合在线观看| zzijzzij亚洲日本少妇熟睡| 久久久影视传媒| 狠狠色丁香久久婷婷综合丁香| 制服丝袜亚洲网站| 亚洲精品亚洲人成人网在线播放| av在线一区二区| 国产精品另类一区| jiyouzz国产精品久久| 国产精品欧美一区二区三区| 懂色av一区二区三区免费看| 中文字幕高清不卡| 成人激情免费电影网址| 国产精品久久夜| 色综合天天性综合| 亚洲另类一区二区| 欧美日韩卡一卡二| 日韩福利视频网| 久久综合精品国产一区二区三区| 精品午夜一区二区三区在线观看| 久久综合狠狠综合久久综合88| 国产精品影视网| 亚洲免费成人av| 欧美日韩成人一区二区| 蜜臀av一级做a爰片久久| 日韩无一区二区| 国内精品免费**视频| 欧美激情综合五月色丁香小说| 97国产精品videossex| 亚洲永久精品国产| 日韩精品一区二区在线| 国产91综合一区在线观看| 亚洲人成7777| 在线播放中文字幕一区| 丁香另类激情小说| 艳妇臀荡乳欲伦亚洲一区| 91精品国产欧美一区二区| 国产精品综合一区二区| 一区二区成人在线| 日韩欧美电影一区| 不卡一二三区首页| 亚洲福利视频三区| 久久综合给合久久狠狠狠97色69| 91视频一区二区三区| 日韩福利电影在线| 《视频一区视频二区| 91精品欧美综合在线观看最新 | 国产成人午夜精品影院观看视频| 日本一区二区综合亚洲| 欧美日本视频在线| 国产高清精品网站| 亚洲一区二区三区四区在线观看 | 日本精品视频一区二区三区| 日韩国产欧美在线播放| 日本一二三不卡| 3d动漫精品啪啪1区2区免费| 欧美视频一二三区| 国产精品91xxx| 婷婷国产在线综合| 国产精品国产三级国产普通话蜜臀 | 久久精品人人做人人爽97| 91精品91久久久中77777| 国产美女精品在线| 日本在线不卡视频| 亚洲色图清纯唯美| 日本一区二区三区在线不卡| 日韩欧美一区二区视频| av不卡在线播放| 久久草av在线| 蜜桃av一区二区| 亚洲午夜一二三区视频| 亚洲图片激情小说| 日本一区二区免费在线观看视频 | 亚洲资源在线观看| 国产精品久久久久久福利一牛影视| 精品国产乱码久久| 欧美老女人在线| 色婷婷久久一区二区三区麻豆| 国产一区二区三区蝌蚪| 精品一区二区在线视频| 日韩激情视频网站| 亚洲成人免费电影| 亚洲一区二区精品视频| 亚洲美女视频一区| 国产精品成人网| 国产精品美女一区二区在线观看| 久久久久亚洲蜜桃| 亚洲精品在线免费观看视频| 欧美一区二区成人| 欧美久久久久久久久久| 欧美精品日韩一本| 欧美精品在线观看一区二区| 在线观看视频一区二区| 欧美午夜精品久久久| 91麻豆成人久久精品二区三区| 成人高清免费观看| 91网站黄www| 91浏览器入口在线观看| 在线亚洲欧美专区二区| 欧美性欧美巨大黑白大战| 欧美精品xxxxbbbb| 88在线观看91蜜桃国自产| 日韩精品一区二| 国产日本亚洲高清| 国产精品高潮呻吟| 一区二区免费视频| 午夜av区久久| 精品一区二区三区在线观看国产| 激情图区综合网| www.亚洲色图.com| 欧美视频在线观看一区| 3d动漫精品啪啪一区二区竹菊 | 亚洲视频免费观看| 夜夜精品视频一区二区| 另类调教123区| 国产精品中文字幕日韩精品| 波波电影院一区二区三区| 色美美综合视频| 6080午夜不卡| 久久久精品免费网站| 亚洲一区二区五区| 精品影院一区二区久久久| 暴力调教一区二区三区| 欧美一区二区三区四区五区| 国产午夜精品久久| 亚洲高清在线视频| 精品一区二区三区的国产在线播放| 成人午夜电影小说| 欧美精品亚洲一区二区在线播放| 2021中文字幕一区亚洲| 亚洲精品国产无天堂网2021 | 精品国产污网站| 国产精品久久久久久福利一牛影视 | 欧美日韩不卡在线| 国产视频一区在线观看| 亚洲一区二区三区爽爽爽爽爽 | 一区二区三区四区乱视频| 免费观看成人av| 色哟哟亚洲精品| 久久久久久影视| 午夜不卡av在线| 91丨九色丨蝌蚪富婆spa| 日韩区在线观看| 一区二区三区视频在线看| 激情综合网av| 欧美日韩aaa| 亚洲欧美日韩精品久久久久| 精品一区二区三区不卡| 欧美肥妇bbw| 亚洲午夜国产一区99re久久| 国产成人av一区二区三区在线 | 日本道免费精品一区二区三区| 欧美不卡激情三级在线观看| 一区二区三区欧美视频| av影院午夜一区| 久久免费午夜影院| 韩国三级在线一区| 日韩免费高清电影| 亚洲成人动漫一区| 色综合婷婷久久| 日本一区二区成人| 高清不卡一二三区| 久久这里只精品最新地址| 青青草91视频| 91精品欧美综合在线观看最新| 亚洲综合在线观看视频| 91小视频在线观看| 综合久久一区二区三区| www.成人网.com| 国产精品视频麻豆| 高清日韩电视剧大全免费| 久久久久久久久久久电影| 狠狠色狠狠色综合日日91app| 日韩精品最新网址| 久久99精品久久久久久动态图| 91精品一区二区三区在线观看|