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

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

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

ActiveXをWinFormsで表示するとATL14.00

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

■103707 / inTopicNo.1)  ActiveXをWinFormsで表示するとATL14.00
  
□投稿者/ シナモ (1回)-(2025/05/30(Fri) 21:05:37)

分類:[C#] 

環境
Visual Studio 2022
.NET 8.0
C# 12.0

レガシーなC++のプロジェクトをビルドし、
ビルドしてできたActiveXコントロールdllをaximpコマンドでラップし、
ラップしたコントロールをWinFormsのFormにAddし、そのFormを表示すると、
中央にATL14.00と表示されます。
その他の問題かもしれませんが、そのコントロールのメニュー等を押すこともできない状態です。

C++のプロジェクトもWinFormsのプロジェクトもx86でビルドしています。
ActiveXコントロールdllはregsvr32で登録済みです。
aximpコマンドでもエラーなくアセンブリが生成されています。

まず、画面中央にATL14.00と表示されるのはどういう状態なのでしょうか。
何かがおかしい状態と思っているのですが、その他に考えられる原因はありますでしょうか。

何かご存じであれば、ご教授いただきたいです。
お手数ですが、よろしくお願いいたします。
引用返信 編集キー/
■103708 / inTopicNo.2)  Re[1]: ActiveXをWinFormsで表示するとATL14.00
□投稿者/ とっちゃん (846回)-(2025/05/30(Fri) 21:25:09)
No103707 (シナモ さん) に返信

> レガシーなC++のプロジェクトをビルドし、
> ビルドしてできたActiveXコントロールdllをaximpコマンドでラップし、
> ラップしたコントロールをWinFormsのFormにAddし、そのFormを表示すると、
> 中央にATL14.00と表示されます。

レガシーなC++のプロジェクトというのがどういうものかわからないので
確証があるとは言えませんが、そのC++のコントロールの問題か
貼り付け方に問題があるかのどちらかだと思います。

Formに、Addとは具体的にどういう処理をされているのでしょうか?

ActiveX コントロールだからボタンみたいにペタっと貼ればいいとは限りません。
中には専用の初期化処理を施してやらないと表示されないようなものもあります。


> まず、画面中央にATL14.00と表示されるのはどういう状態なのでしょうか。

Add しただけだと、そのコントロールが表示するべき何かが足りない等で
「ATL14.00」とコントロールエリアの中央に表示しているのかもしれません。

まずは、C++のコントロールのコードを確認してみることをお勧めします。

引用返信 編集キー/
■103709 / inTopicNo.3)  Re[2]: ActiveXをWinFormsで表示するとATL14.00
□投稿者/ シナモ (2回)-(2025/05/31(Sat) 15:29:28)
No103708 (とっちゃん さん) に返信

ご返信ありがとうございます。

> レガシーなC++のプロジェクトというのがどういうものかわからないので
> 確証があるとは言えませんが、そのC++のコントロールの問題か
> 貼り付け方に問題があるかのどちらかだと思いシナモ
>
> Formに、Addとは具体的にどういう処理をされているのでしょうか?

メニューバーやツールバー、グラフ表示エリア等を含む内製のコントロールです。
Form上にControls.Addメソッドで追加しています。

ATL14.00と表示されるのが、そのコントロール特有ではなく、
ActiveXあるあるであればと願ってみたのですが、そういうわけでもなさそうですかね。

ActiveXは分かりづらく、規模も大きいため、どこから確認すべきか見当もつかないのが辛いところですが、
ソースコードを確認するしかなさそうですね。
引用返信 編集キー/
■103710 / inTopicNo.4)  Re[3]: ActiveXをWinFormsで表示するとATL14.00
□投稿者/ とっちゃん (847回)-(2025/05/31(Sat) 18:11:52)
No103709 (シナモ さん) に返信
> ATL14.00と表示されるのが、そのコントロール特有ではなく、
> ActiveXあるあるであればと願ってみたのですが、そういうわけでもなさそうですかね。
>
ATL は、ActiveX コントロール全般を表すような言葉ではなく
特定のライブラリの名称なので、残念ながらActiveX コントロール全般を指すようなものではありません。


> メニューバーやツールバー、グラフ表示エリア等を含む内製のコントロールです。
> Form上にControls.Addメソッドで追加しています。

色々な表示機能を持つということだとすると、相応の初期化処理や設定などを行わないと
情報が出てこないのではないか?と思います。



> ActiveXは分かりづらく、規模も大きいため、どこから確認すべきか見当もつかないのが辛いところですが、
> ソースコードを確認するしかなさそうですね。

