• <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>
            posts - 297,  comments - 15,  trackbacks - 0
            這個(gè)技巧不是針對(duì)VC++ 6.0缺陷的,而是針對(duì)VC++擴(kuò)展語(yǔ)法的。這個(gè)技巧的來(lái)由,是為了某些希望有一天有可能要脫離Visual C++環(huán)境進(jìn)行開發(fā)的人員。為了脫離VC++,你需要謹(jǐn)慎使用它的所有擴(kuò)展語(yǔ)法。例如本文討論的__uuidof。我們先來(lái)看看一個(gè)例子:
                class __declspec(uuid("B372C9F6-1959-4650-960D-73F20CD479BA")) Class;   
            struct __declspec(uuid("B372C9F6-1959-4650-960D-73F20CD479BB")) Interface;

            void test()
            {
            CLSID clsid=__uuidof(Class);
            IID iid=__uuidof(Interface);
            ...
            }


              這比起你以前定義uuid的方法簡(jiǎn)單多了吧?可惜,這樣好用的東西,它只在VC++中提供。不過(guò)沒(méi)有關(guān)系,我們這里介紹一個(gè)技巧,可以 讓你在幾乎所有C++編譯器中都可以這樣方便的使用__uuidof。這里沒(méi)有說(shuō)是所有,是因?yàn)槲覀兪褂昧四0逄鼗夹g(shù),可能存在一些比較“古老”的 C++編譯器,不支持該特性。

              也許你已經(jīng)迫不及待了。好,讓我們來(lái)看看:

                #include <string>   
            #include <cassert>

            inline STDMETHODIMP_(GUID) GUIDFromString(LPOLESTR lpsz)
            {
            HRESULT hr;
            GUID guid;
            if (lpsz[0]=='{')
            {
            hr=CLSIDFromString(lpsz,&guid);
            }
            else
            {
            std::basic_string<OLECHAR> strGuid;
            strGuid.append(1,'{');
            strGuid.append(lpsz);
            strGuid.append(1,'}');
            hr = CLSIDFromString((LPOLESTR)strGuid.c_str(),&guid);
            }
            assert(hr==S_OK);
            return guid;
            }

            template <class Class>
            struct _UuidTraits {
            };

            #define _DEFINE_UUID(Class,uuid) \
            template <> \
            struct _UuidTraits<Class>{ \
            static const GUID& Guid(){ \
            static GUID guid=GUIDFromString(L## uuid); \
            return guid; \
            } \
            }

            #define __uuidof(Class) _UuidTraits<Class>::Guid()

            #define DEFINE_CLSID(Class,guid) \
            class Class; \
            _DEFINE_UUID(Class,guid)

            #define DEFINE_IID(Interface,iid) \
            struct Interface; \
            _DEFINE_UUID(Interface,iid)


              這樣一來(lái),就已經(jīng)模擬出一個(gè)__uuidof關(guān)鍵字。我們可以很方便進(jìn)行uuid的定義。舉例如下:
                void test()   
            {
            CLSID clsid=__uuidof(Class);
            IID iid=__uuidof(Interface);
            ...
            }  


              在VC++中,為了與其他編譯器以相同的方式來(lái)進(jìn)行uuid的定義,我們不直接使用__declspec(uuid),而是也定義DEFINE_CLSID, DEFINE_IID宏:

                #define DEFINE_CLSID(Class,clsid)           \   
            class __declspec(uuid(clsid)) Class

            #define DEFINE_IID(Interface,iid) \
            struct __declspec(uuid(iid)) Interface


              這樣一來(lái),我們已經(jīng)在所有包含VC++在內(nèi)的支持模板特化技術(shù)的編譯器中,提供了__uuidof關(guān)鍵字。通過(guò)它可以進(jìn)一步簡(jiǎn)化你在C++語(yǔ)言中實(shí)現(xiàn)COM組件的代價(jià)。

              附注:關(guān)于本文使用的C++模板的特化技術(shù),詳細(xì)請(qǐng)參閱C++文法方面的書籍,例如《C++ Primer》。其實(shí)這個(gè)技巧在C++標(biāo)準(zhǔn)庫(kù)——STL中有一個(gè)專門的名字:traits(萃取),你可以在很多介紹STL的書籍中見(jiàn)到相關(guān)的介紹。

              轉(zhuǎn)注:因?yàn)樽约阂院髮懙奈恼滦枰玫筋愃频募记桑虼讼劝徇^(guò)來(lái)放這。


            posted on 2008-07-19 16:01 chatler 閱讀(542) 評(píng)論(0)  編輯 收藏 引用 所屬分類: VC_MFC
            <2010年1月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺(jué)這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺(jué)得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲国产精品综合久久网络 | 久久国产免费直播| 国产A级毛片久久久精品毛片| 丁香久久婷婷国产午夜视频| 亚洲日本va中文字幕久久| 国产精品成人久久久| 久久婷婷国产剧情内射白浆| 大伊人青草狠狠久久| 久久久久国色AV免费看图片| 久久国产高潮流白浆免费观看| 久久强奷乱码老熟女| 97久久精品人妻人人搡人人玩| 理论片午午伦夜理片久久| 99久久国语露脸精品国产| 久久精品国产AV一区二区三区| 国产精品免费看久久久香蕉 | 少妇高潮惨叫久久久久久| 狠狠久久亚洲欧美专区| 久久久久久久久久久精品尤物| 久久国产精品二国产精品| 久久精品一区二区| 久久精品国产亚洲77777| 久久久国产精华液| 天堂无码久久综合东京热| 久久黄色视频| 国内精品久久久久久不卡影院| 91精品国产9l久久久久| 久久精品无码专区免费东京热| 久久99久国产麻精品66| 久久久久亚洲国产| 久久综合亚洲色HEZYO社区| 久久综合偷偷噜噜噜色| 亚洲国产精品一区二区三区久久| 欧美一级久久久久久久大片| 久久五月精品中文字幕| 日韩电影久久久被窝网| 久久久久波多野结衣高潮| 人妻无码久久一区二区三区免费| 午夜精品久久久久久中宇| 无码AV中文字幕久久专区| 久久99精品国产|