
お世話になります。
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コードのデバッグを可能にするチェックをつけてデバッグ実行すると、何故かこの例外は発生せずに、全て正常に動きます。これもなぞです。
よろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
が参考になれば幸いです。
5. Make sure you delete the native pointer in the destructor of the managed class.
とか。
http://www.amazon.com/Expert-Visual-CLI-Programm …
の Search inside this book で
CHAPTER 10 Wrapping Native Libraries
・・・
Wapping C++ Classes
Mapping C++ Exeptions to Managed Exceptions
とかあるのを見ると、「Nativeコードのデバッグを可能にするチェックをつけてデバッグ実行すると、」native側の例外をManaged側の例外として捕捉してくれるのかも(単なる想像ですが・・・)。
この回答への補足
ご回答有難うございます。
教えて頂いたURL見てきました。
デストラクタ内でのNativeの実体の削除は行なっていますが、例外が出ている所がnewですので、どうしたものかと。
それと、本のご紹介も有難うございました。
C++/CLIの本が出ているのですね、知りませんでした。
こちらを読み込めば、何かヒントが見つかるかもしれませんね。
No.1
- 回答日時:
下手にラッパーを作ると、ラッパーの生成時に例外を吐くので、ラッパーを作ってはいけません。
以下のフォーラムを参考にして下さい。
http://vsug.jp/tabid/63/forumid/45/postid/2892/v …
この回答への補足
ご回答有難うございます。
フォーラムの方も見てみたのですが、いまひとつ分りません。
unmanagedのC++ライブラリをDLLにして、P/Invokeで呼び出すという事でしょうか?
ちなみに、C++/CLIでラップするという方法は、以下のサイトで知りました。
http://www.atmarkit.co.jp/fdotnet/special/vcppin …
現在、C++/CLIでラップするクラス群を作ってしまっていて、C#もその仕様に合わせて作り始めています。
出来れば、ラッパーを上手に作る方法を解説しているサイト等あれば、教えて頂ければ幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Replace関数について教えて...
-
CSSが全く分かりません、お助け...
-
DLLファイルの逆コンパイラにつ...
-
バッチファイルで以下のような...
-
CPUが16bitでも32bitOSでコンパ...
-
gccを行ってもexeファイルが生...
-
c言語
-
VisualStudio2022でC言語プログ...
-
Windows Formアプリからコンソ...
-
visual studio 2022でのC#プロ...
-
C言語の関数のextern宣言
-
プログラマー達は何故、プログ...
-
PIC12F1822でLED調光器を作りたい
-
最初に聞かれたこと
-
C言語 関数、変数の宣言について
-
C言語について(初心者)
-
プログラミングc++を全く分か...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
DNCL(共テ用プログラミング言語...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがない?
-
FriendとPublicの違い。。。
-
(UWSC) 「#32770」の意味わかり...
-
ダイアログ表示時にチェックボ...
-
イベントにAddHandlerされてい...
-
エディットコントロールでEnter...
-
オーバーライド関数の呼び出し...
-
このコンパイルエラーの意味に...
-
【ASP.NET】 独自で作成したク...
-
MFC モードレスDlgについて
-
[MFC] CWnd::MessageBoxの警告...
-
ボタンのオーナードローについて
-
MessageBoxを継承したい
-
ダイアログクラスのコントロー...
-
vba sendKeysを送る相手のソフ...
-
エディットコントロールのイベ...
-
Delphi6 DLL内でのメモリ共有(?)
-
個々の関数について継承してい...
-
privateなメンバ関数をテストす...
-
WindowsAPIのリストビューの...
おすすめ情報