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

            C++ Programmer's Cookbook

            {C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

            C++與.NET中基礎(chǔ)類型的對(duì)應(yīng)及轉(zhuǎn)化


            前言:為了介紹C#寫(xiě)界面,C++寫(xiě)算法的快捷交互開(kāi)發(fā)方式,首先介紹c++,C#內(nèi)部的DLL,COM調(diào)用.

            一,基礎(chǔ)類型



            二,字符類型

            /***

            Author 
            - Nishant Sivakumar
            Copyright(C) 
            - Nishant Sivakumar 2005

            ***/

            #pragma once

            #include 
            <wtypes.h>

            #include 
            <vector>
            #include 
            <string>

            #include 
            <vcclr.h>

            using namespace System;
            using namespace System::Runtime::InteropServices;

            namespace StringUtilities
            {
                
            //Class StringConvertorBase
                
            //Serves as the abstract base class for StringConvertor and implements
                
            //default initialization and clean-up code.
                ref class StringConvertorBase abstract
                {
                protected:
                    StringConvertorBase()
                    {
                        InternalInit();    
                    }    

                    ~StringConvertorBase()
                    {
                        InternalCleanUp();
                    }

                    
            //While the finalizer is included to take care of cases
                    
            //where the destructor does not get called, it's highly inefficient
                    //and ruins the purpose of the class if the class is not used
                    
            //with deterministic destruction. It's recommended that you either use
                    //the auto-variable non-handle declaration format or explicitly
                    
            //call delete on the StringConvertor object after use.
                    !StringConvertorBase()
                    {
                        InternalCleanUp();

            #ifdef _DEBUG
                        throw gcnew Exception(
            "Finalizer should not have got called");
            #
            else
                        Diagnostics::Trace::WriteLine(
            "Finalizer should not have got called");
            #endif
                    }

                    std::vector
            < gcroot<IntPtr> >* m_vec_hglobal;
                    std::vector
            < gcroot<IntPtr> >* m_vec_bstr;

                    
            //Frees the allocated unmanaged memory
                    void InternalCleanUp()
                    {
                        
            for each(gcroot<IntPtr> ptr in *m_vec_hglobal)
                        {
                            Marshal::FreeHGlobal(ptr);
                        }
                        m_vec_hglobal
            ->clear();
                        delete m_vec_hglobal;

                        
            for each(gcroot<IntPtr> ptr in *m_vec_bstr)
                        {
                            Marshal::FreeBSTR(ptr);
                        }
                        m_vec_bstr
            ->clear();
                        delete m_vec_bstr;
                    }

                    void InternalInit()
                    {
                        m_vec_hglobal 
            = new std::vector< gcroot<IntPtr> >(); 
                        m_vec_bstr 
            = new std::vector< gcroot<IntPtr> >(); 
                    }
                };

                
            //Class StringConvertor
                
            //General purpose convertor class for System::String (both from and to)
                ref class StringConvertor : StringConvertorBase
                {
                protected:
                    
            String^ m_String; //The internal System::String object

                
            public
                    
            //Various constructors each taking a different type as argument
                    StringConvertor(
            String^ s) : m_String(s)
                    {
                        
            if(m_String == nullptr)
                            throw gcnew Exception(
            "You need to pass a non-null String");            
                    }

                    StringConvertor(
            const char* s)
                    {
                        
            if(s == nullptr)
                            throw gcnew Exception(
            "You need to pass a non-null char*");
                        m_String 
            = gcnew String(s);
                    }

                    StringConvertor(
            const __wchar_t* s)
                    {
                        
            if(s == nullptr)
                            throw gcnew Exception(
            "You need to pass a non-null __wchar_t*");
                        m_String 
            = gcnew String(s);
                    }

                    StringConvertor(
            array<Char>^ s)
                    {
                        
            if(s == nullptr)
                            throw gcnew Exception(
            "You need to pass a non-null Char array");
                        m_String 
            = gcnew String(s);
                    }

                    StringConvertor(BSTR s)
                    {
                        
            if(s == nullptr)
                            throw gcnew Exception(
            "You need to pass a non-null BSTR");
                        m_String 
            = gcnew String(s);
                    }

                    StringConvertor(std::
            string s)
                    {
                        m_String 
            = gcnew String(s.c_str());
                    }

                    StringConvertor(std::wstring s)
                    {
                        m_String 
            = gcnew String(s.c_str());
                    }

                    
            //Methods

                    virtual 
            String^ ToString() override
                    {
                        return m_String;
                    }

                    
            //Operators

                    operator 
            String^()
                    {
                        return m_String;
                    }

                    
            //Properties    

                    
            //Returns an interior pointer to the underlying string. The
                    
            //pointer is of type const Char so you can only read through it.
                    
            property interior_ptr<const Char> InteriorConstCharPtr
                    {
                        interior_ptr
            <const Char> get()
                        {
                            return PtrToStringChars(m_String);            
                        }
                    }

                    
            //Returns an interior pointer to the underlying string that can be
                    
            //written to. Use with extreme care, as you are directly editing the 
                    
            //System::String's internal character buffer.
                    property interior_ptr<Char> InteriorCharPtr
                    {
                        interior_ptr
            <Char> get()
                        {
                            return const_cast
            < interior_ptr<Char> >(InteriorConstCharPtr);             
                        }
                    }

                    
            //Generic character mapping to use with LPTSTR.
                    
            //Since it's a #define, intellisense won't show it.

            #ifdef _UNICODE 
                #define NativeTCharPtr NativeWideCharPtr
            #
            else
                #define NativeTCharPtr NativeCharPtr
            #endif

                    
            //Returns a char* (allocated on the native heap)
                    
            property char* NativeCharPtr
                    {
                        char
            * get()
                        {
                            IntPtr ptr 
            = Marshal::StringToHGlobalAnsi(m_String);
                            
            if(ptr != IntPtr::Zero)
                            {
                                m_vec_hglobal
            ->push_back(ptr);
                                return reinterpret_cast
            <char*>(static_cast<void*>(ptr));
                            }
                            
            else 
                                return nullptr;            
                        }
                    }

                    
            //Returns a __wchar_t* (allocated on the native heap)
                    
            property __wchar_t* NativeWideCharPtr
                    {
                        __wchar_t
            * get()
                        {
                            IntPtr ptr 
            = Marshal::StringToHGlobalUni(m_String);
                            
            if(ptr != IntPtr::Zero)
                            {
                                m_vec_hglobal
            ->push_back(ptr);
                                return reinterpret_cast
            <__wchar_t*>(static_cast<void*>(ptr));
                            }
                            
            else 
                                return nullptr;
                        }
                    }

                    
            //Returns a CLI array of Chars
                    
            property array<Char>^ CharArray
                    {
                        
            array<Char>^ get()
                        {
                            return m_String
            ->ToCharArray();
                        }
                    }

                    
            //Returns a BSTR allocated natively (unmanaged heap)
                    
            property BSTR BSTRCopy
                    {
                        BSTR 
            get()
                        {
                            IntPtr ptr 
            = Marshal::StringToBSTR(m_String);
                            
            if(ptr != IntPtr::Zero)
                            {
                                m_vec_bstr
            ->push_back(ptr);
                                return reinterpret_cast
            <BSTR>(static_cast<void*>(ptr));
                            }
                            
            else 
                                return nullptr;    
                        }
                    }

                    
            //Returns an std::string object
                    
            property std::string STLAnsiString
                    {
                        std::
            string get()
                        {
                            IntPtr ptr 
            = Marshal::StringToHGlobalAnsi(m_String);
                            
            if(ptr != IntPtr::Zero)
                            {
                                std::
            string tmp(reinterpret_cast<char*>(static_cast<void*>(ptr)));
                                Marshal::FreeHGlobal(ptr);
                                return tmp;                    
                            }
                            return std::
            string();
                        }
                    }

                    
            //Returns an std::wstring object
                    
            property std::wstring STLWideString
                    {
                        std::wstring 
            get()
                        {
                            IntPtr ptr 
            = Marshal::StringToHGlobalUni(m_String);
                            
            if(ptr != IntPtr::Zero)
                            {
                                std::wstring tmp(reinterpret_cast
            <__wchar_t*>(static_cast<void*>(ptr)));
                                Marshal::FreeHGlobal(ptr);
                                return tmp;                    
                            }
                            return std::wstring();
                        }
                    }
                };
            }



            三,其他

            對(duì)于COM,在托管代碼和非托管代碼之間進(jìn)行的所有調(diào)用都必須滿足各自編程模型強(qiáng)加的要求。托管和非托管編程模型在很多方面是不同的。下表顯示了每個(gè)模型的定義特征。

            特征 非托管模型 托管模型

            代碼模型

            基于接口

            基于對(duì)象

            標(biāo)識(shí)

            GUID

            強(qiáng)名稱

            錯(cuò)誤處理機(jī)制

            HRESULT

            異常

            類型兼容性

            二進(jìn)制標(biāo)準(zhǔn)

            類型標(biāo)準(zhǔn)

            類型定義

            類型庫(kù)

            元數(shù)據(jù)

            類型安全

            非類型安全

            可選安全

            版本控制

            不可變的

            靈活的


            COM類型對(duì)應(yīng):
            COM 值類型 COM 引用類型 系統(tǒng)類型

            bool

            bool *

            System.Int32

            charsmall

            char *small *

            System.SByte

            short

            short *

            System.Int16

            longint

            long *int *

            System.Int32

            Hyper

            hyper *

            System.Int64

            unsigned charbyte

            unsigned char *byte *

            System.Byte

            wchar_tunsigned short

            wchar_t *unsigned short *

            System.UInt16

            unsigned longunsigned int

            unsigned long *unsigned int *

            System.UInt32

            unsigned hyper

            unsigned hyper *

            System.UInt64

            float

            float *

            System.Single

            double

            double *

            System.Double

            VARIANT_BOOL

            VARIANT_BOOL *

            System.Boolean

            void*

            void **

            System.IntPtr

            HRESULT

            HRESULT *

            System.Int16System.IntPtr

            SCODE

            SCODE *

            System.Int32

            BSTR

            BSTR *

            System.String

            LPSTR[string, ...] char *

            LPSTR *

            System.String

            LPWSTR[string, …] wchar_t *

            LPWSTR *

            System.String

            VARIANT

            VARIANT *

            System.Object

            DECIMAL

            DECIMAL *

            System.Decimal

            DATE

            DATE *

            System.DateTime

            GUID

            GUID *

            System.Guid

            CURRENCY

            CURRENCY *

            System.Decimal

            IUnknown *

            IUnknown **

            System.Object

            IDispatch *

            IDispatch **

            System.Object

            SAFEARRAY( type )

            SAFEARRAY( type ) *

            type []



            四,參考:
                    http://www.codeproject.com/managedcpp/StringConvertor.asp

                    http://www.voidnish.com/articles/ShowArticle.aspx?code=StringConvertor

            posted on 2007-05-29 13:55 夢(mèng)在天涯 閱讀(5205) 評(píng)論(3)  編輯 收藏 引用 所屬分類: CPlusPlusManage c++ /CLI

            評(píng)論

            # re: C++與.NET中基礎(chǔ)類型的對(duì)應(yīng)及轉(zhuǎn)化 2007-06-04 14:38 看圖軟件

            好東西餓,支持  回復(fù)  更多評(píng)論   

            # re: C++與.NET中基礎(chǔ)類型的對(duì)應(yīng)及轉(zhuǎn)化 2007-06-04 23:22 夢(mèng)在天涯

            非托管 C 語(yǔ)言類型 托管類名 說(shuō)明
            HANDLE void* System.IntPtr 32 位
            BYTE unsigned char S ystem.Byte 8 位
            SHORT short System.Int16 16 位
            WORD unsigned short System.UInt16 16 位
            INT int System.Int32 32 位
            UINT unsigned int System.UInt32 32 位
            LONG long System.Int32 32 位
            BOOL bool System.BOOL 8 位
            DWORD unsigned long System.UInt32 32 位
            ULONG unsigned long System.UInt32 32 位
            CHAR char System.Char 用 ANSI 修飾。
            LPSTR char* System.String 或 System.StringBuilder 用 ANSI 修飾。
            LPCSTR Const char* System.String 或 System.StringBuilder 用 ANSI 修飾。
            LPWSTR wchar_t* System.String 或 System.StringBuilder 用 Unicode 修飾。
            LPCWSTR Const wchar_t* System.String 或 System.StringBuilder 用 Unicode 修飾。
            FLOAT Float System.Single 32 位
            DOUBLE Double System.Double 64 位
              回復(fù)  更多評(píng)論   

            # re: C++與.NET中基礎(chǔ)類型的對(duì)應(yīng)及轉(zhuǎn)化 2007-06-05 09:41 夢(mèng)在天涯

            msdn 上:
            BOOL
            long
            System.Int32
            32 位
              回復(fù)  更多評(píng)論   

            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計(jì)

            • 隨筆 - 461
            • 文章 - 4
            • 評(píng)論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804434
            • 排名 - 5

            最新評(píng)論

            閱讀排行榜

            日本久久中文字幕| 国产精品福利一区二区久久| 国产成人久久AV免费| 久久久久女教师免费一区| 日韩人妻无码一区二区三区久久| 精品久久久久中文字| 久久精品国产亚洲av高清漫画| 免费精品久久久久久中文字幕| 国产精品欧美久久久天天影视| 久久精品国产亚洲AV影院| 久久av高潮av无码av喷吹| 久久精品国产亚洲av日韩| 成人综合久久精品色婷婷| 久久久久国产| 国产亚洲美女精品久久久| 久久精品国产亚洲麻豆| 久久久久亚洲精品无码蜜桃 | 一本久久免费视频| 伊人久久大香线蕉精品| 99久久中文字幕| 久久亚洲欧美国产精品| 97精品伊人久久久大香线蕉| 人妻丰满?V无码久久不卡| 久久久无码精品亚洲日韩软件| 国产AⅤ精品一区二区三区久久| 99久久成人国产精品免费| 久久综合国产乱子伦精品免费| 久久久久国产精品人妻| 波多野结衣久久精品| 久久无码AV中文出轨人妻| 久久精品综合网| 婷婷国产天堂久久综合五月| 久久精品免费大片国产大片 | 久久夜色精品国产亚洲| 免费国产99久久久香蕉| 老司机国内精品久久久久| 久久精品国产99国产精品澳门| 久久免费高清视频| 99久久精品免费国产大片| 久久国产成人| 亚洲精品NV久久久久久久久久|