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

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

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

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

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

Q&A

解決済

2回答

1059閲覧

自作のダイアログエディタでOLEコントロールをサポートしたい

katahiromz

総合スコア186

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

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

2グッド

0クリップ

投稿2018/04/05 08:29

編集2018/04/05 12:56

こんにちは。コンピュータ研究家の片山博文MZです。

RisohEditor
http://katahiromz.web.fc2.com/re/ja
https://github.com/katahiromz/RisohEditor

これは、自作のWin32リソースエディタです。MZC4という自作のクラスライブラリーを使って記述しています。

実は、このリソースエディタでOLEコントロールをサポートしたいと考えております。

  1. OLEコントロールのウィンドウクラス名は、何になりますか?
  2. OLEコントロールのスタイルには、どんな値が指定できますか?
  3. OleInitialize/OleUninitialize以外にどんな初期化コードが必要ですか?
  4. どうやってOLEの種類を指定できますか?

この4つの質問にお答え下さい。よろしくお願いします。

追伸。MZC4には、次のようなMActXCtrl.hppというクラスもあります。

MActXCtrl.hpp
https://github.com/katahiromz/MZC4/blob/master/include/MActXCtrl.hpp

yumetodo, atata0319👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

この回答では ActiveX コントロールで統一して記述します。
結論としては、リソースとして出力するべき内容は使用するフレームワーク毎に異なります。

● MFC の場合
MFC では ActiveX コントロールのホスト機能は CWnd が担っています。
この場合、CLSID はウィンドウクラス名に設定されます。

CONTROL "",IDC_CTRL1,"{8BD21D10-EC42-11CE-9E0D-00AA006002F3}",WS_TABSTOP,141,7,130,132

上記コントロールの永続化データはダイアログの初期化データとして別のリソースに保存されます。

IDD_TEST_DIALOG DLGINIT
BEGIN
IDC_CTRL1, 0x37a, 99, 0
0x0000, 0x0000, 0x0023, 0x0000, 0x0001, 0x0000, 0x001b, 0x0000, 0x0001,
0x8001, 0x0000, 0x0000, 0x0000, 0x001a, 0x0000, 0x0002, 0x8001, 0x0001,
0x0000, 0x0000, 0x1802, 0x0100, 0x1401, 0x0080, 0x0000, 0x1b00, 0x8048,
0x0224, 0x0003, 0x9100, 0x0017, 0x7700, 0x0014, 0x0000, 0x1c02, 0x3500,
0x0000, 0x0c00, 0x0000, 0xb480, 0x0000, 0x8000, 0x0002, 0x4d00, 0x2053,
0x4955, 0x4720, 0x746f, 0x6968, "\143"
0
END

このリソースに保存されているデータは IPersistPropertyBag(2) 関連のインターフェースを使用せずに
IPersistStream(Init) でシリアライズされたデータを保持していると思われます。

上記を踏まえて

>1. OLEコントロールのウィンドウクラス名は、何になりますか?
CLSID を指定します。

>2. OLEコントロールのスタイルには、どんな値が指定できますか?
ActiveX コントロール自体が独自のスタイルで独自のウィンドウを作成するため、
ほぼ指定するスタイルはありません。
WS_TABSTOP を指定するかどうかというところです。
それ以外では WS_ENABLED と WS_VISIBLE ぐらいしか意味がありません。
ウィンドウレスアクティベーションを許可する場合、
WS_CLIPCHILDREN | WS_CLIPSIBLINGS を指定した方が良いです。
拡張スタイルにかんしてはクライアント領域のサイズに影響があるスタイルを指定することができます。
また、WS_EX_CONTROLPARENT を指定した場合、複合コントロールでは多少影響します。

>3. OleInitialize/OleUninitialize以外にどんな初期化コードが必要ですか?
MFC の ActiveX ホスト機能の初期化処理に従います。
App Wirzard で ActiveX コントロールのサポートをチェックするのが簡単で良いです。

>4. どうやってOLEの種類を指定できますか?
ウィンドウクラス名に CLSID を指定します。

