2009-05-01 9 views
0

すべてのボディは、管理対象にchar *にシステム::のIntPtrに変換するためにどのように伝えることができ、C++ これは事前にchar *にシステム::のIntPtrを変換する方法

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

おかげで私の主な機能です

+0

ありがとう urの情報 – Cute

答えて

6

私は巨大なC++/CLIプログラマではありませんが、以下はうまくいくはずです。

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

のIntPtrクラスvoid*型としてアドレスを返すToPointerと呼ばれるメソッドを有します。これはC++/CLIのchar*に変換されます。これはVS2008

+0

ありがとうguy.uはうまくいった – Cute

0

注意上で動作検証済み

EDIT

私はあなたのIntPtrがどこから来ているのか分かりませんが、ガベージコレクタがあなたのメモリを台無しにするのを防ぐために、pin_ptrも使うべきです。私は過去に多くのCLR /ネイティブインターオペレーションを行いました。そして、pin_ptrを使用することは、私が苦労してやったことの一つです。

は次をお読みください。 click me

+2

'Marshal :: StringToHGlobalAnsi'の戻り値は管理されていないメモリにあり、固定する必要はありません。 –

1

代わりの

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の魔法を自分自身をクリーンアップします。

関連する問題