Как конвертировать System :: IntPtr в char * - PullRequest
1 голос
/ 01 мая 2009

может любое тело сказать, как преобразовать System :: IntPtr в char * в управляемом C ++ это моя основная функция

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;
}

спасибо заранее

Ответы [ 3 ]

8 голосов
/ 01 мая 2009

Я не большой программист на C ++ / CLI, но следующее должно работать нормально.

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

В классе IntPtr есть метод ToPointer, который возвращает адрес в виде void*. Это будет конвертироваться в char* в C ++ / CLI.

РЕДАКТИРОВАТЬ

Проверено это работает на VS2008 и VS2015

1 голос
/ 10 октября 2011

вместо

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

Используйте

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

Он очищается, магия C ++ RAII.

0 голосов
/ 01 мая 2009

Внимание!

Я хочу добавить что-то в ответ JaredPar. Я не знаю, откуда исходит ваш IntPtr, но вы также должны использовать pin_ptr, чтобы сборщик мусора не испортил вашу память. В прошлом я много работал над CLR / Native, и использование pin_ptr - одна из тех вещей, которые я научился делать сложным путем.

читать следующее: нажмите меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...