ActiveXをC#のプロジェクトで使う

従来のシステムをC#に移行する要求が出てきた。
これは、今まで使用していた、とあるツールキットのサポートがだいぶ前に打ち切られ、何年か惰性で使ってきてはいたが、ここのところ、ツールキットに起因する問題が出始めたため、乗り換えを余儀なくされそうなためだ。
新しいツールキットの第1候補は、C#版であるため、ツールキット以外の部分が、C#に乗り換え可能かどうかが争点となる。
とりあえず、試してみて、うまくいきそうだという感触は得ることが出来た。

C#にアクティブXを導入するのは簡単だ。
フォームデザイナで表示される、ツールボックスで、右クリックし、「アイテムの追加と削除」を選択する。
表示されたダイアログで、目的のActiveXコントロールにチェックを入れ、「OK」。
ツールボックスに表示されるので、それを配置するだけだ。

ActiveXのラッパは、.NET環境に元々用意されているらしく、C#からActiveXコントロールへ、今までと変わらない形で、アクセスすることが出来るようになった。
エラー処理が、今までと変わっているようで、C++で、関数の戻り値の HRESULT を調べてエラー分岐するところで、C#のラッパは、失敗時に例外を投げてくるようである。
標準の System.Exception か、System.Runtime.InteropServices.ExternalException にてキャッチが可能だ。


private void OnLoad(object sender, System.EventArgs e)
{
  try
  {
    toolkit1.Initialize(0);
  }
  catch(System.Runtime.InteropServices.ExternalException exc)
  {
    System.Diagnostics.Debug.WriteLine(exc.ErrorCode, "ErrorCode(HRESULT)");
  }
}



多少面倒くさいところと、namespaceが長すぎるところが .NET のやなところではあるが、こればっかりは、既存なのでしょうがない。
using 句を使用することで省略も出来るが、よけいにクラスの所在が分からなくなったり、後から新しい namespace を入れると、修正しなければいけなくなったりと、困難が予想される。

あと、Cコード(dll)をラップするC++のクラスライブラリも使用していて、こっちの方が問題かも知れない。
C++のコードそのままだと、全く持って、.NET環境から使用するすべがないんじゃないでしょうか。
そうなると、ATLコントロールとかにラップして、.NETのCOMラッパでラップして、、、
Cコードを使用するために、C++/ATL/COMラッパで3重にラップすることになってしまう。
う~ん、効率悪そ、、、

何か良い解決策はないものか。

一応、C#でActiveXコントロールを使用する目星は立ったが、MFCのDocument/Viewばりばりで書かれた既存アプリを、現行のC#での.NETに移行するのは、多少無理がありそうな気がする。。。
C#って、凝ったフレームワークって提供してませんよね??
いったい、どうしたら良いのか、、、、
[PR]
by isoq | 2004-11-17 10:13 | Web
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< memcpy関数のC#版 ジュニアシート >>