• <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)論排行榜

            国产精品gz久久久| 亚洲αv久久久噜噜噜噜噜| 精品一久久香蕉国产线看播放| 办公室久久精品| 久久久久久久91精品免费观看| 欧美午夜精品久久久久免费视| 久久精品免费一区二区三区| 综合久久一区二区三区| 久久99国产精品久久99果冻传媒| 久久国产乱子伦精品免费午夜| 久久久久久久久久久| 精品免费tv久久久久久久| 色婷婷狠狠久久综合五月| 97r久久精品国产99国产精| 亚洲精品无码久久久| 国产精品丝袜久久久久久不卡| 久久久久亚洲精品天堂| 四虎久久影院| 日韩一区二区三区视频久久| 国产成人久久精品二区三区| 久久精品中文无码资源站| 色婷婷噜噜久久国产精品12p| 精品国产91久久久久久久| 久久婷婷五月综合97色| 久久婷婷五月综合成人D啪| 久久影视国产亚洲| 久久久久无码专区亚洲av| 成人亚洲欧美久久久久 | 久久久精品国产免大香伊| 久久精品人妻一区二区三区| 国产成人精品久久综合| 婷婷综合久久狠狠色99h| 久久精品成人免费网站| 久久99久久99小草精品免视看| 激情伊人五月天久久综合| 久久亚洲欧美国产精品| 99久久国产热无码精品免费| 九九99精品久久久久久| 日韩精品久久久久久| 久久电影网| 久久只这里是精品66|