こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

MFCのC++/CLI へIntPtrをキャスト

MFCのC++/CLI へIntPtrのデータを受け渡せません。。。
コードは以下になります。

------------------------------
C#
System.IntPtr hBitmap;

p.GetBitmapHandle((void*)hBitmap);//CLI側のメソッド
------------------------------
C++/CLI (MFC)

void GetBitmapHandle( void* hBitmap ){ hBitmap = m_hBitmap; }
HBITMAP m_hBitmap;
------------------------------
非常に困ってます。助けてください!

投稿日時 - 2014-08-08 17:23:28

QNo.8709250

すぐに回答ほしいです

質問者が選んだベストアンサー

何をしたいのか書かれていないのですが、
(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」です。やっている事は初めの例と全く同じで、ただ単に型(と文法)が異なるだけです。

投稿日時 - 2014-08-09 00:57:05

補足

ご連絡ありがとうございます。
勉強になります。

しかしC#側の以下のコードで
p.GetUserBitmapHandle((void**)&hBitmap);


以下のエラーが発生します・・・。
警告 CS0105: 'System.Drawing' の using ディレクティブは、この名前空間で既に使用されています。

エラー CS0214: ポインタおよび固定サイズ バッファは、unsafe コンテキストでのみ使用することができます。

何とかなりませんでしょうか?

投稿日時 - 2014-08-11 10:53:54

お礼

ありがとうございます!

unsafe関数にひっかかってました。。。
ようやく出来ました!

助かりました!

投稿日時 - 2014-08-11 11:22:50

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

System.IntPtr hBitmap;

と書くと、構造体の実体としてhBitmapが宣言されます。

p.GetBitmapHandle((void*)hBitmap);

と書くと、構造体の実体をポインタに変換できないのでエラーになります。

p.GetBitmapHandle((void*)&hBitmap);

と書いたら、構造体の実体のアドレスが渡されるので、正しく動きません。

p.GetBitmapHandle(hBitmap.ToPointer());

って書いたら行けそうな気がしますが、C#からC++/CLIのメソッドを呼び出した事が無いので、どうなるか判りません。

投稿日時 - 2014-08-08 17:41:20

あなたにオススメの質問