• 締切済み

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コードのデバッグを可能にするチェックをつけてデバッグ実行すると、何故かこの例外は発生せずに、全て正常に動きます。これもなぞです。 よろしくお願いします。

みんなの回答

  • oldman50
  • ベストアンサー率29% (8/27)
回答No.2

http://www.codeproject.com/KB/mcpp/quickcppcli.aspx#A8 が参考になれば幸いです。 5. Make sure you delete the native pointer in the destructor of the managed class. とか。 http://www.amazon.com/Expert-Visual-CLI-Programmers-Experts/dp/1590597567/ref=sr_1_1?ie=UTF8&s=books&qid=1242817008&sr=1-1 の Search inside this book で CHAPTER 10 Wrapping Native Libraries ・・・  Wapping C++ Classes    Mapping C++ Exeptions to Managed Exceptions とかあるのを見ると、「Nativeコードのデバッグを可能にするチェックをつけてデバッグ実行すると、」native側の例外をManaged側の例外として捕捉してくれるのかも(単なる想像ですが・・・)。

noridon
質問者

お礼

すみません、お礼を付け忘れてしまいました。 また何かありましたら、よろしくお願いします。

noridon
質問者

補足

ご回答有難うございます。 教えて頂いたURL見てきました。 デストラクタ内でのNativeの実体の削除は行なっていますが、例外が出ている所がnewですので、どうしたものかと。 それと、本のご紹介も有難うございました。 C++/CLIの本が出ているのですね、知りませんでした。 こちらを読み込めば、何かヒントが見つかるかもしれませんね。

回答No.1

下手にラッパーを作ると、ラッパーの生成時に例外を吐くので、ラッパーを作ってはいけません。 以下のフォーラムを参考にして下さい。 http://vsug.jp/tabid/63/forumid/45/postid/2892/view/topic/Default.aspx

noridon
質問者

お礼

参考になりました。 有難うございました。

noridon
質問者

補足

ご回答有難うございます。 フォーラムの方も見てみたのですが、いまひとつ分りません。 unmanagedのC++ライブラリをDLLにして、P/Invokeで呼び出すという事でしょうか? ちなみに、C++/CLIでラップするという方法は、以下のサイトで知りました。 http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_03.html 現在、C++/CLIでラップするクラス群を作ってしまっていて、C#もその仕様に合わせて作り始めています。 出来れば、ラッパーを上手に作る方法を解説しているサイト等あれば、教えて頂ければ幸いです。