● ATL/WTL の場合
ATL/WTL では MFC 用に生成されたリソースをそのまま使用します。
ただし、WebBrowser コントロールをホストする場合は若干意味が変わります。
ウィンドウテキストは初期段階でアクセスする URL を指定することができます。

上記以外は MFC と同じです。

>1. OLEコントロールのウィンドウクラス名は、何になりますか?
MFC と同様に CLSID を指定します。
なお、ウィンドウクラス名に AtlAxWin?? か AtlAxWinLic?? を指定することもできます。
※?? は ATL のバージョンによって変化します。

>2. OLEコントロールのスタイルには、どんな値が指定できますか?
MFC と同じ指定です。

>3. OleInitialize/OleUninitialize以外にどんな初期化コードが必要ですか?
ATL の ActiveX コントロールホスト機能を有効にする必要があります。
ATL の AtlAxWinInit の呼び出しが必要になることがあります。
WTL の場合、Wizard で ActiveX コントロールを有効にすれば問題ありません。

>4. どうやってOLEの種類を指定できますか?
MFC と同様にウィンドウクラス名に CLSID を指定します。
また、ウィンドウクラスに AtlAxWin?? か AtlAxWinLic?? を指定した場合、
ウィンドウタイトルに CLSID:コンポーネントのCLSID によって指定することもできます。

●独自に ActiveX コントロールホストを作成する場合
今までの話と同様に ActiveX コントロールではなく
ActiveX コントロールホストをダイアログ上に作成することになります。
フレームワークを使用せずに実装する場合、以下のようになります。

>1. OLEコントロールのウィンドウクラス名は、何になりますか?
ActiveX コントロールホストのウィンドウクラス名を指定してください。

>2. OLEコントロールのスタイルには、どんな値が指定できますか?
MFC と同じになります。

>3. OleInitialize/OleUninitialize以外にどんな初期化コードが必要ですか?
ActiveX コントロールホストのウィンドウクラス名を登録する必要があります。
通常のカスタムコントロールと同じ手順になります。

>4. どうやってOLEの種類を指定できますか?
ウィンドウクラス名がカスタムコントロールによって使用されるため、
ウィンドウテキストに CLSID を指定するのが常套手段になります。
永続化データについては MFC/ATL/WTL と似たような感じで独自リソースを定義するのがおすすめです。
具体的な製品名を述べることはできませんが、
永続化データも合わせてウィンドウテキストにしているものもあります。

ダイアログテンプレートとしては MFC と同じものを使用し、
ダイアログボックス生成だけ独自に処理する実装(ATL/WTL)もあります。

投稿2018/04/06 19:00

atata0319

総合スコア881

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

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

0

ActiveXコントロールはそろそろ滅ぶべき文明じゃないかと思うのですがいかがでしょうか?例えばMicrosoft EdgeではActiveXコントロールをサポートしません。

投稿2018/04/05 11:35

編集2018/04/05 11:36
yumetodo

総合スコア5850

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

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

katahiromz

2018/04/05 11:50

WebではActiveXはセキュリティの問題があって、非難されるべきですが、オフィスソフトや事務用ソフトの分野では、機能性を高める点で重要だと考えております。オフィスや事務では、デジタル署名によって、セキュリティの問題は軽減できます。
katahiromz

2018/04/05 12:56

ActiveXとOLEを誤認していました。すみません。
yumetodo

2018/04/05 12:57

>フィスソフトや事務用ソフトの分野では、機能性を高める点で重要だと考えております。 まあわかるっちゃわかるんですが・・・
yumetodo

2018/04/05 13:00 編集

書いている最中にコメントが来たので打ち切って改めて。 てっきりWebで実装するみたいな話かと思って、それはユーザビリティいいのか???となりながらともかくActiveX Controlは殺すべしという立場の発言でしたが、ActiveX自体はおっしゃるとおりですね。(追記修正依頼に書くんだった、回答がつきにくくなってしまった)
katahiromz

2018/04/05 13:03

ActiveXコントロールじゃなくて、OLEコントロールの方です。私が間違っていました。マイクロソフトは、OLEコントロールという古い言葉を使いたくないようです。
katahiromz

2018/04/05 13:37

ActiveXは商標だから、完全に罠だな。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問