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

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

?? spddkhlp.h

?? TTS語音開發示例
?? H
?? 第 1 頁 / 共 2 頁
字號:
/*******************************************************************************
* SPDDKHLP.h *
*------------*
*   Description:
*       This is the header file for core helper functions implementation.
*
*   Copyright (c) Microsoft Corporation. All rights reserved.
*
*******************************************************************************/
#ifndef SPDDKHLP_h
#define SPDDKHLP_h

#ifndef SPHelper_h
#include <sphelper.h>
#endif

#include <sapiddk.h>

#ifndef SPError_h
#include <SPError.h>
#endif

#ifndef SPDebug_h
#include <SPDebug.h>
#endif

#ifndef _INC_LIMITS
#include <limits.h>
#endif

#ifndef _INC_CRTDBG
#include <crtdbg.h>
#endif

#ifndef _INC_MALLOC
#include <malloc.h>
#endif

#ifndef _INC_MMSYSTEM
#include <mmsystem.h>
#endif

#ifndef __comcat_h__
#include <comcat.h>
#endif

//=== Constants ==============================================================
#define sp_countof(x) ((sizeof(x) / sizeof(*(x))))

#define SP_IS_BAD_WRITE_PTR(p)     ( SPIsBadWritePtr( p, sizeof(*(p)) ))
#define SP_IS_BAD_READ_PTR(p)      ( SPIsBadReadPtr(  p, sizeof(*(p)) ))
#define SP_IS_BAD_CODE_PTR(p)      ( ::IsBadCodePtr((FARPROC)(p) )
#define SP_IS_BAD_INTERFACE_PTR(p) ( SPIsBadInterfacePtr( (p) )  )
#define SP_IS_BAD_VARIANT_PTR(p)   ( SPIsBadVARIANTPtr( (p) ) )
#define SP_IS_BAD_STRING_PTR(p)    ( SPIsBadStringPtr( (p) ) )

#define SP_IS_BAD_OPTIONAL_WRITE_PTR(p)     ((p) && SPIsBadWritePtr( p, sizeof(*(p)) ))
#define SP_IS_BAD_OPTIONAL_READ_PTR(p)      ((p) && SPIsBadReadPtr(  p, sizeof(*(p)) ))
#define SP_IS_BAD_OPTIONAL_INTERFACE_PTR(p) ((p) && SPIsBadInterfacePtr(p))
#define SP_IS_BAD_OPTIONAL_STRING_PTR(p)    ((p) && SPIsBadStringPtr(p))

//=== Class, Enum, Struct, Template, and Union Declarations ==================

//=== Inlines ================================================================

/*** Pointer validation functions
*/

// TODO:  Add decent debug output for bad parameters

inline BOOL SPIsBadStringPtr( const WCHAR * psz, ULONG cMaxChars = 0xFFFF )
{
    BOOL IsBad = false;
    __try
    {
        do
        {
            if( *psz++ == 0 ) return IsBad;
        }
        while( --cMaxChars );
    }
    __except( GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION )
    {
        IsBad = true;
    }

    return IsBad;
}

inline BOOL SPIsBadReadPtr( const void* pMem, UINT Size )
{
#ifdef _DEBUG
    BOOL bIsBad = ::IsBadReadPtr( pMem, Size );
    SPDBG_ASSERT(!bIsBad);
    return bIsBad;
#else
    return ::IsBadReadPtr( pMem, Size );
#endif
}

inline BOOL SPIsBadWritePtr( void* pMem, UINT Size )
{
#ifdef _DEBUG
    BOOL bIsBad = ::IsBadWritePtr( pMem, Size );
    SPDBG_ASSERT(!bIsBad);
    return bIsBad;
#else
    return ::IsBadWritePtr( pMem, Size );
#endif
}

inline BOOL SPIsBadInterfacePtr( const IUnknown* pUnknown )
{
#ifdef _DEBUG
    BOOL bIsBad = ( ::IsBadReadPtr( pUnknown, sizeof( *pUnknown ) ) ||
                    ::IsBadCodePtr( (FARPROC)((void**)pUnknown)[0] ))?
                   (true):(false);
    SPDBG_ASSERT(!bIsBad);
    return bIsBad;
#else
    return ( ::IsBadReadPtr( pUnknown, sizeof( *pUnknown ) ) ||
             ::IsBadCodePtr( (FARPROC)((void**)pUnknown)[0] ))?
            (true):(false);
#endif
}

