Conversion from System::String::^ to char*

A

Alejandro Aleman

Hello!

i know this may be a newbie question, but i need to convert a string from
System::String^ to char*, in the msdn page tells how, but i need to set to
/clr:blush:ldSyntax and i dont want it because in further editions of .net this
will be deprecated or so on.. .

so, please, anybody can tellme how to convert from System::String::^ to
char* and viceversa?

thank you very much!

alejandro aleman
 
M

Marcus Heege

Alejandro Aleman said:
Hello!

i know this may be a newbie question, but i need to convert a string
from System::String^ to char*, in the msdn page tells how, but i need to
set to /clr:blush:ldSyntax and i dont want it because in further editions of
.net this will be deprecated or so on.. .

so, please, anybody can tellme how to convert from System::String::^ to
char* and viceversa?

thank you very much!

alejandro aleman

To convert from . . to . . use .
[const] char* System::String^ String(char*)
constructor
[const] wchar_t* System::String^ String(wchar_t*)
constructor
BSTR System::String^ String(wchar_t*)
constructor
System::String^ [const] char*
Marshal::StringToCoTaskMemAnsi or Marshal::StringToHGlobalAnsi
System::String^ wchar_t*
Marshal::StringToCoTaskMemUni or Marshal::StringToHGlobalUni
System::String^ const wchar_t*
PtrToStringChars(String^)
System::String^ BSTR
Marshal::StringToBSTR

Marcus Heege
 
J

Jochen Kalmbach [MVP]

Hi Alejandro!
i know this may be a newbie question, but i need to convert a string from
System::String^ to char*, in the msdn page tells how, but i need to set to
/clr:blush:ldSyntax and i dont want it because in further editions of .net this
will be deprecated or so on.. .

so, please, anybody can tellme how to convert from System::String::^ to
char* and viceversa?

For convertion char*/wchar_t* into System::String you need just the
"constructor of "System::String".

For the conversion to char*/wchar_t* you need to explicit allocate
memory and therefor I suggest to use the following method.
It seems to be overloaded, but it can handle all situations (like
exceptions and so on...):

<code>
struct StringConvA
{
char *szAnsi;
StringConvA(System::String* s)
:
szAnsi(static_cast<char*>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(s).ToPointer()))
{}
~StringConvA()
{

System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr(szAnsi));
}
operator LPCSTR() const
{
return szAnsi;
}
};

struct StringConvW
{
wchar_t *szUnicode;
StringConvW(System::String* s)
:
szUnicode(static_cast<wchar_t*>(System::Runtime::InteropServices::Marshal::StringToHGlobalUni(s).ToPointer()))
{}
~StringConvW()
{

System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr(szUnicode));
}
operator LPCWSTR() const
{
return szUnicode;
}
};

#ifdef _UNICODE
#define StringConvT StringConvW
#else
#define StringConvT StringConvA
#endif


int _tmain()
{
String *s = S"abc";
std::string ansi = StringConvA(s);
std::wstring unicode = StringConvW(s);
_tprintf(_T("%s"), (LPCTSTR) StringConvT(s));
}
</code>


--
Greetings
Jochen

My blog about Win32 and .NET
http://blog.kalmbachnet.de/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top