• <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++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

            C++與.NET中基礎類型的對應及轉化


            前言:為了介紹C#寫界面,C++寫算法的快捷交互開發方式,首先介紹c++,C#內部的DLL,COM調用.

            一,基礎類型



            二,字符類型

            /***

            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();
                        }
                    }
                };
            }



            三,其他

            對于COM,在托管代碼和非托管代碼之間進行的所有調用都必須滿足各自編程模型強加的要求。托管和非托管編程模型在很多方面是不同的。下表顯示了每個模型的定義特征。

            特征 非托管模型 托管模型

            代碼模型

            基于接口

            基于對象

            標識

            GUID

            強名稱

            錯誤處理機制

            HRESULT

            異常

            類型兼容性

            二進制標準

            類型標準

            類型定義

            類型庫

            元數據

            類型安全

            非類型安全

            可選安全

            版本控制

            不可變的

            靈活的


            COM類型對應:
            COM 值類型 COM 引用類型 系統類型

            bool

            bool *

            System.Int32

            charsmall

            char *、small *

            System.SByte

            short

            short *

            System.Int16

            long、int

            long *、int *

            System.Int32

            Hyper

            hyper *

            System.Int64

            unsigned charbyte

            unsigned char *、byte *

            System.Byte

            wchar_t、unsigned 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 夢在天涯 閱讀(5206) 評論(3)  編輯 收藏 引用 所屬分類: CPlusPlus 、Manage c++ /CLI

            評論

            # re: C++與.NET中基礎類型的對應及轉化 2007-06-04 14:38 看圖軟件

            好東西餓,支持  回復  更多評論   

            # re: C++與.NET中基礎類型的對應及轉化 2007-06-04 23:22 夢在天涯

            非托管 C 語言類型 托管類名 說明
            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 位
              回復  更多評論   

            # re: C++與.NET中基礎類型的對應及轉化 2007-06-05 09:41 夢在天涯

            msdn 上:
            BOOL
            long
            System.Int32
            32 位
              回復  更多評論   

            公告

            EMail:itech001#126.com

            導航

            統計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804752
            • 排名 - 5

            最新評論

            閱讀排行榜

            亚洲AV日韩精品久久久久久| 国产精品亚洲综合专区片高清久久久 | 国产精品一久久香蕉国产线看观看| 国产亚洲色婷婷久久99精品91| 2021少妇久久久久久久久久| 777午夜精品久久av蜜臀| 精品国产青草久久久久福利| 国产精品久久久久蜜芽| 99精品久久精品一区二区| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 欧美激情精品久久久久久久九九九| 久久国产精品久久| 精品蜜臀久久久久99网站| 久久国产亚洲高清观看| 亚洲国产精品久久久久| 99久久夜色精品国产网站| 狠狠精品久久久无码中文字幕 | 色欲综合久久躁天天躁蜜桃| 亚洲国产精品无码久久| 久久人人妻人人爽人人爽| 久久精品aⅴ无码中文字字幕不卡| 久久国产精品99精品国产| 国产∨亚洲V天堂无码久久久 | 亚洲色大成网站WWW久久九九| 人妻无码精品久久亚瑟影视| 久久国产色AV免费观看| 99久久无码一区人妻| 亚洲精品WWW久久久久久 | 无码人妻少妇久久中文字幕蜜桃| 99精品久久精品| 亚洲伊人久久成综合人影院| 久久综合狠狠综合久久综合88| 久久精品视频免费| 久久久久亚洲AV无码专区网站| 久久人人爽人人人人片av| 九九99精品久久久久久| 国产精品久久久久久久人人看| 久久成人精品视频| 久久99久国产麻精品66| 精品久久人人做人人爽综合| 久久综合给合久久国产免费|