MFCのC++/CLIでIntPtrをキャストしてデータを受け渡す方法

このQ&Aのポイント
  • MFCのC++/CLIでIntPtrのデータを受け渡す方法がわかりません。
  • C#側でIntPtrを宣言し、C++/CLI側のメソッドに渡そうとしていますが、うまく受け渡せません。
  • 問題のコードは提供されていますが、解決法が分からず困っています。どなたか助けていただけないでしょうか?
回答を見る
  • ベストアンサー

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; ------------------------------ 非常に困ってます。助けてください!

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

  • ベストアンサー
回答No.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」です。やっている事は初めの例と全く同じで、ただ単に型(と文法)が異なるだけです。

mindeyed
質問者

お礼

ありがとうございます! unsafe関数にひっかかってました。。。 ようやく出来ました! 助かりました!

mindeyed
質問者

補足

ご連絡ありがとうございます。 勉強になります。 しかしC#側の以下のコードで p.GetUserBitmapHandle((void**)&hBitmap); 以下のエラーが発生します・・・。 警告 CS0105: 'System.Drawing' の using ディレクティブは、この名前空間で既に使用されています。 エラー CS0214: ポインタおよび固定サイズ バッファは、unsafe コンテキストでのみ使用することができます。 何とかなりませんでしょうか?

その他の回答 (1)

  • chie65535
  • ベストアンサー率43% (8522/19371)
回答No.1

System.IntPtr hBitmap; と書くと、構造体の実体としてhBitmapが宣言されます。 p.GetBitmapHandle((void*)hBitmap); と書くと、構造体の実体をポインタに変換できないのでエラーになります。 p.GetBitmapHandle((void*)&hBitmap); と書いたら、構造体の実体のアドレスが渡されるので、正しく動きません。 p.GetBitmapHandle(hBitmap.ToPointer()); って書いたら行けそうな気がしますが、C#からC++/CLIのメソッドを呼び出した事が無いので、どうなるか判りません。