inline BOOL SPIsBadVARIANTPtr( const VARIANT* pVar )
{
#ifdef _DEBUG
    BOOL bIsBad = ::IsBadReadPtr( pVar, sizeof( *pVar ) );
    SPDBG_ASSERT(!bIsBad);
    return bIsBad;
#else
    return ::IsBadReadPtr( pVar, sizeof( *pVar ) );
#endif
}

#ifdef __ATLCOM_H__     //--- Only enable these if ATL is being used

//
//  Helper functions can be used to implement GetObjectToken/SetObjectToken for objects that 
//  support ISpObjectWithToken
//
inline HRESULT SpGenericSetObjectToken(ISpObjectToken * pCallersToken, CComPtr<ISpObjectToken> & cpObjToken)
{
    HRESULT hr = S_OK;
    if (SP_IS_BAD_INTERFACE_PTR(pCallersToken))
    {
        hr = E_INVALIDARG;
    }
    else
    {
        if (cpObjToken)
        {
            hr = SPERR_ALREADY_INITIALIZED;
        }
        else
        {
            cpObjToken = pCallersToken;
        }
    }
    return hr;
}


inline HRESULT SpGenericGetObjectToken(ISpObjectToken ** ppCallersToken, CComPtr<ISpObjectToken> & cpObjToken)
{
    HRESULT hr = S_OK;
    if (SP_IS_BAD_WRITE_PTR(ppCallersToken))
    {
        hr = E_POINTER;
    }
    else
    {
        *ppCallersToken = cpObjToken;
        if (*ppCallersToken)
        {
            (*ppCallersToken)->AddRef();
        }
        else
        {
            hr = S_FALSE;
        }
    }
    return hr;
}

#endif  // __ATLCOM_H__


//
//  Helper class for SPSTATEINFO sturcture automatically initializes and cleans up
//  the structure + provides a few helper functions.
//
class CSpStateInfo : public SPSTATEINFO
{
public:
    CSpStateInfo()
    {
        cAllocatedEntries = NULL;
        pTransitions = NULL;
    }
    ~CSpStateInfo()
    {
        ::CoTaskMemFree(pTransitions);
    }
    SPTRANSITIONENTRY * FirstEpsilon()
    {
        return pTransitions;
    }
    SPTRANSITIONENTRY * FirstRule()
    {
        return pTransitions + cEpsilons;
    }
    SPTRANSITIONENTRY * FirstWord()
    {
        return pTransitions + cEpsilons + cRules;
    }
    SPTRANSITIONENTRY * FirstSpecialTransition()
    {
        return pTransitions + cEpsilons + cRules + cWords;
    }
};


//
//  This basic queue implementation can be used to maintin linked lists of classes.  The class T
//  must contain the member m_pNext which is used by this template to point to the next element.
//  If the bPurgeWhenDeleted is TRUE then all of the elements in the queue will be deleted
//  when the queue is deleted, otherwise they will not.
//  If bMaintainCount is TRUE then a running count will be maintained, and GetCount() will be
//  efficent.  If it is FALSE then a running count will not be maintained, and GetCount() will
//  be an order N operation.  If you do not require a count, then 
//

template <class T, BOOL bPurgeWhenDeleted> class CSpBasicList;

template <class T, BOOL bPurgeWhenDeleted = TRUE, BOOL bMaintainCount = FALSE>
class CSpBasicQueue
{
public:
    T     * m_pHead;
    T     * m_pTail;
    ULONG   m_cElements;    // Warning!  Use GetCount() -- Not maintained if bMaintainCount is FALSE.

    CSpBasicQueue() 
    {
        m_pHead = NULL;
        if (bMaintainCount)
        {
            m_cElements = 0;
        }
    }

    ~CSpBasicQueue()
    {
        if (bPurgeWhenDeleted)
        {
            Purge();
        }
    }

    HRESULT CreateNode(T ** ppNode)
    {
        *ppNode = new T;
        if (*ppNode)
        {
            return S_OK;
        }
        else
        {
            return E_OUTOFMEMORY;
        }
    }

    T * GetNext(const T * pNode)
    {
        return pNode->m_pNext;
    }


    T * Item(ULONG i)
    {
        T * pNode = m_pHead;
        while (pNode && i)
        {
            i--;
            pNode = pNode->m_pNext;
        }
        return pNode;
    }

    void InsertAfter(T * pPrev, T * pNewNode)
    {
        if (pPrev)
        {
            pNewNode->m_pNext = pPrev->m_pNext;
            pPrev->m_pNext = pNewNode;
            if (pNewNode->m_pNext == NULL)
            {
                m_pTail = pNewNode;
            }
            if (bMaintainCount) ++m_cElements;
        }
        else
        {
            InsertHead(pNewNode);
        }
    }

