質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

ActiveX

ActiveXは、Microsoft社が開発したプログラミング技術群の総称。特定の技術ではなく、さまざまな技術を指しますが、一般的にActiveXといった場合は「ActiveXコントロール」を指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

920閲覧

C# C++ActiveXコントロール追加時のアクセス違反について

OhaseO

総合スコア3

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

ActiveX

ActiveXは、Microsoft社が開発したプログラミング技術群の総称。特定の技術ではなく、さまざまな技術を指しますが、一般的にActiveXといった場合は「ActiveXコントロール」を指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

2クリップ

投稿2024/09/26 06:36

編集2024/10/04 04:03

実現したいこと

あるアプリケーションを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()の箇所で例外が発生しているとなるとどこから確認すれば良いのかも分からず、少しでも原因を絞りたい次第です。

少しでも何か気づいたことがあれば、ご教授いただけると助かります。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2024/09/26 10:06 編集

古い記事/Q&Aですが、参考になるかもしれません。 https://atmarkit.itmedia.co.jp/bbs/phpBB/viewtopic.php?topic=30569&forum=7 お使いのC++(MFCかATLですよね? Visual C++6.0で作られたものでしょうか)のActiveXコントロールがもともとVB6のフォームに貼り付けて使うのが前提だとすると、同じような事象にも思えます。 Visual Studio 2022は.NET関連のフォームデザイナーも64ビットのはずなので試しにコントロールの貼り付けもできませんが、32ビット版であるVisual Studio(Visual Studio 2019?)でフォームに貼り付けて試してみると正常に動くかもしれず、問題の切り分けができる可能性があります。 ※手間がかかるでしょうし、他に有用なコメントや回答をいただけるかもしれないので積極的にお勧めはしませんが。
OhaseO

2024/09/26 10:47

コメントありがとうございます。 たしかに、そのままでは使用できない可能性も考えられますね。。 VB6前提かどうかを判断する術は分かりますでしょうか。 Visual Studio2019でも同様でした。 Visual Studio2022でも.NETを選択している場合は、32bit版のコントロールの貼り付けも問題なさそうです。
dodox86

2024/09/26 11:08

> Visual Studio2019でも同様でした。 > Visual Studio2022でも.NETを選択している場合は、32bit版のコントロールの貼り付けも問題なさそうです。 そうだったのですね。 > VB6前提かどうかを判断する術は分かりますでしょうか。 拡張子が*.ocxならそういう使い方をすることが多いActiveXコントロールだと思います。 VB6前提、と言いますか、昔は一般的にVB6のフォームにツールボックスから*.ocxのコントロールを貼り付けるような操作があり、VB6でなくてもC++(MFC)のプロジェクトでダイアログボックスにツールボックスから貼り付けて使うようなこともあったと思います。それができるのであれば貼り付け前提のようなコントロールと言えます。参考に挙げたQ&A記事中に書かれていますが、ツールボックスから貼り付けて動くのであれば、貼り付けの為にVisual Studioが自動生成したソースコードを見ると貼り付けて使用する為のコードが追加されているはずなので、それが解決への糸口になるかもしれません。.NET、.NET Frameworkでも同様のはずです。
OhaseO

2024/09/27 00:36

ご教授ありがとうございます。 残念ながら、ツールボックスから貼り付けようとすると、「コンポーネント 'AxHost' を作成できませんでした。」が発生してしまいます。。 誤解を与えてしまったかもしれませんが、問題となっているActiveXコントロールはC++ベースのdllで、VB6ベースのocxのActiveXコントロールは貼り付けも動的な追加もできています。 ちなみに、中身をおいておくとすると、違いは言語と拡張子なのですが、C++のdllでもActiveXコントロールとしてAddできるものかどうか分かりますでしょうか。 マーシャラ等の普段意識していないものが、VB6の場合は良しなに対応してくれていたのかなとも思っています。
OhaseO

2024/09/27 08:54

ActiveXコントロールを扱うその他のツールがないかを依頼元に確認したところ、C++ベースの.dllのものがあり、それについては自環境でもフォームに追加できました。したがって、ますます当該ActiveXコントロール特有の問題ということになりそうです。
dodox86

