今日は「構造化例外処理」について。 今、VisualStudio2005でマネージコードとアンマネージコードが混在するC++コードを書いたりしてるんですが、ときどき「SEHException」なる例外が発生します。 メモリ違反等(C標準関数の使用を誤りクラッシュetc)が発生した場合にマップされる例外なんですが、コンパイルオプションを間違うとエラーをキャッチしてくれません。 VisualStudioではウィザードを使ってプロジェクトを作るかと思いますが、win32を選択して作成した場合は注意が必要です。 デフォルトで/EHcsが設定されている為、普通のC++例外しか処理してくれない。 CRLを選択して作成した場合は、デフォルトで/EHaが設定されているので構造化例外を処理してくれるんですけど。 構造化例外を処理できないと、メッセージボックスがポップアップしてエラーが表示されちゃいまして、なんとも具合が悪い感じになります。 単体で動作するexeならいざ知らず、サーバで動く連携プログラムだったりするとメッセージボックスがポップアップして別のプログラムの動作を止めちゃったり、、、 しかし、色々な所に後し穴があるもんですな。 経験って大事だわ。
マネージとアンマネージとカオス2
1月 8th, 2010
こんばんは 今回は、マネージなコードをラップしてアンマネージなコードから呼べる様にしてみます。 マネージコードで書いたdllのメソッドを呼び出したりマネージコードを実行するメソッドを持ったラッパーdllを作成します。 ポイントは、ヘッダファイルにマネージ臭を残さない事。(#usingとかusing namespace System;とか) 暗黙的リンクした時にコンパイラさんに激しく怒られます。 アンマネージなコードが呼び出すラッパーdllのメソッドの引数や戻り値にもマネージな型は厳禁です。 インターフェースはアンマネージなコードで書き、マネージ臭のするコードは全てcppファイルに書きます。 [rapper Read More...
アンマネージとマネージとカオス
12月 24th, 2009
こんばんは。 今日はアンマネージな型とマネージな型の間で、値を変換して遣り取りするコードを書いてみた。 今やってる仕事で、アンマネージコードとマネージコードが混合してるソースを書いてるから備忘録のつもりでカキカキと。 簡単な所でstd::string とSystem::Stringをご紹介。 まず、std::stringをSystem::Stringに変換してみる。 こいつは簡単。 System::Stringのコンストラクタに放り込むだけ。 [std::string → System::String] System::System^ func1( std::string str ) { return gcnew System::String( str Read More...
