実現したいこと
あるアプリケーションをVB6ベースからC#ベースへ移行しています。
その中で、C++ベースのActiveXコントロールを追加する必要があるのですが、アクセス違反が発生してしまいます。
発生している問題・分からないこと
- 一つ目
aximpコマンドで生成したAx*.dllを参照に追加し、Loadイベントでnew()およびthis.Controls.Add()すると、this.Controls.Add()の箇所で下記が発生してしまいます。
0xC0000005: 場所 0x0CBF10DC の実行中にアクセス違反が発生しました
気になっている点の一つとして、new()の後、this.Controls.Add()の前に当該インスタンスの中身を確認すると、Enabledプロパティの箇所で下記が発生してしまいます。
'VS2022NET80ActiveX.exe' (Win32): 'C:\Windows\SysWOW64\sxs.dll' が読み込まれました。
0x031F8D28 で例外がスローされました (VS2022NET80ActiveX.exe 内): 0xC0000005: 場所 0x031F8D28 の実行中にアクセス違反が発生しました
共通言語ランタイムは、この例外で停止できません。一般的な原因は、正しくない COM 相互運用機能のマーシャリングやメモリの破損などです。さらに調べるには、ネイティブのみのデバッグを使用します。
プログラム '[11632] VS2022NET80ActiveX.exe' はコード 3221225477 (0xc0000005) 'Access violation' で終了しました。
Enabledプロパティを確認する前、例えば、下記のようなプロパティでも「例外をスローしました」と表示されている状況です。
-
AssertTime 'this._axNetMTrend.AssertTime' は型 'System.Windows.Forms.AxHost.InvalidActiveXStateException' の例外をスローしました System.DateTime {System.Windows.Forms.AxHost.InvalidActiveXStateException}
-
CallUpID 'this._axNetMTrend.CallUpID' は型 'System.Windows.Forms.AxHost.InvalidActiveXStateException' の例外をスローしました string {System.Windows.Forms.AxHost.InvalidActiveXStateException}
-
CtlEnabled 'this._axNetMTrend.CtlEnabled' は型 'System.Windows.Forms.AxHost.InvalidActiveXStateException' の例外をスローしました bool {System.Windows.Forms.AxHost.InvalidActiveXStateException}
そのとき、当該インスタンスの親のthisの中身を確認すると、例えば、下記のようなプロパティでも「例外をスローしました」と表示されている状況です。
-
ActiveXAmbientBackColor 'this.ActiveXAmbientBackColor' は型 'System.NotSupportedException' の例外をスローしました System.Drawing.Color {System.NotSupportedException}
-
ActiveXAmbientFont 'this.ActiveXAmbientFont' は型 'System.NotSupportedException' の例外をスローしました System.Drawing.Font {System.NotSupportedException}
- 二つ目
アイテムの選択でActiveXコントロールをツールボックスに追加し、フォームにD&Dすると、下記が発生してしまいます。
- コンポーネント 'AxHost' を作成できませんでした。エラーメッセージ: 'サーバーへの接続が失われました。'
- コンポーネント 'AxHost' を作成できませんでした。エラーメッセージ: 'Microsoft.DotNet.DesignTools.Client.DesignToolsServerException:ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。(0x8007045A)
このとき、Visual Studioのメニューのツール-オプション-Windowsフォームデザイナー-全般-ログ記録レベルをVerboseにし、出力ウィンドウを確認してみました。
ドロップ前の抜粋(createはできている?)
[11:39:16.903232] trce: Attempting to create ActiveX ToolboxItem for {GUID(念のため省略)}.
[11:39:16.903232] trce: Sending request: ActiveX/IsControlSupported
[11:39:16.918870] trce: ActiveX/IsControlSupported took 00:00:00.0016753.
[11:39:16.918870] trce: Sending request: ActiveX/GetControlVersionString
[11:39:16.918870] trce: ActiveX/GetControlVersionString took 00:00:00.0020398.
[11:39:16.922386] trce: ActiveX ToolboxItem successfully created for {GUID(念のため省略)}.
[11:39:16.922386] trce: Sending request: Input/InputMessage
[11:39:16.922386] trce: Input/InputMessage took 00:00:00.0019627.
ドロップ後の抜粋
[11:40:03.392478] trce: Attempting to create ActiveX ToolboxItem for {GUID(念のため省略)}.
[11:40:03.392478] trce: Sending request: ActiveX/IsControlSupported
[11:40:03.392478] trce: ActiveX/IsControlSupported took 00:00:00.0011153.
[11:40:03.392478] trce: Sending request: ActiveX/GetControlVersionString
[11:40:03.392478] trce: ActiveX/GetControlVersionString took 00:00:00.0010825.
[11:40:03.392478] trce: ActiveX ToolboxItem successfully created for {GUID(念のため省略)}.
[11:40:03.392478] trce: Sending request: Transactions/Open
[11:40:03.392478] trce: Transactions/Open took 00:00:00.0013603.
[11:40:03.392478] trce: Notifying 1 'Undo/UndoUnitCreated' handlers
[11:40:03.392478] trce: 'Undo/UndoUnitCreated' notification received: ツール 'AxHost' でコンポーネントを作成しています。.5bf92b0d-fb14-4256-a04b-bbecadc30608
[11:40:03.392478] trce: Notifying 1 'Transactions/TransactionOpening' handlers
[11:40:03.392478] trce: Notifying 1 'Transactions/TransactionOpened' handlers
[11:40:03.392478] trce: Sending request: Types/FindTypeUsingClsid
[11:40:03.392478] trce: Types/FindTypeUsingClsid took 00:00:00.0010848.
[11:40:03.392478] trce: Sending request: DesignerHosts/CreateComponent
[11:40:10.323256] trce: DesignerHosts/CreateComponent took 00:00:06.9258470.
[11:40:10.323256] fail: Request failures: DesignerHosts/CreateComponent.
Microsoft.DotNet.DesignTools.Client.DesignToolsServerException: ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。 (0x8007045A)
※ツールボックスへの追加はできているのですが、フォームへの追加はできていない状況です。
試したこと・調べたこと
当該ActiveXコントロール(C++ベースの.dll)から呼び出していると思われる別のActiveXコントロール(VB6ベースの.ocx)については、一つ目の方法でも二つ目の方法でも追加できているようですので、当該ActiveXコントロール特有の問題と考えています。
移行元のVB6のソースコードは素直です。
したがって、ラッパ等の意識していない箇所が、VB6の場合はよしなに対応していた可能性も考えています。
VB6のソースコードを要約したもの
1Private WithEvents control As VBControlExtender 2Set control = Me.Controls.Add("foo.bar", "baz")
なぜか例外のトリガとなるEnabledプロパティはVARIANT_BOOL型を扱っているため少し気にはなりますが、ドキュメントによるとSystem.Booleanにマーシャリングされるようですので、その点については問題ないと考えています。
強いて言えば、プロパティを設定する順番に依存性があると今回のようなことになりうるだろうか?とは思ったりしています。
補足
開発環境
Visual Studio 2022
.NET 8.0
C# 12.0
プラットフォームターゲット:x86
当該ActiveXコントロールは32bit版であり、32bit版のregsvr32コマンドで登録しています。
当該ActiveXコントロールを再コンパイルしようと思いましたが、多くのエラーが発生します。
行数も数万行あり、this.Controls.Add()の箇所で例外が発生しているとなるとどこから確認すれば良いのかも分からず、少しでも原因を絞りたい次第です。
少しでも何か気づいたことがあれば、ご教授いただけると助かります。
よろしくお願いいたします。