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

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

?? beeper.cpp

?? 英文版的 想要的話可以下載了 為大家服務
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/*
 * BEEPER.CPP
 * Beeper Automation Object #3 Chapter 14
 *
 * Implementation of the CBeeper class demonstrating the use of
 * standard error handling that ties in with ITypeInfo::Invoke
 * (as well as DispInvoke).  This includes an implementation of
 * ISupportErrorInfo.
 *
 * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
 *
 * Kraig Brockschmidt, Microsoft
 * Internet  :  kraigb@microsoft.com
 * Compuserve:  >INTERNET:kraigb@microsoft.com
 */


#include "beeper.h"

extern HINSTANCE g_hInst;

#ifdef WIN32
extern DWORD     g_dwTLS;
#else
LANGID           g_langID;
#endif


/*
 * 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_pImpIDispatch=NULL;
    return;
    }


CBeeper::~CBeeper(void)
    {
    DeleteInterfaceImp(m_pImpIDispatch);
    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;

    if (NULL!=m_pUnkOuter)
        pIUnknown=m_pUnkOuter;

    m_pImpIDispatch=new CImpIDispatch(this, pIUnknown);

    if (NULL==m_pImpIDispatch)
        return FALSE;

    return TRUE;
    }




/*
 * CBeeper::QueryInterface
 * CBeeper::AddRef
 * CBeeper::Release
 */

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.
     *
     * Note that IBeeper is implemented on CBeeper, and we must
     * also expose that custom interface through QueryInterface.
     */
    if (IID_IUnknown==riid || IID_IBeeper==riid)
        *ppv=this;

    /*
     * QueryInterface must respond not only to IID_IDispatch for
     * the primary automation interface, but also to the IID of the
     * dispinterface itself, which in our case is DIID_DIBeeper.
     */
    if (IID_IDispatch==riid || DIID_DIBeeper==riid)
        *ppv=m_pImpIDispatch;

    //Indicate that we support error information
    if (IID_ISupportErrorInfo==riid)
        *ppv=m_pImpISuppErr;

    //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;

    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
 *
 * Out Parameters: (Get only):
 *  plSound         long *, the current sound.
 */

STDMETHODIMP CBeeper::get_Sound(long *plSound)
    {
    if (NULL==plSound)
        return ResultFromScode(E_POINTER);

    *plSound=m_lSound;
    return NOERROR;
    }


STDMETHODIMP CBeeper::put_Sound(long lSound)
    {
    if (MB_OK!=lSound && MB_ICONEXCLAMATION!=lSound
        && MB_ICONQUESTION!=lSound && MB_ICONHAND!=lSound
        && MB_ICONASTERISK!=lSound)
        {
        /*
         * If we return an HRESULT type from this method,
         * then ITypeInfo::Invoke will retrieve an error
         * object for us.
         */
        m_pImpIDispatch->Exception(EXCEPTION_INVALIDSOUND);
        return ResultFromScode(DISP_E_EXCEPTION);
        }

    m_lSound=lSound;
    return NOERROR;
    }


/*
 * CBeeper::Beep
 *
 * Purpose:
 *  Function called from DispInvoke to invoke the Beep method.
 *
 * Out Parameter:
 *  plSoundPlayed   long *, the sound played.
 */

STDMETHODIMP CBeeper::Beep(long *plSoundPlayed)
    {
    if (NULL==plSoundPlayed)
        return ResultFromScode(E_POINTER);

    *plSoundPlayed=m_lSound;
    MessageBeep((UINT)m_lSound);
    return NOERROR;
    }






//IDispatch interface implementation

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

CImpIDispatch::CImpIDispatch(PCBeeper pObj, LPUNKNOWN pUnkOuter)
    {
    m_cRef=0;
    m_pObj=pObj;
    m_pUnkOuter=pUnkOuter;

    //These are created as needed in GetTypeInfo
    m_pITINeutral=NULL;
    m_pITIGerman=NULL;
    return;
    }

CImpIDispatch::~CImpIDispatch(void)
    {
    ReleaseInterface(m_pITIGerman);
    ReleaseInterface(m_pITINeutral);
    return;
    }



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

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


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

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



/*
 * CImpIDispatch::GetTypeInfoCount
 *
 * Purpose:
 *  Returns the number of type information (ITypeInfo) interfaces
 *  that the object provides (0 or 1).
 *
 * Parameters:
 *  pctInfo         UINT * to the location to receive
 *                  the count of interfaces.
 *
 * Return Value:
 *  HRESULT         NOERROR or a general error code.
 */

STDMETHODIMP CImpIDispatch::GetTypeInfoCount(UINT *pctInfo)
    {
    //We implement GetTypeInfo so return 1
    *pctInfo=1;
    return NOERROR;
    }