2024/10/03 09:28

本日、新たな回答とコメントがついたのを読んで: @OhaseOさん 本質問をクリップはしていないものの、注視しています。質問が立ってから長いですが、どうも手強いようですね。自分でも簡単な32ビットのMFC ActiveXコントロールを作成して試していたのですが、今のところ同じ現象は再現しないです。 > 残念ながら、ツールボックスから貼り付けようとすると、「コンポーネント 'AxHost' を作成できませんでした。」が発生してしまいます。。 Exceptionの詳細がもっと出ていませんでしたでしょうか。regsvr32コマンドでまず登録できていて、Visual Studioのツールボックスには載っているんだけど .NETのフォームデザイナーからWindows Formsアプリのフォームにはドラッグ&ドロップで載らない、と言うことですよね。aximpコマンドで自分で作った参照用のラッパーDLL達を参照からいったん削除して、ツールボックスからドラッグ&ドロップでもダメでしょうか。ActiveX"コントロール"と思い込んでいるけど、実はコントロールではなく、単なるCOMオブジェクトだったりしませんか。 .NETから離れて、C++のMFCダイアログアプリケーションのダイアログボックスにはダイアログエディター(リソースエディター)上でツールボックスから貼れるかどうか。 .NET用のラッパーDLLを介さないだけ、問題の切り分けが少しできるかもしれません。 ※分かったところでどうだ、と言う話もありますし、時間の問題もあるでしょうから、強力にお勧めする確認作業と言う訳ではありません。
OhaseO

2024/10/04 01:52

コメントありがとうございます。 > regsvr32コマンドでまず登録できていて、Visual Studioのツールボックスには載っているんだけど .NETのフォームデザイナーからWindows Formsアプリのフォームにはドラッグ&ドロップで載らない、と言うことですよね。aximpコマンドで自分で作った参照用のラッパーDLL達を参照からいったん削除して、ツールボックスからドラッグ&ドロップでもダメでしょうか。 はい、ご認識の通りです。 新規作成したプロジェクトに対してツールボックスによる方法を試してみましたが、ダメでした。 > Exceptionの詳細がもっと出ていませんでしたでしょうか。 今回は、下記が発生しました。 コンポーネント 'AxHost' を作成できませんでした。エラーメッセージ: 'Microsoft.DotNet.DesignTools.Client.DesignToolsServerException:ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。(0x8007045A)' もう少し詳細な内容も含め、発生している問題・分からないことに追記しておきます。 > ActiveX"コントロール"と思い込んでいるけど、実はコントロールではなく、単なるCOMオブジェクトだったりしませんか。 本案件で初めてCOMやActiveX、VB6に触れ、暗中模索している状況です。。 仰る通り、本当にコントロールなのだろうかと思ったこともあるのですが、aximpコマンドでAx*.dllが生成されたことやVB6のソースコードから、コントロールと判断した次第です。 コントロールかどうかを見分ける方法はあるのでしょうか? > .NETから離れて、C++のMFCダイアログアプリケーションのダイアログボックスにはダイアログエディター(リソースエディター)上でツールボックスから貼れるかどうか。 MFCも触れたことがないのですが、試してみようと思っていたところでした。 結果については、また報告いたします。
dodox86

2024/10/04 02:14

@OhaseOさん 私のコメントへの早速の詳細なレス、どうもありがとうございました。 今現在私自身が関わっている訳ではないのですが、ここ最近、20年くらい前のソフトウェア製品、技術をリプレースするような案件の話を比較的多く見聞きしているので、個人的に興味を覚え、関連する話題に注視しているところでした。個人的な技術的好奇心で想像からコメントしているところもあるので、私のコメントへの対応の優先度は低く考えてもらって結構です。多分、現場はピリピリしている状況だとも思いますので。 > コンポーネント 'AxHost' を作成できませんでした。エラーメッセージ: 'Microsoft.DotNet.DesignTools.Client.DesignToolsServerException:ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。(0x8007045A)' これは私自身は初めて見たExceptionですね。前に挙がった以下のようなExceptionの原因と関連しているのかもしれませんが。 > AssertTime 'this._axNetMTrend.AssertTime' は型 'System.Windows.Forms.AxHost.InvalidActiveXStateException' の例外をスローしました System.DateTime {System.Windows.Forms.AxHost.InvalidActiveXStateException} 確かに私が試した限りでも、this.Controls.Add()で貼れないActiveXコントロールは、ツールボックスからもフォームに貼れませんでした。
dodox86