    void InsertTail(T * pNode)
    {
        pNode->m_pNext = NULL;
        if (m_pHead)
        {
            m_pTail->m_pNext = pNode;
        }
        else
        {
            m_pHead = pNode;
        }
        m_pTail = pNode;
        if (bMaintainCount) ++m_cElements;
    }

    void InsertHead(T * pNode)
    {
        pNode->m_pNext = m_pHead;
        if (m_pHead == NULL)
        {
            m_pTail = pNode;
        }
        m_pHead = pNode;
        if (bMaintainCount) ++m_cElements;
    }

    T * RemoveHead()
    {
        T * pNode = m_pHead;
        if (pNode)
        {
            m_pHead = pNode->m_pNext;
            if (bMaintainCount) --m_cElements;
        }
        return pNode;
    }

    T * RemoveTail()
    {
        T * pNode = m_pHead;
        if (pNode)
        {
            if (pNode == m_pTail)
            {
                m_pHead = NULL;
            }
            else
            {
                T * pPrev;
                do
                {
                    pPrev = pNode;
                    pNode = pNode->m_pNext;
                } while ( pNode != m_pTail );
                pPrev->m_pNext = NULL;
                m_pTail = pPrev;
            }
            if (bMaintainCount) --m_cElements;
        }
        return pNode;
    }

    void Purge()
    {
        while (m_pHead)
        {
            T * pDie = m_pHead;
            m_pHead = pDie->m_pNext;
            delete pDie;
        }
        if (bMaintainCount) m_cElements = 0;
    }

    void ExplicitPurge()
    {
        T * pDie;
        BYTE * pb;

        while (m_pHead)
        {
            pDie = m_pHead;
            m_pHead = pDie->m_pNext;

            pDie->~T();

            pb = reinterpret_cast<BYTE *>(pDie);
            delete [] pb;
        }
        if (bMaintainCount) m_cElements = 0;
    }


    T * GetTail() const
    {
        if (m_pHead)
        {
            return m_pTail;
        }
        return NULL;
    }

    T * GetHead() const
    {
        return m_pHead;
    }

    BOOL IsEmpty() const
    {
        return m_pHead == NULL; 
    }

