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

            qiezi的學習園地

            AS/C/C++/D/Java/JS/Python/Ruby

              C++博客 :: 首頁 :: 新隨筆 ::  ::  :: 管理 ::
            D語言里面,可以通過version(Windows)來兼容COM接口,不過對于__uuidof卻沒有相應實現。

            原始COM接口定義類似這樣(找個簡單的):

            [
            ????local,
            ????
            object,
            ????uuid(594f31d0
            -7f19-11d0-b194-00a0c90dc8bf)
            ]
            interface?IRpcChannelBuffer2?:?IRpcChannelBuffer
            {

            ????HRESULT?GetProtocolVersion
            ????(
            ????????[
            in,out]?DWORD?*pdwVersion
            ????);
            }

            VC++中可通過__uuidof操作符來獲取COM接口中的uuid“元”信息。

            轉換為D接口后代碼如下:

            version(Windows)?{

            interface?IRpcChannelBuffer2?:?IRpcChannelBuffer
            {
            ????HRESULT?GetProtocolVersion?(DWORD
            *?pdwVersion);
            }

            }

            失去了uuid信息。只要稍作修改,在轉換時保存uuid,即可以模板來模擬實現__uuidof操作符。

            import?std.c.windows.com;
            import?std.
            string;
            import?std.stdio;

            private:

            template?HexStrToUbyte(
            char[]?str)
            {
            ????
            const?ubyte?HexStrToUbyte?=?cast(ubyte)HexStrToUlong!(str);
            }

            template?HexStrToUshort(
            char[]?str)
            {
            ????
            const?ushort?HexStrToUshort?=?cast(ushort)HexStrToUlong!(str);
            }

            template?HexStrToUint(
            char[]?str)
            {
            ????
            const?uint?HexStrToUint?=?cast(uint)HexStrToUlong!(str);
            }

            template?HexStrToUlong(
            char[]?str)
            {
            ????
            static?if?(str.length?==?1)
            ????????
            const?ulong?HexStrToUlong?=?HexToUbyte!(str[0..1]);
            ????
            else
            ????????
            const?ulong?HexStrToUlong?
            ????????????
            =?HexToUbyte!(str[length-1..length])?
            ??????????????
            +?16UL?*?HexStrToUlong!(str[0..length-1]);
            }

            private:

            template?HexToUbyte(
            char[]?c)
            {
            ????
            static?if?(c[0]?>=?'0'?&&?c[0]?<=?'9')
            ????????
            const?ubyte?HexToUbyte?=?c[0]?-?'0';
            ????
            else?static?if?(c[0]?==?'A'?||?c[0]?==?'a')
            ????????
            const?ubyte?HexToUbyte?=?0xa;
            ????
            else?static?if?(c[0]?==?'B'?||?c[0]?==?'b')
            ????????
            const?ubyte?HexToUbyte?=?0xb;
            ????
            else?static?if?(c[0]?==?'C'?||?c[0]?==?'c')
            ????????
            const?ubyte?HexToUbyte?=?0xc;
            ????
            else?static?if?(c[0]?==?'D'?||?c[0]?==?'d')
            ????????
            const?ubyte?HexToUbyte?=?0xd;
            ????
            else?static?if?(c[0]?==?'E'?||?c[0]?==?'e')
            ????????
            const?ubyte?HexToUbyte?=?0xe;
            ????
            else?static?if?(c[0]?==?'F'?||?c[0]?==?'f')
            ????????
            const?ubyte?HexToUbyte?=?0xf;
            }

            template?HexToUbyte_bug(
            char?c)
            {
            ????
            static?if?(c?>=?'0'?&&?c?<=?'9')
            ????????
            const?ubyte?HexToUbyte1?=?c?-?'0';
            ????
            else?static?if?(c?==?'A'?||?c?==?'a')
            ????????
            const?ubyte?HexToUbyte1?=?0xa;
            ????
            else?static?if?(c?==?'B'?||?c?==?'b')
            ????????
            const?ubyte?HexToUbyte1?=?0xb;
            ????
            else?static?if?(c?==?'C'?||?c?==?'c')
            ????????
            const?ubyte?HexToUbyte1?=?0xc;
            ????
            else?static?if?(c?==?'D'?||?c?==?'d')
            ????????
            const?ubyte?HexToUbyte1?=?0xd;
            ????
            else?static?if?(c?==?'E'?||?c?==?'e')
            ????????
            const?ubyte?HexToUbyte1?=?0xe;
            ????
            else?static?if?(c?==?'F'?||?c?==?'f')
            ????????
            const?ubyte?HexToUbyte1?=?0xf;
            }

            template?IIDFromStr(
            char[]?str)
            {
            ????
            const?IID?IIDFromStr?=?{
            ????????HexStrToUint
            !(str[0..8]),
            ????????HexStrToUshort
            !(str[9..13]),?
            ????????HexStrToUshort
            !(str[14..18]),
            ????????[
            ??????????HexStrToUbyte
            !(str[19..21]),
            ??????????HexStrToUbyte
            !(str[21..23]),?
            ??????????HexStrToUbyte
            !(str[24..26]),
            ??????????HexStrToUbyte
            !(str[26..28]),?
            ??????????HexStrToUbyte
            !(str[28..30]),
            ??????????HexStrToUbyte
            !(str[30..32]),?
            ??????????HexStrToUbyte
            !(str[32..34]),
            ??????????HexStrToUbyte
            !(str[34..36])
            ????????]
            ????};
            }

            template?__uuidof(T:IUnknown)
            {
            ????IID?__uuidof?
            =?IIDFromStr!("00000000-0000-0000-C000-000000000046");
            }

            template?__uuidof(T:IClassFactory)
            {
            ????IID?__uuidof?
            =?IIDFromStr!("00000001-0000-0000-C000-000000000046");
            }


            void?main()
            {
            ????IID?iu??
            =?__uuidof!(IUnknown);
            ????IID?icp?
            =?__uuidof!(IClassFactory);

            ????writefln(iu.Data1);
            ????writefln(iu.Data2);
            ????writefln(iu.Data3);
            ????writefln(iu.Data4);
            }

            如上面代碼,接口在轉換時,把:

            [
            ????local,
            ????
            object,
            ????uuid(594f31d0
            -7f19-11d0-b194-00a0c90dc8bf)
            ]
            interface IRpcChannelBuffer2 : IRpcChannelBuffer
            {

            ??? HRESULT GetProtocolVersion
            ??? (
            ??????? [in,out] DWORD *pdwVersion
            ??? );
            }


            轉換為:

            template?__uuidof(T:IRpcChannelBuffer2)
            {
            ????IID?__uuidof?
            =?IIDFromStr!("594f31d0-7f19-11d0-b194-00a0c90dc8bf");
            }
            version?(Windows)?{

            interface?IRpcChannelBuffer2?:?IRpcChannelBuffer?{
            ????HRESULT?GetProtocolVersion?(DWORD
            *?pdwVersion);
            }

            }

            即可,這個可以交由自動化工具完成。

            由于__uuidof模板值在編譯期決議,沒有實際的運行期開銷。
            posted on 2006-04-11 14:26 qiezi 閱讀(769) 評論(0)  編輯 收藏 引用 所屬分類: D
            亚洲国产二区三区久久| 久久综合亚洲色HEZYO社区| 亚洲AV日韩精品久久久久久| 亚洲国产成人精品无码久久久久久综合| 人妻精品久久久久中文字幕69| 亚洲国产精品无码久久久秋霞2 | 伊人久久大香线蕉综合Av| AV无码久久久久不卡蜜桃| 国产∨亚洲V天堂无码久久久| 亚洲国产成人久久精品影视| 久久人妻少妇嫩草AV无码蜜桃 | 亚洲国产精品久久| 久久久久国色AV免费看图片| 精品久久久久久久久免费影院| 久久人人爽人人爽人人片AV不 | 亚洲精品乱码久久久久久蜜桃图片 | 国产激情久久久久久熟女老人 | 久久天天躁狠狠躁夜夜avapp| 久久男人Av资源网站无码软件| 狠狠精品干练久久久无码中文字幕| 热99RE久久精品这里都是精品免费 | 日韩一区二区久久久久久 | 久久久久久综合网天天| 久久99中文字幕久久| 香蕉99久久国产综合精品宅男自 | 亚洲国产精品热久久| 老色鬼久久亚洲AV综合| 欧美麻豆久久久久久中文| 久久国产精品-国产精品| 亚洲精品乱码久久久久久蜜桃不卡| 国产精品无码久久久久| 1000部精品久久久久久久久| 久久夜色精品国产噜噜亚洲AV| 亚洲乱码日产精品a级毛片久久| 欧美久久综合性欧美| 久久久国产乱子伦精品作者| 亚洲?V乱码久久精品蜜桃| 欧美亚洲另类久久综合婷婷| 久久精品中文字幕有码| 久久国产高清一区二区三区| 国产午夜精品久久久久九九电影|