関連するQ&A

  • C#のピクチャボックスにCLIのHBITMAPを

    C#のピクチャボックスにC++/CLIのHBITMAPを貼り付けたいです。 方法を教えてくれませんか? 今、考えている方法は以下ですが、中々難しいです。 1.C#側 BitmapからIntPtr型で hDC を取得  → C++/CLIに渡せない 2.C++/CLIでhDCにHBITMAPを貼り付け  →IntPtr型を定義できない・・・。 以上、宜しくお願い致します。

  • C#とC++/CLI間でポインタが指す内容が変わる

    現在、C++/CLIプログラムをC#で使う必要があり、 C++/CLIで定義したメソッドとクラスでC#側とやり取りする必要が生じております。 以下の書き方で、C++/CLIとC#間のクラスのやり取りはできたのですが、 C++/CLI側で定義されているメソッド内で、ポインタが指し示す値(*id.head)が変わってしまいます(文字化けみたいな感じになる)。 引き渡したポインタ変数の値は一致しているのですが、 どうすれば、C++/CLI側で値を正しく取得できるのでしょうか?。 【C++/CLI側で定義されているクラス】 public value class class1 { public : ULONG code; header    *head; }; typedef struct _header { CHAR achCHdrType[2]; CHAR achMsgLen[2]; } header ; 【C++/CLI側で定義されているメソッド】 ULONG session::open(class1& id) { return session_oepn(id.code, *id.head) } 【C#側でのメソッド参照】 class1 c1 = new class1(); uint status = session.open(&c1); よろしくお願いします。

  • C#,C++/CLI,MFCにおけるデータ型の対応と、メソッドへの渡し方

    現在、Visual Studio 2005の、Visual C#、C++/CLI、MFCを使ったシステムを構築しています。 具体的には、MFCで書かれたライブラリ(DLL)をC++/CLIでラップし、C#から呼び出して使うというものです。 現在は、http://www.atmarkit.co.jp/fdotnet/special/vcppinvista02/vcppinvista02_04.html http://msdn2.microsoft.com/ja-jp/library/ac7ay120(VS.80).aspx これらのサイトを参考にしながら、一部のMFCで書かれたメソッドを、C#から呼び出すことに成功しました。しかし、int型やHANDLE型などの、上記サイトに記述されているデータ型を用いたメソッドのラッピングや呼び出しはできたのですが、HDCやLPRECTなどの特殊な型の場合のやり方がよく分かりません。 具体的に現在分からないのは、次の通りです。 HDC(デバイスコンテキスト)、HWND(ウィンドウのハンドル)、CIRCLE,RECT等の構造体、LPRECTなどの構造体のアドレス、POINT*などの構造体のポインタ これらが、C#やCLIでどのような型になるのか、メソッドに渡す時にどのように記述するのかが分かりません。 以上、どなたか分かる方いらっしゃいましたら、ご回答をお願いします。

  • .NET C++/CLIのガーベジコレクションについて

    .NET C++/CLIのガーベジコレクションについて .NET C++/CLIで、マネージピープの配列をネイティブDLLにポインタ引数として渡す動作で、 配列が正常に渡っていることは確認したのですが、ネイティブDLL側で配列の処理をしている最中に、 ガーベジコレクションが起こり、誤動作することはあるのでしょうか。 ちなみに、マーシャリングは以下のように行いました。 // マネージ側コード [DllImport("native.dll")] void ArraySet( [MarshalAs(UnmanagedType::LPArray)] array <int> ^ Data ); array <int> ^ Data = gcnew array <int>(64); ArraySet( Data ); // この中で配列の処理中にガーベジコレクションが起こると誤動作?

  • MFC,C++/CLI,C#の共存

    CCDカメラからの画像を画像処理ボード(MV-10というボードです)で受け取り、そのデータを使ったWindowsプログラムを開発したいと考えています。 開発はVisual C# 2005か Visual C++ 2005(C++/CLI)で行いたい(理想としては、フォームなど外観はC#、内部処理はC++)のですが、画像処理ボードのライブラリがMFCとなっていました。 色々と調べて、MFCとC++/CLIを共存させることが出来るらしく、またC#とC++/CLIを共存させることも出来るらしいと言うことが分かったのですが、具体多的な方法が分かりません。 具体的な方法が記述されている書籍や、ウェブサイトなどがありましたら、教えていただきたいです。

  • C++/CLIからC++の呼び出しで例外

    お世話になります。 C#からC++のNativeコード(unmanaged)を呼び出したいと思い、C++/CLIでラッパーを作りました。 そのラッパーのクラス内で、C++で書かれたNativeコードのクラスのインスタンスを作成する時に例外が発生してしまいます。 例外はこんな感じです。 System.Runtime.InteropServices.SEHException はハンドルされませんでした。 Message="外部コンポーネントが例外をスローしました。" Source="ManMovLib" ErrorCode=-2147467259(0x80004005) StackTrace: 場所 new(UInt32 ) C++/CLIは以下の様なコードで、コンストラクタ内でC++のクラスの実体を作っています。そして、このnewで例外が発生します。 AVSource::AVSource(void) {   m_pObj = new CAVSource; } C++側は、実は何もしていません。 CAVSource::CAVSource(void) { } そして、色々と試行錯誤をした結果、C++側のクラスにvirtual関数があると、例外が出てしまうという事実を突き止めました。 ただ、どこを調べても、virtual関数を用いてはいけないとは書いてありません。 実際、virtualを使ってはいけないという制約があるのでしょうか? また、何かNativeのコードを作成する際に注意点とかありますでしょうか? ちなみに、プロジェクトの設定で、Nativeコードのデバッグを可能にするチェックをつけてデバッグ実行すると、何故かこの例外は発生せずに、全て正常に動きます。これもなぞです。 よろしくお願いします。

  • C++/CLIについて

    現在C、C++を1部、WIN32を習得しているのですが、ウィンドウアプリケーションを作るときは全てWIN32APIを使用して作っています データベースを使ってみようと思い、VS2005(Pro)についていたSQLEEを使ってみようと色々と調べたんですが、ほとんどの書籍やサイトがVBかC#を使用していました しかし、VBやC#でプログラムを書き直すのも大変なのでどうしようかと思っていたらC++/CLIなるものの存在を知りました そこでC++/CLIの勉強をしてDBを使おうと思ったのですが、何分習得言語以外の知識が足りないため不安なところを質問させてください 以下質問 1、VB、C#、C++/CLIとC+WIN32の大きな違いは.NETFrameWorkが使えるか使えないかということであっていますか? 2、多くの書籍がVBやC#とDBを組み合わせているのは、.NETに含まれるADO.NETを使用するからですか? 3、C/C++を習得するとMFCを習得するのが一般的なようですが、MFCのメリットがイマイチわからないので教えてください(WIN32で十分代用可能なため) 4、C++/CLIを習得すればMFCは必要ありませんよね? 以上質問の数が多いですがよろしくお願いします

  • 【VC++】MFC、C++/CLI(CLR)、C#の違い、及び、これからの展望

    いつも大変お世話になっています。 VC++初心者です。 VC++6.0(MFC)、VC++2005(CLR)(C++/CLI)(Express Edition)を 同時期に使い始めて何ヶ月か経ちました。 現在では、CLIの方が圧倒的に開発スピードが早く(扱いやすい)、 逆に、MFCの開発スピードが遅く(扱いにくい)、イライラしっぱなしです。 (CLIの開発では、WEBにあるC#のコードを参考にしながら、  コーディングしています。) そこで、何点か疑問に思ったので、ご回答頂けませんでしょうか。 (1)CLIとC#を区別した理由は何なのでしょうか。 (2)MFCはこれからも使われるのでしょうか。  (MFCで新規開発をすることは、まだまだ大勢なのでしょうか。) (3)VC++2005以降、MFCは有償らしいのですが、  VC++6.0(MFC)とVC++2005(MFC)は何か変わったのでしょうか。  (コーディングしやすくなっていますか?) (4)個人差はあると思いますが、開発スピードが一番早いのは、  CLR、C#、MFCのどれでしょうか。   すぐに返信ができないと思いますが、 宜しければ、ご回答頂けると幸いです。

  • C++/CLIとC#の連携について

    いつも拝見させていただいております。 現在、C++/CLIとC#にて連携を行っているのですが、C++/CLIで作成したクラス配列 がC#側でどのようにすれば受け取れるのか方法がわかりません。 C++/CLIで作成しているクラス配列はSystem::Collections::Generic::Listを使用 して配列化しています。 下記がC++/CLIのソースになります。 List<testClass>^% testClass::GetList() { List<testClass>^ lpTestClassList = gcnew List<testClass>(); testClass^ lpTestClass; lpTestClass = gcnew testClass(); lpTestClassList->Add(lpWatchServiceMasterInfoWrapper); return lpTestClassList; } これをC#側で使用しようとすると下記エラーが発生します。  「この言語によってサポートされていません」 C++/CLI⇒C#間の連携ではListクラスを使用することは不可能なのでしょうか? クラスを配列にして引き渡したいだけなので、他の方法等含めて何か参考になることがありましたら ご教授ください。 よろしくお願い致します。 開発環境  C++/CLI ⇒ DLL(ネイティブなコードを参照するためのラッパー用DLL)  C# ⇒ アプリケーション

  • ? ←これってどうゆう意味ですか?C++MFCです。

    C++のMFCにてカスタムコントロールを作ろうとして いろいろサイトを調べ、コピペで何とか作れたのですが、どうやってるのかよくわからないんです。 特に「?」これ。 void CCstBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CBrush br((lpDrawItemStruct- >itemState&ODS_SELECTED) ? (m_color ? ((m_color&0xfefefe)>>1) : 0x303030) : m_color); FillRect(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,(HBRUSH)br); } ってゆうか、うまくコードが載りませんね? これもなんとかならないんですかね? 話を戻します。 「?」今までのコードではみたことなくて、調べてみてたんですが、検索エンジンで入力すると消えるんですよね。これは困った。 どうゆう意味? ご教授お願いします。 また良いサイトありましたら教えてください。 お願いします。

専門家に質問してみよう