- PR -

VC++.NETでMFC ActiveXコントロールを利用したい

1
投稿者投稿内容
inr
会議室デビュー日: 2005/02/28
投稿数: 4
投稿日時: 2005-02-28 15:19
VC++.Netで、MFC ActiveXコントロールを利用する際にあたっての質問です。

VB.Netと同様に、「参照の追加」>「COM」から追加することで、
ダイアログベースのアプリにコントロールを貼り付けることはできました。
しかし、ディスパッチインタフェースにアクセスする方法が良く分かりません。

コントロールの上のコンテキストメニューから「変数の追加」を選ぶことで、
一応ラッパークラスは作成されるのですが、CWndを継承しただけのクラスとなり、
固有のディスパッチインタフェースにアクセスすることが出来ません。
また、コントロール内に含まれる他のディスパッチインタフェースのラッパーも
同様に作成されません。

しょうがないのでVC++6.0でダミープロジェクトを作成しコントロールを取り込んだ後、
ラッパー関連のソースをVC++.NETのプロジェクトにコピーして使うことで対処していますが、
いくらなんでももう少しうまいやり方があるだろうと思い、質問させて頂きました。
何かご存知の方、よろしくお願いいたします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-02-28 18:51
引用:

コントロールの上のコンテキストメニューから「変数の追加」を選ぶことで、
一応ラッパークラスは作成されるのですが、CWndを継承しただけのクラスとなり、
固有のディスパッチインタフェースにアクセスすることが出来ません。



普通は、その CWnd 派生クラスにデフォルトインターフェースの実装が追加されているはずです。

引用:

いくらなんでももう少しうまいやり方があるだろうと思い、質問させて頂きました。
何かご存知の方、よろしくお願いいたします。



どこかに何か大きな見落としがあるような気もしますが、「参照設定」の挙動が不満なら

・#import ディレクティブ
・CWnd::CreateControl(), GetControlIUnknown()

辺りを組み合わせてみてはどうでしょうか。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
inr
会議室デビュー日: 2005/02/28
投稿数: 4
投稿日時: 2005-02-28 19:55
引用:

普通は、その CWnd 派生クラスにデフォルトインターフェースの実装が追加されているはずです。
どこかに何か大きな見落としがあるような気もしますが、


私もそんな気はしてます。HTMLコントロールを例に手順を書いてみます。

・MFC Appのプロジェクトを作成。変更項目はダイアログベースにする点だけ。
・参照設定のコンテキストメニューの「参照の追加」→「COM」から「Microsoft HTML Object Library」を「選択」→「OK」
・ラッパークラスのファイルは特に何も生成されない

・次にツールボックスのコンテキストメニューの「アイテムの追加と削除」→「COMコンポーネント」から「Microsoft Web Browser」にチェック、「OK」
・Windowsフォームの項にMicrosoft Web Browserが追加されるので、ダイアログにコントロールとして貼り付け
・コントロールのコンテキストメニューから「変数の追加」を行う
・CWndのCreateにCLSIDを渡すだけの「CExplorer1」というクラスが生成される

・・・やっぱり絶対やり方違うような気がします。
でも「参照の追加」だけでは確かにラッパーが生成されないんですよ。
「参照の追加」でラッパーが生成される方は、このやり方とは異なるやり方をされてますか?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-02-28 22:00
引用:

でも「参照の追加」だけでは確かにラッパーが生成されないんですよ。



それが所定の動作かと。

アンマネージプロジェクトでは

・クラスの追加?
・ダイアログでの変数の追加
・#import ディレクティブを含んだコードをコンパイル

のいずれかをを行った時がラッパクラス作成のタイミングだったと思います。

# C# や VB.NET と勘違いしていません?

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
inr
会議室デビュー日: 2005/02/28
投稿数: 4
投稿日時: 2005-02-28 22:21
引用:

それが所定の動作かと。

アンマネージプロジェクトでは

・クラスの追加?
・ダイアログでの変数の追加
・#import ディレクティブを含んだコードをコンパイル

のいずれかをを行った時がラッパクラス作成のタイミングだったと思います。


なるほど、そうだったんですか<所定の動作。
ダイアログでの変数の追加では前述のようなラッパしか生成されませんので、
#importの方を使うべきなんでしょうね。
どうもありがとうございました。

引用:

# C# や VB.NET と勘違いしていません?


6.0以前のVisualC++でこのように使っていましたので、質問させて頂きました。
以前のVisualC++でActiveXを使われたことはありませんか?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-02-28 22:34
引用:

ダイアログでの変数の追加では前述のようなラッパしか生成されませんので、
#importの方を使うべきなんでしょうね。



一長一短です。

#import は _com_ptr_t を使った比較的薄いラッパを生成するのでシンプル好きな人向きですが、イベントの捕捉なんかは「変数の追加」で追加されたラッパを経由した方が楽です。

引用:

6.0以前のVisualC++でこのように使っていましたので、質問させて頂きました。
以前のVisualC++でActiveXを使われたことはありませんか?



VC4 ~ VC6 に「参照設定」なんかないですよね?
VC7 でも VC8 以前と同じような使い方(=変数の追加)はできるので、特に悩むところは無いと思いますが???

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
inr
会議室デビュー日: 2005/02/28
投稿数: 4
投稿日時: 2005-03-01 10:40
引用:

VC4 ~ VC6 に「参照設定」なんかないですよね?
VC7 でも VC8 以前と同じような使い方(=変数の追加)はできるので、特に悩むところは無いと思いますが???


VC6以前では、「プロジェクト」→「プロジェクトへ追加」→「コンポーネント及びコントロール」
から追加することで、コントロールに含まれているディスパッチインタフェース全ての
ラッパーが作成されるのですが、VC7での「変数の追加」からはコントロール直下の
インタフェースしか生成されないのです。
#importで*.tlbを読み込むことでその他のインタフェースにアクセスすることは
出来るようになりましたが、VC6とは考え方を変えないとだめですね。
どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)