2024/10/04 02:25

尚、Q&Aサイトに関して例えば以下のサイトは古くからの技術にも長けた猛者の方も多く集っています。現役の方も多く、新旧の技術連携にも長けていると思います。 [わんくま同盟] http://www.wankuma.com/ [stackoverflow (ja)] https://ja.stackoverflow.com/ 数年前まではteratailにもおられた古参のアカウントの方も見かけます。 安易なマルチポストや雑な質問には注意する必要がありますが、情報がより整理できたら改めて上記サイトなどで改めて訊ねてみることを検討しても良いかもしれません。
OhaseO

2024/10/04 09:12

> .NETから離れて、C++のMFCダイアログアプリケーションのダイアログボックスにはダイアログエディター(リソースエディター)上でツールボックスから貼れるかどうか。 MFCアプリを新規作成し、アプリケーションの種類をダイアログベースにし、ダイアログエディターにD&Dすると、「ActiveXコントロール”(省略)”はこのコンピュータ上に登録されていません。コントロールを再登録してから再度実行してください。」が発生してしまいます。 問題なくD&DできていたVB6ベースの.ocxについても同様ですので、私の手順が間違っている気がしているのですが、何か分かりますでしょうか?(質問ばかりですみません) > 確かに私が試した限りでも、this.Controls.Add()で貼れないActiveXコントロールは、ツールボックスからもフォームに貼れませんでした。 そちらでも貼れないケースもあるのですね。 貼れるものと貼れないものの違いが分かれば良いのですが、dodox86さんが簡易的に作成したものではないのですよね? その他のQ&Aサイトの紹介もありがとうございます。
dodox86

2024/10/07 03:53

@OhaseOさん 時間が経ちましたが、レスが長くなったので回答の方へ投稿しました。参考程度の情報のみですが、お時間あればご参照ください。
guest

回答2

0

この投稿は単なる情報の提供で、本質問の問題を解決する回答ではありません。

2024/10/04 18:12の「質問へのコメント」欄でのコメントを受けて、コメント欄では長くなるのでこちらで回答させていただきます。

.NETから離れて、C++のMFCダイアログアプリケーションのダイアログボックスにはダイアログエディター(リソースエディター)上でツールボックスから貼れるかどうか。

MFCアプリを新規作成し、アプリケーションの種類をダイアログベースにし、ダイアログエディターにD&Dすると、「ActiveXコントロール”(省略)”はこのコンピュータ上に登録されていません。コントロールを再登録してから再度実行してください。」が発生してしまいます。
問題なくD&DできていたVB6ベースの.ocxについても同様ですので、私の手順が間違っている気がしているのですが、何か分かりますでしょうか?(質問ばかりですみません)

VB6のActiveXコントロール(*.ocx)は32ビットのはずなので、64ビットで動くVisual Studio 2022ではツールボックス上に表示(登録)できず、従って、フォームデザイナー上にドラッグ&ドロップできない気がするのですが、私の方で再現できないのでとりあえず置いておきます。(あるいはVisual Studio 2019で試した結果、でしょうか)

.NETではなく、C++のアプリケーションであるMFCのアプリケーションのプロジェクトで、ダイアログエディターで開いているダイアログボックス(言うなればフォーム)に、ツールボックスからドラッグ&ドロップで貼り付けれられるか? と提案したのはそもそも私ですが、改めてこちらでも色々試してみるとVisual Studio2022では前に挙げたようにVisual Studio 2022自体が64ビットアプリケーションなので、その操作は不可能なようです。

以下は、この場合において同様の問題が生じるteratailの質問です。コメントしたのは私自身で、今回のコメントについても同様なはずなのですが、色々試している内に失念していました。混乱させて申し訳ありません。

