• <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>

            hdqqq

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              35 隨筆 :: 0 文章 :: 104 評(píng)論 :: 0 Trackbacks

            創(chuàng)建一個(gè)基于模板的數(shù)據(jù)庫(kù)記錄集操作類(三)


            ado封裝
            前面講了建立一個(gè)記錄的結(jié)構(gòu)和對(duì)variant數(shù)據(jù)結(jié)構(gòu)進(jìn)行轉(zhuǎn)換,在這篇里面,對(duì)ado接口進(jìn)行封裝.微軟的ado數(shù)據(jù)操作接口是以com的形式發(fā)布的,在用import指令對(duì)com的動(dòng)態(tài)庫(kù)進(jìn)行導(dǎo)入之后,會(huì)在工程的輸出目錄下生成tlh和tli兩個(gè)文件,tlh是于c和c++用于操作com接口的頭文件,在其中聲明了一些 com接口和com對(duì)象的 IID和CLSID,還有接口的屬性和方法,都以c/c++可以用的形式做了轉(zhuǎn)換,那個(gè)tli文件其實(shí)就是tlh文件中聲明的一些結(jié)構(gòu)的成員函數(shù)的實(shí)現(xiàn),被tlh文件包含.在tlh文件中,通過宏_COM_SMARTPTR_TYPEDEF用模板類_com_ptr_t對(duì)接口進(jìn)行了包裝,


            _COM_SMARTPTR_TYPEDEF是一個(gè)很奇怪的宏,最終生成的是一個(gè)以Ptr結(jié)尾的類如:
            _COM_SMARTPTR_TYPEDEF(Field15, __uuidof(Field15));
            實(shí)際上生成的類的名稱是Field15Ptr類, 類型是_com_ptr_t<Field15, __uuidof(Field15)>

            在我實(shí)現(xiàn)的模板類中,沒有打算在類的整個(gè)生命周期中擁有一個(gè)ADO接口的記錄集成員或者或者ADO連接,我只打算在一些成員函數(shù)中,通過局部變量來使用ADO接口.所以對(duì)ado進(jìn)行了部分的封裝.

            #define?MAKE_ADO_COM_CLASS_TYPEDEF(e)?typedef?CComWrapper < ?e##Ptr? > ?CCom##e

            template?
            < typename ?com_class >
            class?CComWrapper?:?
            public ?com_class
            {
            private :
            ????void?CreateInstance()?{
            ????????
            int ?i? = ? 100 ;
            ????}
            public :????
            ????
            ????com_class?
            & ?operator = ( const ?com_class & ?cp)?{
            ????????com_class::operator
            = (cp);
            ????????return?
            * this;
            ????}
            ????
            ????CComWrapper()?{}
            ????
            ????CComWrapper(CLSID?uid)?{
            ????????::CoInitialize(
            NULL );
            ????????HRESULT?hr?
            = ?com_class::CreateInstance(uid);
            ????????
            if ?(FAILED(hr))?{
            ????????????
            // AfxMessageBox(_T( " Create?Com?Object?Error! " ));
            ????????????TRACE(_T(
            " Create?Com?Object?Error!\n " ));
            ????????}
            ????}
            ????
            ????~CComWrapper()?{
            ????????
            if ?(GetInterfacePtr())
            ????????????com_class::Release();
            ????}
            };


            MAKE_ADO_COM_CLASS_TYPEDEF(_Collection);
            MAKE_ADO_COM_CLASS_TYPEDEF(_DynaCollection);
            MAKE_ADO_COM_CLASS_TYPEDEF(_ADO);
            MAKE_ADO_COM_CLASS_TYPEDEF(Properties);
            MAKE_ADO_COM_CLASS_TYPEDEF(
            Property );
            MAKE_ADO_COM_CLASS_TYPEDEF(
            Error );
            MAKE_ADO_COM_CLASS_TYPEDEF(Errors);
            MAKE_ADO_COM_CLASS_TYPEDEF(Command15);
            MAKE_ADO_COM_CLASS_TYPEDEF(Connection15);
            MAKE_ADO_COM_CLASS_TYPEDEF(_Connection);
            MAKE_ADO_COM_CLASS_TYPEDEF(Recordset15);
            MAKE_ADO_COM_CLASS_TYPEDEF(Recordset20);
            MAKE_ADO_COM_CLASS_TYPEDEF(Recordset21);
            MAKE_ADO_COM_CLASS_TYPEDEF(_Recordset);
            MAKE_ADO_COM_CLASS_TYPEDEF(Fields15);
            MAKE_ADO_COM_CLASS_TYPEDEF(Fields20);
            MAKE_ADO_COM_CLASS_TYPEDEF(Fields);
            MAKE_ADO_COM_CLASS_TYPEDEF(Field20);
            MAKE_ADO_COM_CLASS_TYPEDEF(Field);
            MAKE_ADO_COM_CLASS_TYPEDEF(_Parameter);
            MAKE_ADO_COM_CLASS_TYPEDEF(Parameters);
            MAKE_ADO_COM_CLASS_TYPEDEF(Command25);
            MAKE_ADO_COM_CLASS_TYPEDEF(_Command);
            MAKE_ADO_COM_CLASS_TYPEDEF(ConnectionEventsVt);
            MAKE_ADO_COM_CLASS_TYPEDEF(RecordsetEventsVt);
            MAKE_ADO_COM_CLASS_TYPEDEF(ConnectionEvents);
            MAKE_ADO_COM_CLASS_TYPEDEF(RecordsetEvents);
            MAKE_ADO_COM_CLASS_TYPEDEF(ADOConnectionConstruction15);
            MAKE_ADO_COM_CLASS_TYPEDEF(ADOConnectionConstruction);
            MAKE_ADO_COM_CLASS_TYPEDEF(_Record);
            MAKE_ADO_COM_CLASS_TYPEDEF(_Stream);
            MAKE_ADO_COM_CLASS_TYPEDEF(ADORecordConstruction);
            MAKE_ADO_COM_CLASS_TYPEDEF(ADOStreamConstruction);
            MAKE_ADO_COM_CLASS_TYPEDEF(ADOCommandConstruction);
            MAKE_ADO_COM_CLASS_TYPEDEF(ADORecordsetConstruction);
            MAKE_ADO_COM_CLASS_TYPEDEF(Field15);

            在上面的代碼中,通過一個(gè)模板類CComWrapper,對(duì)ado生成的Ptr類型作了繼承,主要是在析構(gòu)函數(shù)中自動(dòng)釋放接口.同時(shí),我把tlh和tli著兩個(gè)文件改成了一個(gè)h文件和一個(gè)inl文件,這樣在使用的時(shí)候,就不用再使用import指令了.
            posted on 2007-01-31 09:15 hdqqq 閱讀(1513) 評(píng)論(0)  編輯 收藏 引用 所屬分類: c/c++
            久久亚洲精品国产亚洲老地址 | 精品免费tv久久久久久久| 伊人久久大香线蕉综合热线| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久久精品无码专区不卡| 久久久久久极精品久久久| 精品多毛少妇人妻AV免费久久| 国产精品一区二区久久精品无码| 久久亚洲高清综合| 久久亚洲春色中文字幕久久久| 丰满少妇高潮惨叫久久久| 久久精品无码免费不卡| 亚洲狠狠婷婷综合久久蜜芽| 亚洲成人精品久久| 综合人妻久久一区二区精品| 94久久国产乱子伦精品免费| 欧美伊人久久大香线蕉综合| 国产成人综合久久精品尤物| 日韩人妻无码一区二区三区久久| 久久久久无码精品国产app| 国产精品久久久福利| 要久久爱在线免费观看| 国产三级观看久久| 国产欧美久久久精品| 久久天天躁狠狠躁夜夜躁2O2O| 午夜精品久久久久久影视777 | 偷偷做久久久久网站| 精品久久久中文字幕人妻| 少妇人妻88久久中文字幕| 久久无码精品一区二区三区| 久久精品国产亚洲av麻豆小说| 久久精品免费全国观看国产| 婷婷久久综合九色综合九七| 久久99精品久久久久久秒播| 国产精品午夜久久| 精品无码人妻久久久久久| 99热热久久这里只有精品68| 99精品久久久久久久婷婷| 久久国产高清字幕中文| 国产69精品久久久久9999| 91精品国产综合久久四虎久久无码一级|