none
C++/CLIでアンマネージC++クラスの実体をnewすると例外発生 RRS feed

  • 質問

  • はじめまして。
    今、動画編集アプリを作成中です。
    VisualStudio2008にて、アプリ本体をC#で書き、アンマネージC++でDirectShowを操作するためにクラスライブラリを作り、その間を取り持つ部分(ラッパー)をC++/CLIで書いています。

    C#プロジェクトのデバッグオプションで「アンマネージコードデバッグを有効」にチェックをつけて作業を続けたので気づかなかったのですが、このチェックを外して起動すると、C++/CLI部分でアンマネージのクラスの実体をnewで作成する時に例外が発生してしまう事がわかりました。

    例外は、以下の様なものです。
    System.Runtime.InteropServices.SEHException はハンドルされませんでした。
      Message="外部コンポーネントが例外をスローしました。"
      Source="ManMovLib"
      ErrorCode=-2147467259(0x80004005)
      StackTrace:
           場所 new(UInt32 )
    

    クラスのコードは以下の様な感じになっています。

    C++/CLIのコード
    
    AVSource::AVSource(void)
    {
    	m_pObj = new CAVSource;
    }
    
    これによって作られるアンマネージクラスのコンストラクタは以下の様に、何もしてません。
    
    CAVSource::CAVSource(void)
    {
    }

    最初はDirectShow(COM)を操作している部分が原因かと思い、上記のようにアンマネージ側で一切何もしない様に書き換えてみたのですが、それでも状況は変わりませんでした。
    またアンマネージコードのデバッグを有効にすると、この例外も発生しなくなるため、デバッガで追いかける事も出来ません。

    ここ数日色々と調べ、試行錯誤をしたのですが、解決方法が見つからず、質問させて頂く次第です。

    この例外を何が原因で起こるのでしょうか?
    回避する方法はありますでしょうか?
    特別、C++/CLIからアンマネージを呼び出す場合に注意しなければいけない点があるのでしょうか?

    以上、お分かりになる方がいらっしゃれば、お知恵をお貸し頂ければ幸いです。
    よろしくお願いします。

    2009年5月21日 5:55

回答

  • この例外を何が原因で起こるのでしょうか?
    回避する方法はありますでしょうか?
    特別、C++/CLIからアンマネージを呼び出す場合に注意しなければいけない点があるのでしょうか?
    0x80004005はE_FAIL、よく分からないエラーを指しています。
    残念ながら、この現象・エラコードだからこれだと原因を特定できるほどの有用な情報ではありません。

    通常、ネイティブのクラスをnewするのは特に問題なくできるはずです。
    今回、できないと言うことは、何かそのコード特有の問題があるのかもしれません。

    CAVSourceクラスに基底クラスはないんですよね?
    CAVSourceクラスのメンバーにクラスのインスタンスは持っていないんですよね?
    (ポインタでなく、実体を持つ形であれば、コンストラクタが空であっても、処理は行われる)
    今のDLLとは完全に分離して、テスト用のDLLでも再現しますか?

    色々と可能性を疑い、原因になりそうなものを削って再現するかを見て、本当の原因を絞り込むことが必要でしょう。



    ところで、マルチポストでしょうか?
    解決することができた際にはそれぞれのサイトにその情報をフィードバックしていきましょう。
    http://oshiete1.watch.impress.co.jp/qa4972344.html 
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク sk7474 2009年5月28日 7:50
    2009年5月21日 15:22
    モデレータ

すべての返信

  • この例外を何が原因で起こるのでしょうか?
    回避する方法はありますでしょうか?
    特別、C++/CLIからアンマネージを呼び出す場合に注意しなければいけない点があるのでしょうか?
    0x80004005はE_FAIL、よく分からないエラーを指しています。
    残念ながら、この現象・エラコードだからこれだと原因を特定できるほどの有用な情報ではありません。

    通常、ネイティブのクラスをnewするのは特に問題なくできるはずです。
    今回、できないと言うことは、何かそのコード特有の問題があるのかもしれません。

    CAVSourceクラスに基底クラスはないんですよね?
    CAVSourceクラスのメンバーにクラスのインスタンスは持っていないんですよね?
    (ポインタでなく、実体を持つ形であれば、コンストラクタが空であっても、処理は行われる)
    今のDLLとは完全に分離して、テスト用のDLLでも再現しますか?

    色々と可能性を疑い、原因になりそうなものを削って再現するかを見て、本当の原因を絞り込むことが必要でしょう。



    ところで、マルチポストでしょうか?
    解決することができた際にはそれぞれのサイトにその情報をフィードバックしていきましょう。
    http://oshiete1.watch.impress.co.jp/qa4972344.html 
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク sk7474 2009年5月28日 7:50
    2009年5月21日 15:22
    モデレータ
  • こんにちは。中川俊輔です。

    Azuleanさん、回答ありがとうございます。

    noridonさん、はじめまして。フォーラムのご利用ありがとうございます。
    その後いかがでしょうか?疑問は解決しましたか?

    有用な情報と思われたため、勝手ながらAzuleanさんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年5月28日 7:54