Cute
Cute

Reputation: 14011

How to convert System::IntPtr to char*

can any body tell How to convert System::IntPtr to char* in managed c++ this is my main function

int main(void) 
{
    String* strMessage = "Hello world";

    CManagedClass* pCManagedClass = new CManagedClass();//working
    pCManagedClass->ShowMessage(strMessage);//working


****above said error here***    
       char* szMessage = (char*)Marshal::StringToHGlobalAnsi(strMessage);
    CUnmanagedClass cUnmanagedClass; cUnmanagedClass.ShowMessageBox(szMessage);
    Marshal::FreeHGlobal((int)szMessage);

    return 0;
}

thanks in advance

Upvotes: 2

Views: 13762

Answers (3)

JaredPar
JaredPar

Reputation: 754505

I'm not a huge C++/CLI programmer, but the following should work just fine.

IntPtr p = GetTheIntPtr();
char* pChar = reinterpret_cast<char*>(p.ToPointer());

The IntPtr class has a method called ToPointer which returns the address as a void* type. That will be convertible to char* in C++/CLI.

EDIT

Verified this works on VS2008 and VS2015

Upvotes: 9

Ben Voigt
Ben Voigt

Reputation: 283614

Instead of

char* szMessage = (char*)Marshal::StringToHGlobalAnsi(strMessage).ToPointer();
Marshal::FreeHGlobal((int)szMessage);

Use

marshal_context conversions.
const char* szMessage = conversions.marshal_as<const char*>(strMessage);

It cleans itself up, the magic of C++ RAII.

Upvotes: 1

user88637
user88637

Reputation: 12140

Attention!

I want to add something to JaredPar answer.I don't know where your IntPtr is coming from but you should also use pin_ptr in order to prevent the garbage collector from messing up your memory. I did lot of CLR/Native inter op in the past and using pin_ptr is one of those things that I learnt to do in the hard way.

read the following: click me

Upvotes: 0

Related Questions