内製品であれば依然そのコントロールを使っていたプログラムもあると思います。
そちらで何をやっているかを調べるほうが早いかもしれません。
引用返信 編集キー/
■103714 / inTopicNo.5)  Re[3]: ActiveXをWinFormsで表示するとATL14.00
□投稿者/ KOZ (486回)-(2025/06/02(Mon) 03:24:53)
No103709 (シナモ さん) に返信
> ATL14.00と表示されるのが、そのコントロール特有ではなく、
> ActiveXあるあるであればと願ってみたのですが、そういうわけでもなさそうですかね。

copilot に聞いてみたら

「ATL 14.00」と表示される状態について 中央に「ATL 14.00」と表示されるのは、ActiveX コントロールが正しく初期化されておらず、デフォルトの ATL (Active Template Library) のプレースホルダー UI が表示されている可能性が高いです。これは、ActiveX コントロールが適切にロードされていない場合に見られる現象です。

だそうです。

Visual Studio のツールボックスに COM コンポーネントとして追加し、ツールボックスからフォームに貼り付けるとどうでしょうか?

引用返信 編集キー/
■103715 / inTopicNo.6)  Re[1]: ActiveXをWinFormsで表示するとATL14.00
□投稿者/ kiku (472回)-(2025/06/02(Mon) 11:07:56)
No103707 (シナモ さん) に返信
> 環境
> Visual Studio 2022
> .NET 8.0
> C# 12.0

当方このあたりの知識はないため、
気づいた点のみ指摘してみます。
VisualStudio2022自体は、64bitかと思いますので
この点が問題になっていることはありませんか?

引用返信 編集キー/
■103716 / inTopicNo.7)  Re[1]: ActiveXをWinFormsで表示するとATL14.00
□投稿者/ 魔界の仮面弁士 (3851回)-(2025/06/02(Mon) 12:01:53)
No103707 (シナモ さん) に返信
> 環境
> Visual Studio 2022
> .NET 8.0
> C# 12.0
どのバージョンの VS2022 をお使いでしょうか?
最低でも 17.9 以上が必要になるはず(現行版は 17.14 系)

> C++のプロジェクトもWinFormsのプロジェクトもx86でビルドしています。
https://learn.microsoft.com/ja-jp/dotnet/desktop/winforms/visualstudio/troubleshoot-32bit
上記を見る限りでは、.NET Framework 版 と .NET 版のそれぞれについて、こんな記載がありますね。

・32 ビット コンポーネントは、64 ビット アプリである Visual Studio 2022 のインプロセスの Windows フォーム デザイナーを使用できない。
・32 ビットと 64 ビットの両方のデザイン時に使える .NET アプリ用の WinForm デザインに使える「アウトプロセス デザイナー」が Visual Studio 17.9 以降でサポートされた。
・ActiveX と COM の参照は、.NET Framework と .NET の両方でサポートされている。
・プロジェクトが .NET を対象とする場合は、既にアウトプロセス デザイナーを使用している。
・プロジェクトが .NET Framework をまだ使用している場合は、アウトプロセス デザイナーを明示的に有効にする必要がある。
・更新されたアウトプロセスの 32 ビット .NET Framework デザイナーは、同じアーキテクチャの違いにより、古いインプロセス .NET Framework デザイナーと完全に同等にはならない。

[ツール]-[オプション]から [環境]>[プレビュー機能] だと、このあたり?
 ・.NET アプリのプレビュー版 Windows Forms アウトプロセス デザイナーを使用する
 ・Windows フォーム .NET Framework プロジェクトの 32 ビット アセンブリ読み込みエラーを検出する
引用返信 編集キー/
■103717 / inTopicNo.8)  Re[2]: ActiveXをWinFormsで表示するとATL14.00
□投稿者/ シナモ (3回)-(2025/06/02(Mon) 17:31:51)
2025/06/02(Mon) 19:35:09 編集(投稿者)

みなさん、ご返信ありがとうございます。

No103716 (魔界の仮面弁士 さん) に返信

> どのバージョンの VS2022 をお使いでしょうか?
> 最低でも 17.9 以上が必要になるはず(現行版は 17.14 系)

Version 17.9.1で、アウトプロセスデザイナーは有効になっていました。

ツールボックスアイテムの選択画面でaximpコマンドでラップしたAxMYCONTROLLib.dllを参照すると、下記のようなエラーが発生します。
 'AxMYCONTROLLib.dll'には、ツールボックスに配置できるコンポーネントが何もありません。(日本語)
 There are no components in 'AxMYCONTROLLib.dll' that can be placed on the toolbox.(英語)
