• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-6  評論-0  文章-16  trackbacks-0
            ?????????在COM中對象要通過class factory的接口(通常是IClassFactory)來創(chuàng)建。在ATL中,class factory也是從CComObjectRootEx派生的COM類,它跟普通的COM類一樣,也通過CComObject或其同伴類將邏輯功能跟生存期管理分離。
            ?????????在ATL中,class factory類和普通類對象的創(chuàng)建都可以通過被稱為“創(chuàng)建者”的模板類來創(chuàng)建。
            ?????????
            template?<class?T1>
            class?CComCreator
            {
            public:
            ????
            static?HRESULT?WINAPI?CreateInstance(void*?pv,?REFIID?riid,?LPVOID*?ppv)
            ????{
            ????????HRESULT?hRes?=?E_OUTOFMEMORY;
            ????????T1
            *?p?=?NULL;
            ????????p?
            =?new?T1(pv);
            ????????
            if?(p?!=?NULL)
            ????????{
            ????????????p
            ->SetVoid(pv);
            ????????????p
            ->InternalFinalConstructAddRef();
            ????????????hRes?
            =?p->FinalConstruct();
            ????????????
            p->InternalFinalConstructRelease();
            ????????????
            if?(hRes?==?S_OK)
            ????????????????hRes?
            =?p->QueryInterface(riid,?ppv);
            ????????????
            if?(hRes?!=?S_OK)
            ????????????????delete?p;
            ????????}
            ????????
            return?hRes;
            ????}
            };

            ?????????“創(chuàng)建者”通過提供一個靜態(tài)函數(shù)CreateInstance來創(chuàng)建指定類的實(shí)例,并且查詢指定的接口。第一個參數(shù)在實(shí)例化普通對象和class factory對象時會有不同:對于普通對象,通常會傳遞聚合外部對象的IUnknown指針,如果是非聚合創(chuàng)建,可以傳遞NULL(詳見ATL對COM實(shí)體身份的支持四);稍后會介紹在class factory創(chuàng)建時第一個參數(shù)的用處。
            ?????????在ATL中,一個class factory對象只能創(chuàng)建一種類型的COM類實(shí)例。在class factory的CreateInstance函數(shù)中,它不是硬編碼被創(chuàng)建的對象類型,而是通過一個函數(shù)指針成員變量來創(chuàng)建它所管理的對象,而這個函數(shù)指針指向的通常就是某個COM類的“創(chuàng)建者”類的CreateInstance靜態(tài)函數(shù)的地址,此地址是在class factory對象被它自身的“創(chuàng)建者”的CreateInstance函數(shù)創(chuàng)建時通過第一個參數(shù)傳進(jìn)來的,class factory重新定義了SetVoid函數(shù),并且保存這個地址:
            ?????????
            class?CComClassFactory?:
            ????
            public?IClassFactory,
            ????
            public?CComObjectRootEx<CComGlobalsThreadModel>
            {
            public:
            ????
            //?IClassFactory
            ????STDMETHOD(CreateInstance)(LPUNKNOWN?pUnkOuter,?REFIID?riid,?void**?ppvObj)
            ????{
            ????????HRESULT?hRes?=?E_POINTER;
            ????????
            if?(ppvObj?!=?NULL)
            ????????{
            ????????????
            *ppvObj?=?NULL;
            ????????????if?((pUnkOuter?!=?NULL)?&&?!InlineIsEqualUnknown(riid))
            ????????????{
            ????????????????hRes?=?CLASS_E_NOAGGREGATION;
            ????????????}
            ????????????
            else
            ????????????????hRes?
            =?m_pfnCreateInstance(pUnkOuter,?riid,?ppvObj);
            ????????}
            ????????
            return?hRes;
            ????}

            ????STDMETHOD(LockServer)(BOOL?fLock)
            ????{
            ????????
            if?(fLock)
            ????????????_pAtlModule
            ->Lock();
            ????????
            else
            ????????????_pAtlModule
            ->Unlock();
            ????????
            return?S_OK;
            ????}
            ?
            ????void?SetVoid(void*?pv)
            ????{
            ????????m_pfnCreateInstance?
            =?(_ATL_CREATORFUNC*)pv;
            ????}

            ????_ATL_CREATORFUNC
            *?m_pfnCreateInstance;
            };

            ?????????根據(jù)上面的討論,一個COM類的創(chuàng)建者會像這個樣子:
            ?????????CComCreator<?CComObject<CMyClass> >
            ?????????而一個class factory的創(chuàng)建者會像這個樣子:
            ?????????CComCreator< CComCachedObject<CComClassFactory> >。
            ?????????
            ?????????ATL在客戶請求創(chuàng)建CMyClass對象時執(zhí)行的偽代碼如下:
            ?????????
            typedef?CComCreator<?CComCachedObject<CComClassFactory>?>?CClassFactoryCreator;
            typedef?CComCreator
            <?CComObject<CMyClass>?>?CMyClassCreator;

            IClassFactory
            *?pcf=NULL;
            CClassFactoryCreator::CreateInstance(
            &CMyClassCreator::CreateInstance,__uuidof(IClassFactory),&pcf);
            pcf
            ->CreateInstance(pOuter,__uuidof(IMyInterface),ppvObj);
            posted on 2007-04-10 17:36 michael 閱讀(1553) 評論(0)  編輯 收藏 引用 所屬分類: 心得
            国产精品久久新婚兰兰| 国产午夜久久影院| 最新久久免费视频| 色综合久久无码中文字幕| 91精品国产色综久久 | 国产精品久久久久影视不卡| 国产ww久久久久久久久久| 狠狠综合久久综合88亚洲| 久久最新精品国产| 伊人久久大香线焦AV综合影院| 9191精品国产免费久久| 婷婷综合久久中文字幕蜜桃三电影| 99久久国产综合精品成人影院| 狠狠色丁香久久婷婷综合| 人人狠狠综合88综合久久| 青草影院天堂男人久久| 久久精品亚洲日本波多野结衣 | 国产激情久久久久影院老熟女免费 | 国产精品久久久久久影院| 中文字幕久久精品无码| 亚洲va久久久久| 久久无码一区二区三区少妇| 丰满少妇人妻久久久久久4| 久久伊人精品青青草原高清| 久久夜色精品国产欧美乱| 久久精品国产亚洲AV久| 一本久久免费视频| 日日狠狠久久偷偷色综合0| 国产精品欧美亚洲韩国日本久久 | 久久久久久久国产免费看| 99久久精品日本一区二区免费 | 国产精品女同久久久久电影院| 国内精品久久久久影院亚洲| 亚洲国产日韩欧美久久| 亚洲国产成人精品91久久久| 超级97碰碰碰碰久久久久最新| 久久只有这精品99| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 欧美国产精品久久高清| 日韩美女18网站久久精品| 国产69精品久久久久APP下载|