しかしながら、Visual Studio 2022のMFCアプリケーションではまったく32ビットActiveXコントロールが使えないという訳ではなく、少なくとも以下の手順にて作成したサンプルのアプリケーションでは結果的に実行させることはできました。繰り返しますが、ダイアログエディターは使えないので画面のデザインはできません。


1. 64ビット版のビルド

1-1. まず、Visual Studio 2022で、64ビット版のMFC ActiveXコントロールを作成する。
プロジェクトのテンプレートは「C++/Windows/ライブラリ」の「MFC ActiveX コントロール」で、ウィザード中の項目の指定は、既定値のままでOK。

1-2. ビルドし、regsvr32コマンドでも登録する。
1-3. Visual Studio 2022で、64ビット版のダイアログベースのMFCアプリケーションを作成する。
1-4. 64ビット版のダイアログベースのMFCアプリケーションのプロジェクトでダイアログエディターを開き、ツールボックスにMFC ActiveXコントロールを登録する。
1-5. ツールボックスからダイアログエディター上のダイアログボックスへドラッグ&ドロップ、またはダイアログボックス上で右クリック-->「ActiveXコントロールの挿入」で挿入して貼り付け。この時点でダイアログエディター上に表示されるはずです。

1-6. 64ビット版のダイアログベースのMFCアプリケーションを再ビルドし、実行してみる。ダイアログボックス上にActiveXコントロールも表示されたら、まずは64ビット版での作成手順は正しいことが確認できる。

ここ迄で64ビット版はOKと言うことです。次に、同じプロジェクトを使って32ビット版を作成します。


2. 32ビット版のビルド

2-1. 64ビット版のMFC ActiveXコントロールの登録を解除する。(regsvr32 /u *.ocx で解除)

2-2. ActiveXコントロールとダイアログベースのMFCアプリのプロジェクトのプラットフォームをWin32(x86, 32ビット)に変更し、再ビルドする。

2-3. 32ビット版として再ビルドしたActiveXコントロールをregsvr32コマンドで登録する。

2-4. ダイアログベースのMFCアプリを実行する。32ビット版として動作し、32ビット版ActiveXコントロールもダイアログボックス上に表示されているはず。

これでVisual Studio 2022を使って32ビット版のActiveXコントロールと、それを貼り付けたMFCアプリケーションの実行が確認できた、と言うことになります。特にハック的な操作や設定は必要無く、分かってしまえば至極当然な手順なのだと思います。

本質問のそもそもの問題に立ち戻ると、C++のMFCアプリケーションで32ビットActiveXコントロールの動作を確認しても問題の切り分け程度にしかならないので、そこまでやるかどうかは質問者OhaseO さんのご判断にお任せします。

尚、私の方で試したところでは上記の操作で作ったサンプルの32ビットActiveXコントロールは、同じVisual Studio 2022の.NET 8.0のWindows Formsアプリケーション(ターゲットプラットフォームはx86)でフォームに動的にthis.Controls.Add()で追加する形で、実行できることは確認できました。

下記画像は、32ビットMFC ActiveXコントロールを.NET 8.0 Windows Forms(ターゲットプラットフォーム x86)アプリに載せて実行しているところです。ActiveXコントロール側のメソッドも呼び出せています。ActiveXコントロールが持つメソッドでAboutBoxを表示しています。
イメージ説明
ですので、やはり質問者OhaseOさんが対応されているActiveXコントロール固有の問題が含まれているのかもしれません。

当方の実行環境も記載しておきます。

  • Windows 10 Pro (22H2)
  • Microsoft Visual Studio Community 2022 Version 17.11.4

※OhaseOさんの環境がWindows 11だったりしたら、また違う結果になるのかもしれません。

投稿2024/10/07 03:47

dodox86

総合スコア9254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OhaseO

2024/10/07 10:16

