Convert System::String* to char*

  • Thread starter Thread starter Guest
  • Start date Start date
G

Guest

Hi

Does anybody know how to convert System::String* to char*? I searched the System::String class members and did not find any. Thanks

Yifan
 
Yifan said:
Does anybody know how to convert System::String*
to char*? I searched the System::String class
members and did not find any.

Check the docs for the meaning of PtrToStringChars()

Regards,
Will
 
PtrToStringChars() returns System::Char*. But I want to convert System::String* to char* which is a c-type string such as "hello". Thanks

Yifa

----- William DePalo [MVP VC++] wrote: ----

Yifan said:
Does anybody know how to convert System::String
to char*? I searched the System::String clas
members and did not find any

Check the docs for the meaning of PtrToStringChars(

Regards
Wil
 
Yifan said:
PtrToStringChars() returns System::Char*. But
I want to convert System::String* to char* which
is a c-type string such as "hello".

See Win32's WideCharacterToMultiByte() or the runtime's wcstombs().

Also check the docs for the DllImport attribute and its CharSet member which
can be used to "tag" functions in external DLLs that you wish to call.

Regards,
Will
 
size_t wcstombs
char *mbstr
const wchar_t *wcstr
size_t count
)

wcstombs() only converts wchar_t * to char*

What I really want is to convert System::String* to char*(c-type string)
I can use System::String's ToCharArray() to convert System::String* to a Unicode character array, but it is of type __wchar_t [], and I could not convert __wchar_t [] to wchar_t * or char*, even with a Type-cast. Thanks

Yifa

----- William DePalo [MVP VC++] wrote: ----

Yifan said:
PtrToStringChars() returns System::Char*. Bu
I want to convert System::String* to char* whic
is a c-type string such as "hello"

See Win32's WideCharacterToMultiByte() or the runtime's wcstombs()

Also check the docs for the DllImport attribute and its CharSet member whic
can be used to "tag" functions in external DLLs that you wish to call

Regards
Wil
 
Yifan said:
size_t wcstombs(
char *mbstr,
const wchar_t *wcstr,
size_t count
);

wcstombs() only converts wchar_t * to char*.

Yes, I know. A wchar_t is a 16 bit-wide character type. System::Char are
16-bit wide characters as well. The two functions I referenced will map the
string you get back from PtrToStringChars() to ANSI.

I pointed you to DllImport. You should look it up. One the page where it is
described:

http://msdn.microsoft.com/library/d...ropservicesdllimportattributememberstopic.asp

there is also mention of "CharSet" which addresses the ANSI/UNICODE issue.

If neither of these two approaches will solve your problem then I am afraid
I can't help you.

Regards,
Will
 
Yifan said:
Hi,

Does anybody know how to convert System::String* to char*? I searched
the System::String class members and did not find any. Thanks.

Try these two functions for converting a System::String * to a std::string
and back again:

std::string ToCppString(System::String * str)
{
if (str == 0)
{
return(std::string());
}
System::IntPtr
ptr(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str));
std::string ret(static_cast<const char *>(static_cast<void *>(ptr)));
System::Runtime::InteropServices::Marshal::FreeCoTaskMem(ptr);
return(ret);
}

System::String * ToNetString(const std::string & ss)
{
if (ss.empty())
{
return(new System::String(S""));
}
System::IntPtr ptr(static_cast<System::IntPtr>(static_cast<void
*>(const_cast<char *>(ss.c_str()))));
System::String *
ret(System::Runtime::InteropServices::Marshal::PtrToStringAnsi(ptr));
return(ret);
}

I put these in a __nogc class in a namespace in a shared assembly and both
are static functions. I then export the class when creating the assembly and
import the class when using the assembly, using a macro which becomes either
__declspec(dllexport) when the assembly is being built and
__declspec(dllimport) otherwise. Since it is a __nogc class, you need to
#include the header file in which the static functions and their __nogc
class are defined. Then to convert from a System::String * to a std::string
or vice-versa, I use the full name, such as:
MyNamespace::MyClass::ToCppString(x) or
MyNamespace::MyClass::ToNetString(y)..
 
