• <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 閱讀(4611) 評論(1)  編輯 收藏 引用 所屬分類: .NET
            久久精品成人欧美大片| 久久99精品久久久久久动态图 | 亚洲精品WWW久久久久久| 久久精品免费全国观看国产| 伊人久久无码中文字幕| 2021久久精品国产99国产精品| 色噜噜狠狠先锋影音久久| 亚洲&#228;v永久无码精品天堂久久 | 久久久久久av无码免费看大片| 伊人久久精品影院| 久久精品国产亚洲欧美| 亚洲精品无码专区久久同性男| 久久ww精品w免费人成| 亚洲欧美国产日韩综合久久| 国产精品久久久久久搜索| 欧美激情一区二区久久久| 亚洲国产成人久久精品影视| 亚洲精品无码久久久久sm| 欧美日韩成人精品久久久免费看| 奇米综合四色77777久久| 蜜臀久久99精品久久久久久| 久久最近最新中文字幕大全| 亚洲av成人无码久久精品| 一级做a爰片久久毛片免费陪| 国产精品亚洲综合专区片高清久久久 | 久久香蕉国产线看观看猫咪?v| 久久久久久久人妻无码中文字幕爆| 久久中文精品无码中文字幕| 91久久成人免费| 久久青草国产精品一区| 99久久精品国内| 久久国产欧美日韩精品| 久久久久亚洲AV片无码下载蜜桃| 少妇人妻综合久久中文字幕| 久久久久久久91精品免费观看| 无码人妻久久一区二区三区蜜桃| 久久九九久精品国产| 欧美精品一区二区久久| 性做久久久久久久久浪潮| 少妇无套内谢久久久久| 亚洲精品国产字幕久久不卡 |