情報ありがとうございます。 Visual Studio 2022で試していました。 混ざってしまっていましたが、MFCアプリは.NET環境ではないためアウトプロセスデザイナーは働かず、デザイナーによる配置はNGということですね。 ちなみに、ツールボックスに表示はできたが、ドロップするとエラーという状況でした。 ただし、再度ツールボックスに表示するためのダイアログを開いても、それらはリストに表示すらされておらず、 同じものを参照から何度も追加できてしまうという状況ですので、正しく登録はできていなさそうです。 環境は、Windows 11 Pro (23H2)、Visual Studio Professional 2022 Version 17.9.1です。 Visual Studio 2019で試した結果、VB6ベースの.ocxは配置できました。 一方、問題となっているC++ベースの.dllはNGでした。 エラーは同様でした。(「ActiveXコントロール”(省略)”はこのコンピュータ上に登録されていません。コントロールを再登録してから再度実行してください。」) ちなみに、再度ツールボックスに表示するためのダイアログを開くと、どちらもリストに表示されていました。 サンプルもありがとうございました。 一部は再現できませんでしたが、概ね再現できました。 > 2-4. ダイアログベースのMFCアプリを実行する。32ビット版として動作し、32ビット版ActiveXコントロールもダイアログボックス上に表示されているはず。 言葉通りに受け取るのであれば、手順1で貼り付けたものは64bit版ですのでエラーにならないでしょうか? レジストリに登録してあるものは64bit版→32bit版になりましたが、MFCアプリが参照するものがすげ替わったりはしないですよね? (ただ、デザイナからは貼り付けられないが、Add?メソッド等により動的には貼り付けられることを示そうとしてくださった?と理解しています。) やはり、なかなか解決は難しそうですね。。 とはいえ、色々とご協力ありがとうございます。
dodox86

2024/10/07 10:44

> 混ざってしまっていましたが、MFCアプリは.NET環境ではないためアウトプロセスデザイナーは働かず、デザイナーによる配置はNGということですね。 そういうことのようです。 > ただし、再度ツールボックスに表示するためのダイアログを開いても、それらはリストに表示すらされておらず、 > 同じものを参照から何度も追加できてしまうという状況ですので、正しく登録はできていなさそうです。 これと同じようなことは私が試したときも何度も経験していて、参照の追加に失敗しているものはアイコンに"!"マークが付いていたりします。なので、参照を削除して、念の為Visual Studio を再起動したりしていました。 > > 2-4. ダイアログベースのMFCアプリを実行する。32ビット版として動作し、32ビット版ActiveXコントロールもダイアログボックス上に表示されているはず。 > 言葉通りに受け取るのであれば、手順1で貼り付けたものは64bit版ですのでエラーにならないでしょうか? いえ、説明文中、分かりづらかったかもしれませんが > 2. 32ビット版のビルド > > 2-1. 64ビット版のMFC ActiveXコントロールの登録を解除する。(regsvr32 /u *.ocx で解除) と書いています。いったん64ビット版ActiveXコントロールの登録を解除しておくということです。 > レジストリに登録してあるものは64bit版→32bit版になりましたが、MFCアプリが参照するものがすげ替わったりはしないですよね? ビルド時に自動生成されるファイル群を64ビット版、32ビット版で比較してみると分かりますが、ビルドのターゲットプラットフォームを64ビット版から32ビット版に変えても、ActiveXコントロールのCLSID(UUID等)等は変わらないまま使えているようです。32ビットのMFCアプリが参照するとき、あくまで32ビットのActiveXコントロールである必要があります。UUIDが変わらなくても、検証の為の実験プロジェクトなので良しとしてます。
dodox86

2024/10/07 10:59

これまでのコメントでのやり取りを見るに、出来る限りのことは対応されているように思え、充分ご検討の上の判断だと思うのでその点では余り指摘することは無いのですが: > やはり、なかなか解決は難しそうですね。。 現状の質問内容ですと具体的なソースの提示がなく、第三者には再現が極めて困難で、エラーの記載内容から当該ActiveXコントロールや周辺のVB6のActiveXコントロールの挙動や動作仕様、作りを想像するしかなく、その点でも難しいと私も思います。とは言え同じような経験や知見から解決へつながるコメントや回答をいただけるかもしれないので、質問自体を否定している訳ではありません。また、巨大なソースファイル群であろうし、開示も困難だろうからそれを求めるものでもありません。(全部開示されたとしても、そうなるともう業務依頼ですしね)
OhaseO

2024/10/08 06:14

