C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

[VB6→C#] ActiveX?をC#で使用したい

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■103367 / inTopicNo.1)  [VB6→C#] ActiveX?をC#で使用したい
  
□投稿者/ 初瀬 (1回)-(2024/10/16(Wed) 14:06:26)

分類:[C#] 

あるアプリケーションをVB6ベースからC#ベースへ移行しています。
その中で、ActiveX(C++,dll)?を動的に追加しているのですが、その箇所を移行できていません。


// VB6のソースコードの要約

// メインフォームでサブフォームをnewし、SetControlメソッドを呼ぶ
Set subForm = New SubForm
Load subForm
subForm.SetControl

Private WithEvents mActiveObj As VBControlExtender
// SetControlメソッド
mActiveObj = Me.Controls.Add("ProgId", "ControlName")


ToolBoxへの追加およびデザイナを利用した方法、aximpコマンドによるdllの生成および動的な追加等、
いくつか試しましたが、いずれもうまくいっていません。
前者は「'AxHost' を作成できませんでした。」、後者はアクセス違反等が発生してしまいます。
うまくいっているocxやdllもありますので、基本的な使用方法はおさえていると思っています。

フォームを利用していることやVB6のソースコードから勝手にコントロールと思い込んでいたのですが、
ActiveXといってもコントロールだけではなく、コンポーネント?やオートメーションサーバ?というものもあると知りました。
現在はコントロールではない可能性を疑っています。
これらの違いを見分ける方法はありますでしょうか。
また、使用方法がコントロールと異なるのであれば、ご教授いただけると助かります。

よろしくお願いいたします。


環境
Visual Studio 2022
.NET 8.0
C# 12.0
プラットフォームターゲット:x86
引用返信 編集キー/
■103368 / inTopicNo.2)  Re[1]: [VB6→C#] ActiveX?をC#で使用したい
□投稿者/ WebSurfer (2927回)-(2024/10/16(Wed) 14:21:04)
No103367 (初瀬 さん) に返信

> その中で、ActiveX(C++,dll)?を動的に追加しているのですが、その箇所を移行できていません。

その ActiveX が何で、それを使ってどういうことがしたいのかの情報を提供すること
はできますか?
引用返信 編集キー/
■103369 / inTopicNo.3)  Re[2]: [VB6→C#] ActiveX?をC#で使用したい
□投稿者/ 初瀬 (3回)-(2024/10/16(Wed) 15:14:42)
No103368 (WebSurfer さん) に返信

> その ActiveX が何で、それを使ってどういうことがしたいのかの情報を提供すること
> はできますか?

公に配布されているわけではないカスタムなものです。
メインフォームのあるボタンを押すと、そのとき選択していたデータが持っているであろう時系列データがグラフとなり、
表示間隔を変えたりマーカを設置したりできる画面が表示されますが、
そのActiveX?がAddされるサブフォームではそれらのコントロールを扱っていなさそうなことや、
mActiveObjに対する指令が多いことから、そのActiveX?がそれらの機能を担っていると思っています。
それをWinFormsでも利用したい次第です。
引用返信 編集キー/
■103370 / inTopicNo.4)  Re[3]: [VB6→C#] ActiveX?をC#で使用したい
□投稿者/ kiku (443回)-(2024/10/16(Wed) 16:09:44)
No103369 (初瀬 さん) に返信
> ■No103368 (WebSurfer さん) に返信
> 
> 公に配布されているわけではないカスタムなものです。

このカスタムなものについてです。

自社で開発しているものでしょうか?
  自社で開発していればソースもあると思いますので
  どんな実装になっているか確認した方が良いです。
  例えば、カスタムなものの内容がVB6のコントロールを使っているのであれば
  このカスタムなものも移行開発する必要があるかもしれません。
それとも、別会社で開発しているものでしょうか?
  別会社で開発していて、ソースを所持していなければ、
  その会社に問い合わせる必要があるのではないでしょうか?
  最新環境で動作する.NET8用のものがすでにリリースされているかもしれません。

引用返信 編集キー/
■103371 / inTopicNo.5)  Re[4]: [VB6→C#] ActiveX?をC#で使用したい
□投稿者/ 初瀬 (4回)-(2024/10/16(Wed) 17:30:51)
No103370 (kiku さん) に返信

> このカスタムなものについてです。
>
> 自社で開発しているものでしょうか?
>   自社で開発していればソースもあると思いますので
>   どんな実装になっているか確認した方が良いです。
>   例えば、カスタムなものの内容がVB6のコントロールを使っているのであれば
>   このカスタムなものも移行開発する必要があるかもしれません。
> それとも、別会社で開発しているものでしょうか?
>   別会社で開発していて、ソースを所持していなければ、
>   その会社に問い合わせる必要があるのではないでしょうか?
>   最新環境で動作する.NET8用のものがすでにリリースされているかもしれません。

準委任として取り組んでいます。
ソースは見つけましたが、色々と足りていないためかコンパイルは通せていません。
開発元が依頼元なのか、また別の会社なのかは未確認です。
それ自体はC++で書かれていますが、VB6で書かれているocxを呼んではいます。
移行元の外側のVB6同様、ずっと使い続けているものであるため、最新環境で動作するものはリリースされていないはずです。

そのカスタムなdllは数万行ありますが、当方はActiveXはおろか、VC++やC++も未経験であり、
ActiveXに関しては情報も少ないため、、できればそのまま利用したい次第です。
そのままは利用できないとしても、その理由を明確にした上で、どこまでを移行対象とするかを考えたいと思っています。
引用返信 編集キー/
■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 した方が手っ取り早い
引用返信 編集キー/
■103373 / inTopicNo.7)  Re[2]: [VB6→C#] ActiveX?をC#で使用したい
□投稿者/ 初瀬 (5回)-(2024/10/16(Wed) 19:24:17)
> (1) VB6 製の ocx/dll を、C# 製の COM DLL に置き換えたいのでしょうか。(画面は VB6 のまま)
> (2) ActiveX コントロールはそのままで、Windows Forms 部を VB6 から C# に置き換えたいのでしょうか。
> (3) あるいは、Form とコントロールの両方を C# 製にしたいのでしょうか。

(2)です。
(そのまま利用できれば、)ActiveXコントロールはそのままとしたいです。
ちなみに、そのActiveXコントロールはC++で書かれたdllです。
そのまま利用できなければ、(3)になると思っています。

> CLR1 世代なら、月刊dotNETマガジン誌(2003/11〜2004/04)に、こんな記事がありましたが(C# ではなく MFC)。

ありがとうございます。
目を通してみます。

> 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 コントロール インポーター)でも作られます。

これらも試したのですが、うまくいきませんでした。
色々と試した結果、本当にコントロールなのだろうか?と思った次第です。

> 妙ですね? VB6 だったら、Set ステートメントが必要なはずですし、
> .NET だったら、構文が違っています(2 つの String ではなく、1 つの Control を Add する)。

すみません。
Setが抜けていました。
正しくは下記ですね。
Set mActiveObj = Me.Controls.Add("ProgId", "ControlName")

> VB6 の時に、CreateObject か New で生成していたのなら、ActiveX DLL か ActiveX EXE だと思いますが、
> もしも VB6 で Controls.Add 追加しているなら、それは ActiveX DLL ではなく、ActiveX コントロールです。

やはりActiveXコントロールなのですね。

ToolBoxへの追加およびデザイナを利用した方法、aximpコマンドによるdllの生成および動的な追加等、
いくつか試しましたが、いずれもうまくいっていないのですが、
ソースコードにラッパーが対応できない要因がある、ということになりそうでしょうか。

いくつか見つけた気になっている点としては、
動的に追加しようとすると、new()はできるのですが、
デバッガでプロパティを確認すると、「例外をスローしました」と表示されているものがあり(表示されているだけで落ちはしない)、
おそらくEnabledプロパティを確認すると、例外で落ちます(アクセス違反)。

また、ActiveXコントロールを追加する土台のフォームをShow()してControls.Add()するとアクセス違反、
Show()せずControls.Add()すると(VB6のLoadステートメントに倣い、読込はするが表示はしない、を模倣したつもりです)、
アクセス違反は発生しないが、その後にプロパティにアクセスしようとすると例外、
AxHostクラスの_instanceがnullのようでした。

本ActiveXコントロールはそのまま利用できないことが明らかになれば、きっぱりとその方向で進められるのですが、
使用方法の問題なのかどうかを切り分けられない状態です。。
引用返信 編集キー/
■103374 / inTopicNo.8)  Re[5]: [VB6→C#] ActiveX?をC#で使用したい
□投稿者/ 魔界の仮面弁士 (3802回)-(2024/10/16(Wed) 19:24:21)
No103367 (初瀬 さん) に返信
> 環境
> Visual Studio 2022
> .NET 8.0
> C# 12.0
> プラットフォームターゲット:x86

ActiveX コントロールを C# で作るとなると面倒ですが、
https://web.archive.org/web/20070808070108/http://www.sev.or.jp/ijupiter/world/dc_interrop/dotnet_com_interrop.html
今回は VB6 (あるいは C++ 製?)の ActiveX コントロールを C# から使うという話なのですね。


既存の ActiveX コントロールを C# から使うためには、
ツールボックスに入れて、フォームに貼って使うという流れになります。


ここで問題となりそうなのは、Visual Studio 2022 の開発環境が「64bit アプリケーション」である点です。

VB6 製の ocx は 32bit 版であるため、開発環境のサポートを受けるために
Visual Studio 2019 にダウングレードする必要があるかもしれません。
https://learn.microsoft.com/ja-jp/visualstudio/ide/visual-studio-ide-64-bit-support?view=vs-2022
https://developercommunity.visualstudio.com/t/cant-register-ocx-in-vs2022/1652703

ただし、VS2019 では .NET 6.0 以降をターゲットにすることはサポートされていません。
この問題をどう考えるべきか、依頼元に相談してみてください。
https://learn.microsoft.com/ja-jp/dotnet/core/tools/sdk-errors/netsdk1182

.NET 6 は来月12日にサポートを終了しますので、VB6 製の ocx を継続利用するのなら、
.NET Framework ベースの開発の方が、サポートサイクル的には長く使えると思います。

ちなみに .NET 8 のサポート期限は 2026/11/10 です。
.NET Framework 4.7.2 は 2029/01/08 まで。
.NET Framework 4.8 / 4.8.1 は、搭載している OS のサポート期限まで(Windows Server 2022 なら 2031/10/14 まで)。


No103371 (初瀬 さん) に返信
> ソースは見つけましたが、色々と足りていないためかコンパイルは通せていません。
依存ライブラリの関係性も調査しておいた方が良いかもしれません。「動的生成」の場合は特に。

その DLL/OCX が、別のライブラリを参照していた場合、
依存ファイルの再頒布に制限がかけられていることもあります。
(コントロールのみを単体配布することが許可されておらず、特定の条件が設けられているなど)
https://www.petitmonte.com/bbs/answers?question_id=15218

VB6 で使われる標準的なライブラリの場合、依存情報は *.dep ファイルで示されます。
累積更新プログラムにも含まれていますね。
https://support.microsoft.com/ja-jp/topic/visual-basic-6-0-service-pack-6-runtime-extended-files-%E7%94%A8%E3%81%AE%E7%B4%AF%E7%A9%8D%E7%9A%84%E3%81%AA%E6%9B%B4%E6%96%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-e02acc79-217b-fc0a-6edc-540403af2081


> それ自体はC++で書かれていますが、VB6で書かれているocxを呼んではいます。
> 移行元の外側のVB6同様、ずっと使い続けているものであるため、最新環境で動作するものはリリースされていないはずです。
その VB6 製 ocx が「標準コントロール」だけで構成されたものであれば良いですが、
その VB6 製 ocx が「ActiveX コントロール」を利用して作られたものである場合、
依存コントロールの再頒布条件は、EULA.TXT および REDIST.TXT に準じます。
引用返信 編集キー/
■103378 / inTopicNo.9)  Re[1]: [VB6→C#] ActiveX?をC#で使用したい
□投稿者/ KOZ (475回)-(2024/10/17(Thu) 02:09:04)
No103367 (初瀬 さん) に返信

この掲示板はマルチポスト禁止ではないですが、元の URL は張っておいたほうが良いです。
https://teratail.com/questions/hvi25c262l2puo
引用返信 編集キー/
■103379 / inTopicNo.10)  Re[6]: [VB6→C#] ActiveX?をC#で使用したい
□投稿者/ 魔界の仮面弁士 (3803回)-(2024/10/17(Thu) 07:14:01)
No103374 (魔界の仮面弁士) に追記
> ここで問題となりそうなのは、Visual Studio 2022 の開発環境が「64bit アプリケーション」である点です。
> VB6 製の ocx は 32bit 版であるため、開発環境のサポートを受けるために
> Visual Studio 2019 にダウングレードする必要があるかもしれません。
> https://learn.microsoft.com/ja-jp/visualstudio/ide/visual-studio-ide-64-bit-support?view=vs-2022
> https://developercommunity.visualstudio.com/t/cant-register-ocx-in-vs2022/1652703

Visual Studio 2022 の v17.9 からの新機能として、32bit ocx をサポートするための
プレビュー実装が追加されています。
https://devblogs.microsoft.com/visualstudio/winforms-designer-selection-for-32-bit-net-framework-projects/

オプション設定の [プレビュー機能] の中に
 ・.NET アプリのプレビュー版 Windows Forms アウトプロセスデザイナーを使用する
 ・Windows フォーム .NET Framework プロジェクトの 32 ビット アセンブリ読み込みエラーを検出する
があります。

VS2022 が 64bit アプリであるため、通常のインプロセスデザイナーの代わりに、
Wow64 動作の 32bit アウトプロセスデザイナーを利用するオプションです。


今回のパターン(.NET 8 + 32bit ocx)に対して有効であるかは分かりませんが。
引用返信 編集キー/
■103380 / inTopicNo.11)  Re[2]: [VB6→C#] ActiveX?をC#で使用したい
□投稿者/ 初瀬 (6回)-(2024/10/17(Thu) 09:10:20)
No103378 (KOZ さん) に返信

> この掲示板はマルチポスト禁止ではないですが、元の URL は張っておいたほうが良いです。
> https://teratail.com/questions/hvi25c262l2puo

すみません。
少し質問の意図を変更したつもりだったのですが、同じような流れになってしまいました。
最初に提示しておけばよかったと反省しています。
以後、気をつけます。
引用返信 編集キー/
■103385 / inTopicNo.12)  Re[6]: [VB6→C#] ActiveX?をC#で使用したい
□投稿者/ 初瀬 (7回)-(2024/10/17(Thu) 11:09:29)
No103374 (魔界の仮面弁士 さん) に返信

> VS2022 が 64bit アプリであるため、通常のインプロセスデザイナーの代わりに、
> Wow64 動作の 32bit アウトプロセスデザイナーを利用するオプションです。

https://learn.microsoft.com/ja-jp/dotnet/desktop/winforms/visualstudio/troubleshoot-32bit?view=netdesktop-8.0&viewFallbackFrom=netframeworkdesktop-4.8
.NET 8.0以降はアウトプロセスデザイナーを使用しているようです。
.NET Frameworkでもプロジェクトファイルを編集すれば有効になることを確認できました。
ただ、動的な追加でもうまくいっていないため、別の問題ではないかと思っています。

> 依存ライブラリの関係性も調査しておいた方が良いかもしれません。「動的生成」の場合は特に。

問題となっているdllについては、
dumpbin /dependentsやDependency Walkerを使用したり、
VB6ベースのアプリケーションが動作する仮想マシンの環境変数を確認したり、
私なりには調査したつもりなのですが、うまくいっていません。。


再頒布の件は知りませんでした。
確認しておきます。
ただ、そもそもそのまま利用できるかどうか怪しいですね。。


色々と調査したつもりですが、少なくとも情報提供できそうな範囲での解決はやはり手強そうですね。
依頼元にその旨を伝えようと思います。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