/*
 * CImpIDispatch::GetTypeInfo
 *
 * Purpose:
 *  Retrieves type information for the automation interface.  This
 *  is used anywhere that the right ITypeInfo interface is needed
 *  for whatever LCID is applicable.  Specifically, this is used
 *  from within GetIDsOfNames and Invoke.
 *
 * Parameters:
 *  itInfo          UINT reserved.  Must be zero.
 *  lcid            LCID providing the locale for the type
 *                  information.  If the object does not support
 *                  localization, this is ignored.
 *  ppITypeInfo     ITypeInfo ** in which to store the ITypeInfo
 *                  interface for the object.
 *
 * Return Value:
 *  HRESULT         NOERROR or a general error code.
 */

STDMETHODIMP CImpIDispatch::GetTypeInfo(UINT itInfo, LCID lcid
    , ITypeInfo **ppITypeInfo)
    {
    HRESULT     hr;
    ITypeLib   *pITypeLib;
    ITypeInfo **ppITI=NULL;

    if (0!=itInfo)
        return ResultFromScode(TYPE_E_ELEMENTNOTFOUND);

    if (NULL==ppITypeInfo)
        return ResultFromScode(E_POINTER);

    *ppITypeInfo=NULL;

    /*
     * Since we returned one from GetTypeInfoCount, this function
     * can be called for a specific locale.  We support English,
     * German, and neutral (defaults to English) locales.  Anything
     * else is an error.
     *
     * After this switch statement, ppITI will either be NULL or
     * a valid pointer in it after.  If NULL, we know we need to
     * load type information, retrieve the ITypeInfo we want, and
     * then store it in *ppITI.
     */
    switch (PRIMARYLANGID(lcid))
        {
        case LANG_NEUTRAL:
        case LANG_ENGLISH:
            ppITI=&m_pITINeutral;
            break;

        case LANG_GERMAN:
            ppITI=&m_pITIGerman;
            break;

        default:
            return ResultFromScode(DISP_E_UNKNOWNLCID);
        }

    //Load a type lib if we don't have the information already.
    if (NULL==*ppITI)
        {
        /*
         * The type libraries are registered under 0 (neutral),
         * 7 (German), and 9 (English) with no specific sub-
         * language, which would make them 407 or 409 and such.
         * If you are sensitive to sub-languages, then use the
         * full LCID instead of just the LANGID as done here.
         */
        hr=LoadRegTypeLib(LIBID_BeeperTypeLibrary, 1, 0
            , PRIMARYLANGID(lcid), &pITypeLib);

        /*
         * If LoadRegTypeLib fails, try loading directly with

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品亚洲免费视频| 在线观看亚洲a| 国产片一区二区| 成人精品小蝌蚪| 尤物av一区二区| 欧美日韩国产一区二区三区地区| 午夜欧美视频在线观看| 日韩欧美卡一卡二| 国产超碰在线一区| 亚洲少妇最新在线视频| 欧美日韩一区三区| 国产一区二区三区四区五区入口| 国产精品女人毛片| 欧美中文字幕一区二区三区亚洲| 天堂在线一区二区| 国产亚洲精品超碰| 欧美综合一区二区三区| 激情深爱一区二区| 亚洲欧洲日产国码二区| 欧美精品久久一区二区三区| 激情另类小说区图片区视频区| 国产精品女同一区二区三区| 欧美日韩久久一区二区| 国产精品亚洲一区二区三区在线| 亚洲欧美二区三区| 欧美精品一区二区三| 99久久精品免费精品国产| 五月激情丁香一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲| 色综合天天综合在线视频| 日本在线不卡视频一二三区| 国产精品区一区二区三| 欧美久久久久久蜜桃| 国产91丝袜在线观看| 免费的成人av| 亚洲靠逼com| 欧美精品一区二区三区视频| 欧美日韩一区不卡| 成人性视频免费网站| 日本在线播放一区二区三区| 最新高清无码专区| 久久美女艺术照精彩视频福利播放| 一本久久精品一区二区| 国产麻豆9l精品三级站| 偷拍与自拍一区| 亚洲欧美日韩在线不卡| 久久午夜免费电影| 91精品国产色综合久久ai换脸 | 久久er99热精品一区二区| 亚洲精品国产a| 中文字幕av资源一区| 欧美va亚洲va香蕉在线| 欧美日韩亚洲另类| 91官网在线免费观看| 国产成人综合亚洲网站| 狠狠色丁香婷婷综合久久片| 午夜影院久久久| 一区二区三区鲁丝不卡| 国产精品电影一区二区三区| 精品国产凹凸成av人导航| 91精品国产日韩91久久久久久| 欧美午夜精品久久久久久超碰| jvid福利写真一区二区三区| 成人午夜看片网址| 国产精品羞羞答答xxdd | 国产成人高清视频| 韩国精品一区二区| 激情久久久久久久久久久久久久久久| 国产宾馆实践打屁股91| 国内精品在线播放| 精品一区二区三区日韩| 九色porny丨国产精品| 免费观看成人鲁鲁鲁鲁鲁视频| 日韩激情视频网站| 毛片av中文字幕一区二区| 天堂va蜜桃一区二区三区 | 国产一区视频网站| 国产精品12区| 成人免费视频网站在线观看| 成人国产免费视频| 99精品一区二区| 色就色 综合激情| 欧美日高清视频| 欧美一三区三区四区免费在线看| 日韩视频免费观看高清完整版在线观看 | 精品少妇一区二区三区| 精品美女在线播放| 久久久久久一二三区| 中文字幕av免费专区久久| 欧美国产综合色视频| 亚洲人成网站精品片在线观看| 亚洲精品少妇30p| 亚洲国产日产av| 另类的小说在线视频另类成人小视频在线| 免费成人av资源网| 粉嫩aⅴ一区二区三区四区| 99久久精品国产观看| 91久久精品一区二区| 欧美情侣在线播放| 欧美大片国产精品| 国产精品福利av| 亚洲6080在线| 国产剧情一区二区三区| 91麻豆精品在线观看| 在线电影欧美成精品| 国产精品对白交换视频 | 美女www一区二区| 成人丝袜高跟foot| 欧美日韩国产高清一区| 久久先锋影音av鲁色资源网| 一区二区在线观看不卡| 美女一区二区三区在线观看| 成人激情免费视频| 欧美精品乱人伦久久久久久| 国产欧美1区2区3区| 日韩中文字幕亚洲一区二区va在线 | 爽爽淫人综合网网站| 国产原创一区二区| 欧美日韩综合不卡| 国产午夜精品一区二区| 午夜av区久久| 99这里都是精品| 精品奇米国产一区二区三区| 亚洲六月丁香色婷婷综合久久 | 91免费观看国产| 精品国产一二三| 一区二区三区在线观看国产| 国内久久精品视频| 911精品国产一区二区在线| 国产精品二区一区二区aⅴ污介绍| 蜜桃视频一区二区三区| 色综合久久天天| 国产精品色一区二区三区| 极品少妇xxxx偷拍精品少妇| 在线观看欧美精品| 国产精品免费观看视频| 精品一区二区av| 777a∨成人精品桃花网| 一区二区三区蜜桃| 99精品欧美一区二区蜜桃免费| 久久这里只精品最新地址| 天涯成人国产亚洲精品一区av| 9久草视频在线视频精品| 国产亚洲综合在线| 捆绑调教一区二区三区| 欧美日韩免费观看一区二区三区| 国产精品国产a级| 成人动漫在线一区| 久久久国产午夜精品| 精品亚洲porn| 日韩精品一区二区在线| 性做久久久久久免费观看| 色噜噜狠狠成人中文综合| 青青草视频一区| 欧美三级电影网站| 亚洲综合无码一区二区| 99国产欧美久久久精品| 亚洲国产高清aⅴ视频| 国产盗摄女厕一区二区三区| 精品国产sm最大网站| 精品一区二区在线观看| 精品日韩欧美在线| 免费看欧美女人艹b| 欧美精选一区二区| 日韩在线卡一卡二| 日韩一区二区在线观看| 美女网站在线免费欧美精品| 欧美一区二区福利在线| 精品影视av免费| 久久久精品国产99久久精品芒果| 国产高清不卡一区| 欧美极品aⅴ影院| 99热精品一区二区| 一区二区久久久| 91国偷自产一区二区使用方法| 欧美一区二区在线不卡| 免费精品视频在线| 欧美电影免费观看高清完整版在线 | 日韩精品专区在线影院重磅| 免费欧美在线视频| 久久午夜电影网| 波多野结衣亚洲| 亚洲精品中文在线| 欧美午夜不卡在线观看免费| 午夜精彩视频在线观看不卡| 欧美一区二区三区不卡| 国内精品伊人久久久久av影院 | 91久久精品日日躁夜夜躁欧美| 亚洲精品日产精品乱码不卡| 欧美性生交片4| 天堂在线亚洲视频| 久久你懂得1024| 91麻豆精品在线观看| 日韩电影在线免费观看| 久久久不卡影院| 色噜噜狠狠色综合中国| 久久激情综合网| 国产精品久久久久影院亚瑟| 欧美亚洲禁片免费| 精品系列免费在线观看|