    BOOL Remove(T * pNode)
    {
        if (m_pHead == pNode)
        {
            m_pHead = pNode->m_pNext;
            if (bMaintainCount) --m_cElements;
            return TRUE;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩一区二区三区不卡| 激情综合网天天干| 中文字幕一区二区三区在线播放 | 99精品视频一区二区| 91久久免费观看| 精品国产一区二区三区四区四| 中文字幕中文字幕一区二区 | 国产成人av资源| 在线观看一区不卡| 久久精品这里都是精品| 午夜精品久久久久久久久| 国产成人综合自拍| 91精品国产综合久久精品app| 久久免费精品国产久精品久久久久| 国产精品久久久久久久裸模| 日本vs亚洲vs韩国一区三区二区| 成人av动漫在线| 精品久久久久久久久久久久包黑料 | 欧美一卡在线观看| 日韩理论片中文av| 国产麻豆成人精品| 欧美丰满嫩嫩电影| 一二三四区精品视频| 麻豆视频一区二区| 在线国产电影不卡| 国产精品久久久久久久久快鸭| 九九九久久久精品| 在线免费亚洲电影| 国产精品麻豆网站| 成人美女视频在线看| 国产午夜久久久久| 亚洲va欧美va人人爽午夜| 成人影视亚洲图片在线| 日韩欧美另类在线| 日韩电影在线观看一区| 欧美在线啊v一区| 亚洲欧美日韩小说| 99免费精品视频| 亚洲国产精品99久久久久久久久| 美女网站色91| 日韩欧美国产麻豆| 九九热在线视频观看这里只有精品| 555www色欧美视频| 日本成人中文字幕| 制服丝袜亚洲网站| 亚洲自拍偷拍图区| 精品视频在线免费看| 一区二区三区精品| 色诱视频网站一区| 亚洲国产成人va在线观看天堂| 日本黄色一区二区| 亚洲电影一区二区三区| 在线免费观看视频一区| 亚洲图片欧美视频| 日韩色视频在线观看| 激情国产一区二区| 国产亚洲精品7777| 国产一区二区精品久久| 国产精品丝袜一区| 一本久久综合亚洲鲁鲁五月天| 亚洲视频资源在线| 欧美日韩三级视频| 亚洲午夜一区二区| 制服丝袜国产精品| 国产在线观看一区二区| 久久精品视频免费观看| 99久久久久久| 午夜一区二区三区在线观看| 欧美日韩中文字幕一区二区| 青椒成人免费视频| 久久久影视传媒| 91蝌蚪porny成人天涯| 一区二区在线免费| 欧美精品在线一区二区三区| 狠狠色伊人亚洲综合成人| 中文字幕第一页久久| 色域天天综合网| 一区av在线播放| 2023国产精品自拍| 国产精品一区二区三区乱码| 亚洲欧美另类久久久精品| 欧美二区三区91| 国产激情精品久久久第一区二区 | 国产情人综合久久777777| 94-欧美-setu| 免费成人在线观看视频| 中文字幕一区二区三区在线不卡 | 日韩精品一区第一页| 久久精品一区八戒影视| 欧美日韩国产小视频| 国产成人自拍网| 午夜精品久久久久久不卡8050| 欧美激情中文不卡| 欧美在线高清视频| 国产精品一线二线三线精华| 亚洲一区二区欧美日韩| 国产精品无人区| 精品国产污污免费网站入口| 国产激情一区二区三区桃花岛亚洲| 亚洲福利视频导航| 国产精品丝袜一区| 久久网站最新地址| www国产成人| 久久免费看少妇高潮| 久久综合九色综合97婷婷| 精品国产一区久久| 欧美精品一区二区三区蜜臀| 91精品国产综合久久久久 | 色悠悠亚洲一区二区| 99在线精品观看| www.亚洲色图| 国产成人免费av在线| 成人午夜精品一区二区三区| 成人涩涩免费视频| 成人app软件下载大全免费| 粉嫩绯色av一区二区在线观看| 国产麻豆一精品一av一免费| 精品一区二区久久久| 国产麻豆欧美日韩一区| 成人小视频免费在线观看| www.欧美日韩| 91激情五月电影| 欧美人妇做爰xxxⅹ性高电影| 欧美三级韩国三级日本一级| 欧美日韩免费电影| 日韩一区二区电影在线| 欧美精品一区二区久久久| 久久久久国产免费免费| 国产精品福利av| 亚洲超碰精品一区二区| 日韩成人精品视频| 国产一区二区三区不卡在线观看| 国产麻豆成人传媒免费观看| www.欧美.com| 欧美日精品一区视频| 欧美精品一区二区三区久久久| 国产欧美日韩激情| 亚洲午夜影视影院在线观看| 青青草97国产精品免费观看无弹窗版| 久久综合综合久久综合| 国产91综合一区在线观看| 日本道色综合久久| 欧美成人三级电影在线| 中文字幕在线观看一区二区| 亚洲大片一区二区三区| 国产剧情一区二区| 一本到三区不卡视频| 欧美一区二区三区免费大片| 欧美国产精品v| 日韩高清欧美激情| aaa亚洲精品| 欧美mv日韩mv国产网站| 亚洲人妖av一区二区| 蜜桃视频一区二区三区在线观看| 国产成人精品aa毛片| 欧美巨大另类极品videosbest | 在线免费av一区| 久久这里都是精品| 亚洲一区二区四区蜜桃| 国产一区二区福利视频| 欧美日韩综合在线免费观看| 国产精品午夜在线观看| 日韩电影一区二区三区| 成人国产精品免费网站| 欧美一区二区三区小说| 亚洲精品自拍动漫在线| 国产传媒一区在线| 日韩精品一区二区在线观看| 悠悠色在线精品| 成人免费毛片app| 日韩欧美成人一区| 午夜亚洲国产au精品一区二区| 成人av资源下载| 久久精品一区二区三区不卡牛牛 | 亚洲一区二区三区四区中文字幕| 国产又粗又猛又爽又黄91精品| 欧美日韩另类一区| 综合色中文字幕| 成人h动漫精品一区二区| www国产精品av| 久久成人综合网| 日韩欧美区一区二| 日本不卡视频一二三区| 91成人国产精品| 亚洲精品免费一二三区| 99久久99久久精品免费观看 | 色综合天天做天天爱| 国产欧美视频一区二区三区| 精品在线一区二区| 精品国产露脸精彩对白| 蜜臀久久99精品久久久久宅男 | 日本一道高清亚洲日美韩| 欧美视频在线不卡| 亚洲伊人伊色伊影伊综合网| 91小视频免费观看| 亚洲欧美日韩国产成人精品影院| 波多野结衣中文一区| 日韩一区在线免费观看| 91首页免费视频| 一区二区视频在线看|