stackoverflowを参考に、D&Dやコピペによるツールボックスへの追加も試みましたが、変わらずでした。

ビルドが通っただけでC++側の問題か、クライアント側の初期化の問題か、を疑っているところです。

------ 追記 ------

日本語でもいくつかの情報はヒットしますね。

フォルダ名の問題ではなさそうでした。
C++のプロジェクトによるReleaseフォルダを丸ごとCドライブ直下に置いても変わらずでした。

デフォルトコンストラクタも実装されていました。
ILSpyで確認すると、SetAboutBoxDelegate(ShowAboutBox);を実行していました。
aximpコマンドによるラップ時に生成されるコードと思いますが、ATL14.00と表示するのはこれのようです。
引用返信 編集キー/
■103718 / inTopicNo.9)  Re[3]: ActiveXをWinFormsで表示するとATL14.00
□投稿者/ とっちゃん (848回)-(2025/06/02(Mon) 21:34:49)
No103717 (シナモ さん) に返信

> ビルドが通っただけでC++側の問題か、クライアント側の初期化の問題か、を疑っているところです。
>
VS のバージョンが 17.9.1 なのでもしかしたらVS側の問題かもしれません。
まずは、サポートされているバージョン(VS2022は、細かいレベルで古いマイナーバージョンはサポート終了しています)に
アップデートすることをお勧めします。

そのうえで改めて貼り付けできるかを調べてみるとよいのではないかと。

ビルドが通っただけで…という可能性ももちろんあります。
ビルドしたCOMオブジェクトが間接的にほかのCOMオブジェクトを必要としている場合
それも登録されていないと動きません。
また、何かしらのNativeDLLが必要であれば、それらも必要になります。

アップグレードあるあるなネタ的には、COM(に限らずNativeDLLは全部同様)が参照している
別のDLLが、古いランタイムを必要としていてそれがインストールされていなかった
なんてことは本当によくあります。

もちろん、コンバートしてビルドは通るけど、実行すると内部エラーでこけている
なんてこともよくある現象の一つです。

> ILSpyで確認すると、SetAboutBoxDelegate(ShowAboutBox);を実行していました。
> aximpコマンドによるラップ時に生成されるコードと思いますが、ATL14.00と表示するのはこれのようです。

こちらはすでに指摘がありますが、aximp のラップコードの問題ではなく
貼り付けたオブジェクトが正しく初期化できていないため
結果として「ATL14.00」というテキストを表示する機能が呼ばれてしまっているということだと思います。
(デザイナー上だと初期化が不十分なため、そうなってしまう可能性もある)


引用返信 編集キー/
■103719 / inTopicNo.10)  Re[3]: ActiveXをWinFormsで表示するとATL14.00
□投稿者/ kiku (473回)-(2025/06/03(Tue) 08:28:03)
No103717 (シナモ さん) に返信
> Version 17.9.1で、アウトプロセスデザイナーは有効になっていました。

問題切り分けの1つの方法として、
VS2019で試してみるのも良いと思いました。
引用返信 編集キー/
■103724 / inTopicNo.11)  Re[4]: ActiveXをWinFormsで表示するとATL14.00
□投稿者/ シナモ (4回)-(2025/06/04(Wed) 17:30:38)
みなさん、ご返信ありがとうございます。

No103718 (とっちゃん さん) に返信

> そのうえで改めて貼り付けできるかを調べてみるとよいのではないかと。

すみません、勘違いしていたようです。
.NETのタブを選択し、aximpコマンドでラップしたdllを参照するものと思いこんでいたのですが、
COMのタブを選択し、ラップする前のdllを参照するようですね。
そのようにしたところ、ツールボックスには追加できました。
ただ、フォームに貼り付けようとすると、
「'AxHost'を作成できませんでした。〜(0x8007045a)」というエラーが発生する状況です。

> こちらはすでに指摘がありますが、aximp のラップコードの問題ではなく
> 貼り付けたオブジェクトが正しく初期化できていないため
> 結果として「ATL14.00」というテキストを表示する機能が呼ばれてしまっているということだと思います。
> (デザイナー上だと初期化が不十分なため、そうなってしまう可能性もある)

ビルド前の本ActiveXコントロールを扱っているソースコードを読んでいるところです。
showする前に行っている処理の一部を実装してみたところ、
ATL14.00とは表示されず、コントロールのメニュー等も押せるようになりました。

おっしゃる通り、初期化が不十分となってしまうデザイナーでは対応が難しいのかもしれません。


まだこれからですが、とりあえず、本トピックは解決済みとさせていただきます。
みなさん、ありがとうございました。
解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