Yifan said:
Hi,

Does anybody know how to convert System::String* to char*? I searched the
System::String class members and did not find any. Thanks.

Personally I use good old CString :

System::String* stest="test";

CString cstest=stest;

char* ctest=cstest.GetBuffer();

HTH,

Michiel.
 
Personally I use good old CString :
System::String* stest="test";

CString cstest=stest;

char* ctest=cstest.GetBuffer();

Where is this code located in? In a managed C++ project or an unmanaged
project? Which project wizard did you use and which compile settings did you
add to compile this?

Thanks and regards,
Klaus
 
Klaus Bonadt said:
Where is this code located in? In a managed C++ project or an unmanaged
project? Which project wizard did you use and which compile settings did you
add to compile this?

Thanks and regards,
Klaus

It's a mixed project (custom ActiveX control, no project wizard was used (VS
2003)) and I added
#include <atlstr.h> to the includes and also a reference to the .Net System
library.
 
Personally I use good old CString :
It's a mixed project (custom ActiveX control, no project wizard was used (VS
2003)) and I added
#include <atlstr.h> to the includes and also a reference to the .Net System
library.

Is there somebody who can direct me in the right direction? I am using VS
2002 and I have difficulties in using MFC (for example CString) together
with managed code.
If I start with a managed C++ dll, I do not know how to integrate the MFC?
Or should I start with an unmanaged C++ dll? What options I have to give to
access .Net Framework?

Thanks and regards,
Klaus
 
Klaus Bonadt said:
Is there somebody who can direct me in the right direction? I am using VS
2002 and I have difficulties in using MFC (for example CString) together
with managed code.
If I start with a managed C++ dll, I do not know how to integrate the MFC?
Or should I start with an unmanaged C++ dll? What options I have to give to
access .Net Framework?

Thanks and regards,
Klaus

Please note that the CString I use is not the MFC one, but the ATL one.
I just tested it by creating a new Windows Forms .Net application, including
the mentioned file and creating and outputting a CString. Works fine. I
figured I'd have to include ATL as a static link, but this wasn't even
necessary.

Hope this helps,

Michiel.
 
Hi,

Does anybody know how to convert System::String* to char*? I searched the System::String class members and did not find any. Thanks.

Yifan

Have a look at the methods in the Marshal class. StringToHGlobalAnsi
may do what you need.

HTH,
Tim
 
Hi,

I have found this in the msdn

String __gc* str = S"managed string";
const char __nogc* pStr = static_cast<const
char*>(Marshal::StringToHGlobalAnsi(str).ToPointer());

Default Arguments and Helper Functions
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1033/vcmxspec/html/vcmg_defaultarg
umenthelpfunctions.htm

Hope this can help

Thanks,
Mohamed

Yifan said:
Hi,

Does anybody know how to convert System::String* to char*? I searched the
System::String class members and did not find any. Thanks.
 
Michie

yu da man

----- Michiel wrote: ----


Klaus Bonadt said:
2002 and I have difficulties in using MFC (for example CString) togethe
with managed code
If I start with a managed C++ dll, I do not know how to integrate the MFC
Or should I start with an unmanaged C++ dll? What options I have to giv t
access .Net Framework
Klau


Please note that the CString I use is not the MFC one, but the ATL one
I just tested it by creating a new Windows Forms .Net application, includin
the mentioned file and creating and outputting a CString. Works fine.
figured I'd have to include ATL as a static link, but this wasn't eve
necessary

Hope this helps

Michiel.
 
Thank you :O

Alfonso Paredes said:
Michiel

yu da man!


----- Michiel wrote: -----


an settings give

Please note that the CString I use is not the MFC one, but the ATL one.
I just tested it by creating a new Windows Forms .Net application, including
the mentioned file and creating and outputting a CString. Works fine. I
figured I'd have to include ATL as a static link, but this wasn't even
necessary.

Hope this helps,

Michiel.
 
Back
Top