■103372 / inTopicNo.6) |
Re[1]: [VB6→C#] ActiveX?をC#で使用したい |
□投稿者/ 魔界の仮面弁士 (3801回)-(2024/10/16(Wed) 17:35:13)
|
■No103367 (初瀬 さん) に返信 > あるアプリケーションをVB6ベースからC#ベースへ移行しています。 > その中で、ActiveX(C++,dll)?を動的に追加しているのですが、その箇所を移行できていません。
(1) VB6 製の ocx/dll を、C# 製の COM DLL に置き換えたいのでしょうか。(画面は VB6 のまま) (2) ActiveX コントロールはそのままで、Windows Forms 部を VB6 から C# に置き換えたいのでしょうか。 (3) あるいは、Form とコントロールの両方を C# 製にしたいのでしょうか。
3 だとしたら、そもそも COM 化する必要はなく、.NET Managed で良いような気がします。
1 のチュートリアルは最近見ないですね。どこかに資料あったかな…。 CLR1 世代なら、月刊dotNETマガジン誌(2003/11〜2004/04)に、こんな記事がありましたが(C# ではなく MFC)。 http://www.comrade.co.jp/component/dotnetroom/index.htm
2 については、ActiveX コントロールを .NET から使う場合、 ・System.Windows.Forms.Controls.AxHost 継承のコントロール ・COM 用の CLR ランタイムのプロキシ の 2 つが要求されます。たとえば Comctl32.ocx を .NET から使う場合、 AxInterop.Comctl32.dll Interop.Comctl32.dll という 2 つのアセンブリが使われます(PIA のある一部のライブラリでは、単一ファイルになることもあり)。
これらのアセンブリは Visual Studio で参照設定すると自動生成され、コマンドライン生成なら Aximp.exe (Windows フォーム ActiveX コントロール インポーター)でも作られます。
> Private WithEvents mActiveObj As VBControlExtender > // SetControlメソッド > mActiveObj = Me.Controls.Add("ProgId", "ControlName")
妙ですね? VB6 だったら、Set ステートメントが必要なはずですし、 .NET だったら、構文が違っています(2 つの String ではなく、1 つの Control を Add する)。
> フォームを利用していることやVB6のソースコードから勝手にコントロールと思い込んでいたのですが、 > ActiveXといってもコントロールだけではなく、コンポーネント?やオートメーションサーバ?というものもあると知りました。 > 現在はコントロールではない可能性を疑っています。
VB6 の時に、CreateObject か New で生成していたのなら、ActiveX DLL か ActiveX EXE だと思いますが、 もしも VB6 で Controls.Add 追加しているなら、それは ActiveX DLL ではなく、ActiveX コントロールです。
コントロールとして動的追加する場合は、 実行時(ランタイム)ライセンスだけではなく 開発時(デザインタイム)ライセンスが必要な場合があり、 VB6 では、Controls.Add の直前に Licenses.Add strProgId, strLicenseKey の呼び出しが要求されることがあります。ライセンス不要の場合は無問題。
※ライセンス管理が面倒な場合は、VB6 ではコントロール配列にして Load した方が手っ取り早い
|
|