• <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 - 17,  comments - 2,  trackbacks - 0


            System::String -> std::string
            A reader asks,
             
            Sender: Erik Brendengen
             
            Is there an easy way to convert from String^ to std::string?
                         Does String ^s = std::string( “bla”).c_str(); work the other way?
             
            This is a FAQ, one that I myself bumped into when I had to pass a System::String retrieved from System::Windows::Forms::TextBox to a native program that expected a std::string.
             
            There are generally two conversion strategies, depending on which side of the managed/native fence you wish to do the conversion work. Here are two methods making use of the PtrToStringChars( String^ ) utility from the vcclr.h header file that is part of Visual C++. Note that these are written in the new C++/CLI syntax – and that these are adapted from an internal FAQ ...
             
            #include <stdlib.h>
            #include <vcclr.h>
            #include <string>
            using namespace System;
             
            bool To_CharStar( String^ source, char*& target )
            {
                pin_ptr<const wchar_t> wch = PtrToStringChars( source );
                int len = (( source->Length+1) * 2);
                target = new char[ len ];
                return wcstombs( target, wch, len ) != -1;
            }
             
            bool To_string( String^ source, string &target )
            {
                pin_ptr<const wchar_t> wch = PtrToStringChars( source );
                int len = (( source->Length+1) * 2);
                char *ch = new char[ len ];
                bool result = wcstombs( ch, wch, len ) != -1;
                target = ch;
                delete ch;
                return result;
            }
             
            As to the second question, does String^ s = ns.c_str() work? Yes.
            Published Wednesday, June 02, 2004 2:56 PM by slippman
            Comments
             
            Are there any plans to, ahem, extend std::string to include constructors and extraction methods for String^, like ATL::CString currently has? 
            As a sidenote, this is not the first time I find myself wanting one or two features from CString in std::string, to make the decision for which of the two classes to use for a native Windows C++ application a bit easier... 
            Either way, I'm really looking forward to the new C++/CLI. Actually, the /clr switch works amazingly well even today.
            June 3, 2004 10:27 AM
             
            In Whidbey we'll be supplying much more direct approach to do this type of marshalling via a library. 

            void F( String^ s ) 

            string s1 = marshal_to<string>( s ); 
            String^ s2 = marshal_to<String^>( s1 ); 


            If you already have a char*, and want to get a System::String from it, all you have to do is this: 

            void F( const char* s ) 

            String^ s1 = gcnew String( s ); 
            }
            June 4, 2004 3:01 PM
             
            as david larsson's ahem indicates, extending the standard ISO-C++ string independent of a standard's body is, i think, unlikely at this point. however, as anson's mail indicates, there is lots of thought being given on how to help users interoperate between the native and managed platforms, and david's request for support in this is not at all unreasonable.
            June 17, 2004 9:26 AM
             
            Yves Dolce -- the conscience of the blogs -- rightly pointed out that they two conversion samples needlessly prolong the pinning of the internal System::Char array of the String, and has proposed the following preferred alternatives, 

            bool To_CharStar( String^ source, char*& target ) 



            int len = (( source->Length+1) * 2); 

            target = new char[ len ]; 

            pin_ptr<const wchar_t> wch = PtrToStringChars( source ); 

            return wcstombs( target, wch, len ) != -1; 





            bool To_string( String^ source, string &target ) 



            int len = (( source->Length+1) * 2); 

            char *ch = new char[ len ]; 

            bool result ; 



            pin_ptr<const wchar_t> wch = PtrToStringChars( source ); 

            result = wcstombs( ch, wch, len ) != -1; 



            target = ch; 

            delete ch; 

            return result; 



            June 17, 2004 12:16 PM
             
            In To_string(), shouldn't 

            delete ch; 

            actually be 

            delete[] ch; 

            Since you're allocating an array, you really should use the array deletion expression...
            July 2, 2004 5:00 AM
             
            you are correct. it is a bad habit for an old dog who was programming with the language before this was added, and of course in current implementations, its absence is actually both non-fatal and possibly more efficient.
            July 7, 2004 11:39 AM
            Anonymous comments are disabled
            posted on 2008-11-06 17:31 BeyondCN 閱讀(4610) 評論(1)  編輯 收藏 引用 所屬分類: .NET
            久久精品国产精品亜洲毛片| 久久久久久a亚洲欧洲aⅴ | 香蕉久久av一区二区三区| 久久久久久国产a免费观看不卡| 亚洲欧洲精品成人久久曰影片| 伊人久久大香线蕉精品不卡| 久久综合香蕉国产蜜臀AV| 精品一区二区久久| 久久人人爽人人爽人人爽| 久久精品一区二区三区不卡| 香蕉久久AⅤ一区二区三区| 人妻精品久久无码专区精东影业| 99久久99久久精品国产片| 超级碰碰碰碰97久久久久| 久久er热视频在这里精品| 亚洲人成电影网站久久| 国产伊人久久| 99国产欧美久久久精品蜜芽 | 久久综合88熟人妻| 精品国产一区二区三区久久蜜臀| 久久精品久久久久观看99水蜜桃| 9191精品国产免费久久| 无码人妻少妇久久中文字幕蜜桃| 国产成人综合久久久久久| 亚洲欧美成人综合久久久| 色偷偷91久久综合噜噜噜噜| 狠狠色婷婷综合天天久久丁香| 久久久久久久精品妇女99| 色8激情欧美成人久久综合电| 久久99国产精品99久久| 久久偷看各类wc女厕嘘嘘| 久久人人添人人爽添人人片牛牛 | 久久精品亚洲日本波多野结衣 | 精品久久久久香蕉网| 久久精品国产亚洲AV香蕉| 国产精品久久久久久久app | 天天综合久久久网| 久久免费精品一区二区| 色综合久久精品中文字幕首页| 国产精品久久久久9999高清| 久久青青草原综合伊人|