亚洲欧美第一页_禁久久精品乱码_粉嫩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
 *
 * Return Value: (Get only):
 *  long            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)
        {
        /*
         * Since we cannot return a value to ITypeInfo::Invoke to
         * indicate an exception condition, we'll use
         * m_pImpIDispatch->Exception to raise them.  This
         * Exception function now uses the error info mechanism
         * to raise exceptions rather than relying on our own
         * single-threaded model as used in Beeper #2.
         */
        m_pImpIDispatch->Exception(EXCEPTION_INVALIDSOUND);
        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;
    }





//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
         * LoadTypeLib, which will register the library for us.
         * Note that there's no default case here because the
         * prior switch will have filtered lcid already.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美日韩国产综合在线| 色素色在线综合| 国产风韵犹存在线视精品| 99re这里只有精品视频首页| 6080亚洲精品一区二区| 国产香蕉久久精品综合网| 亚洲成人手机在线| 成人午夜视频在线观看| 91麻豆精品国产| 亚洲免费看黄网站| 国产激情一区二区三区| 3751色影院一区二区三区| 国产精品不卡视频| 国产福利一区二区三区在线视频| 欧美无人高清视频在线观看| 国产精品女人毛片| 激情国产一区二区| 在线不卡免费欧美| 亚洲成人免费观看| 色美美综合视频| 国产精品福利一区二区三区| 国产精品一区二区在线观看不卡| 欧美色图激情小说| 亚洲黄一区二区三区| 成人av在线一区二区| 久久女同性恋中文字幕| 美女网站色91| 日韩免费成人网| 美腿丝袜亚洲色图| 精品久久免费看| 美腿丝袜亚洲三区| 精品久久久久久久久久久院品网| 蜜桃91丨九色丨蝌蚪91桃色| 欧美日韩精品欧美日韩精品一| 亚洲视频免费在线| 在线视频国内一区二区| 亚洲综合丁香婷婷六月香| 在线免费不卡电影| 亚洲国产精品一区二区久久 | 成人欧美一区二区三区| 国产激情精品久久久第一区二区| 久久综合国产精品| 国产电影一区在线| 最新国产の精品合集bt伙计| 色综合天天狠狠| 一区二区三区**美女毛片| 欧美在线999| 午夜在线电影亚洲一区| 欧美日韩成人在线| 美国一区二区三区在线播放| 精品乱人伦一区二区三区| 国产综合色视频| 一区在线播放视频| 色就色 综合激情| 日产欧产美韩系列久久99| 欧美tk丨vk视频| 国产v综合v亚洲欧| 一区二区三区小说| 日韩一卡二卡三卡四卡| 激情成人午夜视频| 成人欧美一区二区三区在线播放| 91久久精品网| 麻豆成人在线观看| 国产精品视频免费| 欧美日韩免费不卡视频一区二区三区| 午夜精品久久久久久久久久| 欧美成人vr18sexvr| 国产91丝袜在线观看| 一区二区三区色| 欧美电影精品一区二区| 91麻豆免费视频| 青青草伊人久久| 国产精品久久久久久久岛一牛影视| 色婷婷综合久色| 国内成人免费视频| 一区二区三区日韩欧美| 26uuuu精品一区二区| 色综合久久久久网| 韩国欧美国产1区| 亚洲国产成人tv| 国产精品久久夜| 欧美一级二级三级乱码| 91伊人久久大香线蕉| 成人在线综合网站| 免费高清不卡av| 亚洲人被黑人高潮完整版| 欧美videofree性高清杂交| 99久久久无码国产精品| 久久99精品国产麻豆婷婷| 亚洲精品写真福利| 久久久久国产精品免费免费搜索 | 懂色av一区二区在线播放| 亚洲成人免费电影| 亚洲精品国产品国语在线app| 欧美精品一区二区三区一线天视频| 在线观看区一区二| 97se亚洲国产综合自在线不卡| 麻豆免费精品视频| 日日欢夜夜爽一区| 亚洲18影院在线观看| 中文字幕制服丝袜成人av| 久久久久久久综合| 日韩精品一区二区三区中文不卡| 在线观看av一区二区| zzijzzij亚洲日本少妇熟睡| 国产一区二区三区在线看麻豆| 午夜精品成人在线| 亚洲一区免费观看| 亚洲人成在线观看一区二区| 国产欧美在线观看一区| 精品剧情v国产在线观看在线| 欧美一三区三区四区免费在线看 | 成人综合在线视频| 国产精品888| 国产乱人伦偷精品视频免下载 | 成人永久aaa| 国产精品一区二区久久不卡| 免费观看日韩av| 麻豆精品在线看| 国内精品自线一区二区三区视频| 欧美a级理论片| 美女视频黄 久久| 紧缚捆绑精品一区二区| 免费高清不卡av| 狠狠色丁香九九婷婷综合五月| 蜜臀av一区二区| 国产麻豆一精品一av一免费| 国产一区视频网站| 国产传媒一区在线| 欧美色成人综合| 5858s免费视频成人| 日韩一级完整毛片| 久久久综合网站| 国产日韩欧美高清在线| 国产精品护士白丝一区av| 日韩一区在线看| 视频一区中文字幕| 狠狠v欧美v日韩v亚洲ⅴ| 国产99久久久国产精品潘金| 成人一区二区三区中文字幕| 99久久99久久精品国产片果冻| 色哟哟一区二区| 欧美不卡在线视频| 国产精品理论片在线观看| 亚洲欧美欧美一区二区三区| 亚洲一线二线三线视频| 美洲天堂一区二卡三卡四卡视频| 国产一区二区三区四区五区入口| 成人在线视频首页| 欧美老肥妇做.爰bbww视频| 精品日韩一区二区| 综合激情成人伊人| 蜜臀99久久精品久久久久久软件| 国产成人午夜视频| 欧洲一区二区三区免费视频| 日韩欧美一二三区| 日韩理论片一区二区| 日韩国产高清影视| 91玉足脚交白嫩脚丫在线播放| 欧美一级一级性生活免费录像| 国产欧美日韩在线视频| 丝瓜av网站精品一区二区| 成人性生交大片| 精品日韩成人av| 亚洲成人免费在线| 97精品国产露脸对白| 精品成人a区在线观看| 亚洲综合免费观看高清完整版在线| 精久久久久久久久久久| 在线观看不卡视频| 亚洲日韩欧美一区二区在线| 久99久精品视频免费观看| 欧洲人成人精品| 国产精品素人一区二区| 男男gaygay亚洲| 欧美综合色免费| 国产传媒一区在线| 在线不卡一区二区| 无吗不卡中文字幕| 日韩精品综合一本久道在线视频| 亚洲品质自拍视频网站| 国产精品一区在线观看乱码| 亚洲在线视频一区| 亚洲成a天堂v人片| 国产毛片一区二区| 国产一本一道久久香蕉| 亚洲日本一区二区| 成人国产精品视频| 亚洲欧洲日产国码二区| 色中色一区二区| 亚洲www啪成人一区二区麻豆| 色综合视频在线观看| 天天影视色香欲综合网老头| 欧美在线视频你懂得| 一区二区在线观看不卡| 777午夜精品视频在线播放| 日韩精品福利网| 国产精品美女视频| 在线中文字幕一区二区| 日本免费在线视频不卡一不卡二|