- ベストアンサー
MFCのC++/CLIでIntPtrをキャストしてデータを受け渡す方法
- MFCのC++/CLIでIntPtrのデータを受け渡す方法がわかりません。
- C#側でIntPtrを宣言し、C++/CLI側のメソッドに渡そうとしていますが、うまく受け渡せません。
- 問題のコードは提供されていますが、解決法が分からず困っています。どなたか助けていただけないでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
何をしたいのか書かれていないのですが、 (C# 側の hBitmap) = (C++/CLI 側の m_hBitmap); という感じの事をしたいという事で良いですか? ★hBitmap に代入をしたいのであれば、「hBitmap の中身(hBitmap)」ではなくて「hBitmap の場所(&hBitmap)」を C++/CLI に渡さなければなりません。C++/CLI 側でも、引数(↓のphBitmap = hBitmapの場所情報)を書き換えるのではなく、引数が指し示す先(↓*phBitmap = hBitmap 本体)を書き換えなければなりません。 ------------------------------ C# System.IntPtr hBitmap; p.GetBitmapHandle((void**)&hBitmap); ------------------------------ C++/CLI (MFC) void GetBitmapHandle( void** phBitmap ){ *phBitmap = (void*)m_hBitmap; } HBITMAP m_hBitmap; ------------------------------ ★しかし、折角 C++/CLI ならば、より CLI 的な方法を使いたい物です(以下)。 ------------------------------ C# System.IntPtr hBitmap; p.GetBitmapHandle(out hBitmap); ------------------------------ C++/CLI (MFC) void GetBitmapHandle([System::Runtime::InteropServices::Out] System::IntPtr% hBitmap){ hBitmap = (System::IntPtr)m_hBitmap; } HBITMAP m_hBitmap; ------------------------------ 「[System::Runtime::InteropServices::Out] System::IntPtr% hBitmap」は C# でいう「out System.IntPtr hBitmap」です。やっている事は初めの例と全く同じで、ただ単に型(と文法)が異なるだけです。
その他の回答 (1)
- chie65536(@chie65535)
- ベストアンサー率44% (8802/19961)
System.IntPtr hBitmap; と書くと、構造体の実体としてhBitmapが宣言されます。 p.GetBitmapHandle((void*)hBitmap); と書くと、構造体の実体をポインタに変換できないのでエラーになります。 p.GetBitmapHandle((void*)&hBitmap); と書いたら、構造体の実体のアドレスが渡されるので、正しく動きません。 p.GetBitmapHandle(hBitmap.ToPointer()); って書いたら行けそうな気がしますが、C#からC++/CLIのメソッドを呼び出した事が無いので、どうなるか判りません。
お礼
ありがとうございます! unsafe関数にひっかかってました。。。 ようやく出来ました! 助かりました!
補足
ご連絡ありがとうございます。 勉強になります。 しかしC#側の以下のコードで p.GetUserBitmapHandle((void**)&hBitmap); 以下のエラーが発生します・・・。 警告 CS0105: 'System.Drawing' の using ディレクティブは、この名前空間で既に使用されています。 エラー CS0214: ポインタおよび固定サイズ バッファは、unsafe コンテキストでのみ使用することができます。 何とかなりませんでしょうか?