> ビルド時に自動生成されるファイル群を64ビット版、32ビット版で比較してみると分かりますが、ビルドのターゲットプラットフォームを64ビット版から32ビット版に変えても、ActiveXコントロールのCLSID(UUID等)等は変わらないまま使えているようです。 たしかに、CLSIDは64bit版でも32bit版でも同じですね。 そのため、貼り付けていたものは64bit版だけれども、レジストリに登録しているものを32bit版にすれば同様に動作すると理解いたしました(内部で参照しているものはCLSID)。 色々とありがとうございました。 何か進捗があれば、本質問も更新していく次第です。
guest

0

外しているかもしれませんが、初期化を以下のようにしてみてください。

csharp

1var axControl = new AxFoo.AxBar(); 2((ISupportInitialize)axControl).BeginInit(); 3axControl.OcxState = null; 4((ISupportInitialize)axControl).EndInit(); 5this.Controls.Add(axControl);

投稿2024/10/03 06:16

編集2024/10/03 06:24
KOZ6.0

総合スコア2696

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OhaseO

2024/10/03 09:00

回答ありがとうございます。 試してみましたが、結果は変わらず、this.Controls.Add()の箇所でアクセス違反が発生してしまいます。
OhaseO

2024/10/04 07:31

理解するのも難しいですね。。 関係あるかどうかはよく分からないのですが、Visual Studio 2019 (.NET Framework 4.8)でもNGでした。 「ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。」が発生することもあれば、下記が発生することもあるという状況です。 コンポーネント 'AxHost' を生成できませんでした。エラーメッセージ: 'System.IO.FileLoadException: このタイプライブラリのラッパーアセンブリは登録されていません。
KOZ6.0

2024/10/05 03:28 編集

フォームに ActiveX コントロールを張り付けただけの単純な VB6 のプログラム を作り、VS2008 でアップグレードしてみて、出力されたソースを確認してみては?
OhaseO

2024/10/08 08:56

VB6のプログラムを作成できる環境を用意できていないため、現在のところ元のソースを変換することしかできないのですが、改めてVS2008で変換してみました。 その結果、あまり関係ないような気もしますが、一点勘違いに気が付きました。 元のソースは、メインフォームのLoadイベントで、ActiveXコントロール?がAddされるフォームをnewし、「Load そのnewしたインスタンス」、Add…と続いていきます。 このLoadが変換できないのですが、よく確認すると、フォームを読み込みはするが表示はしない、という動作なのですね。 そのフォームも表示されていると思い込んでいました。 ActiveXコントロール?がAddされるフォームのデザイナー部分は少ないため、GUIについてはそのActiveXコントロール?が丸ごと担当していると考えていたのですが、そうとなると、いったん貼り付け先のフォームも表示することに違和感を感じたり、でもそうでなければどのようにActiveXコントロールを追加、表示するのだろうかと思ったりしていたことを思い出しました。 どこか考え方が間違っているような気もしてきましたね。。 もし何か気づいたようなことがあればご教授いただけると幸いです。 ------ by VS2008 Visual Basic 6.0 では、Load ステートメントを使用して、フォームを表示せずに読み込むことができます。また、フォームのいずれかのプロパティを参照することで、フォームを表示せずに読み込むこともできます。 Visual Basic 2008 では、Load ステートメントはサポートされなくなりました。New キーワードを使用してフォームのインスタンスを作成すると、Show メソッドが呼び出されるまで読み込まれません。 ------
OhaseO

2024/10/09 08:38

進捗が少しありましたので、投稿しておきます。 デザイナを使用しない方法の場合、今まではnew()→show()したフォームでActiveXコントロール?をAdd()していたのですが、VB6のLoadステートメントに倣いshow()することなくAdd()すると、とりあえずエラーは発生しなくなりました。理由は分かっておりません。 ただ、その後にそのコントロール?のプロパティを設定したりメソッドを呼んだりする必要があるのですが(そうすることで目的の画面が表示されると思っています)、例えば、下記のような例外が発生している状況です。 ************** 例外テキスト ************** 現時点では 'DataFolder' の set プロパティを呼び出せません。 固有の問題なのか、何かおまじない的なことをしないといけないのか等について調査中です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問