トップ回答者
ActiveXコントロールへの新しいメンバの追加について

質問
-
いつもお世話になっています。MFC ActiveX Control WizardでActiveXコントロールを作っています。コントロールに新しいメンバを追加するとき、XXXX.odlに手で記述を追加しているのですが、メンバのDISPIDを必ず順番に書かないと動いてくれません。例えばAAA、BBBという2つのプロパティとmmm、nnnという2つのメソッドがあった場合、odlにproperties://{{AFX_ODL_PROP(XXXXCtrl)[id(1)] long AAA;[id(2)] long BBB;//}}AFX_ODL_PROPmethods://{{AFX_ODL_METHOD(XXXXCtrl)[id(3)] long mmm();[id(4)] long nnn();//}}AFX_ODL_METHODという風にプロパティ→メソッドの順に続き数字で書かないと動いてくれません。これだと後からプロパティを増やしたいとき、メソッドのIDをすべてずらす必要があり、かなり不便です。またIDを変更すると以前のものと互換性が無くなるように思います。こういうものなのでしょうか? それともなにか私のやり方がまずいのでしょうか?どなたかご存じのかたいらっしゃいましたら教えて下さい。
回答
-
普通にフォームなどに貼り付けて使用しています。
その「普通」とはどのようなものか明確に説明してください。
少なくとも、どの環境で、どのバージョン、どのようなプロジェクトといった情報は必要だと思います。
(他の人から見たら「普通」という表現では、何も追加で分かることはありません。)
先ほど気づいたのですが、どうもVC6とVC8で違うようです。いままでVC6でやっていたのですが、VC8ではodl->idlというファイル名に変わっており、IDは続き数字でなくてもよくなったようです。
過去に VC6 で作っていた ActiveX コントロールのソースコードを確認しましたが、別に続き数字でもなく、C# からの利用でも特に問題はありませんでした。(連番になっていない ODL で問題なし)
このことから、「できない」のはそのプロジェクト、利用環境、ビルド環境のいずれかに何らかの問題があるのだと推測します。
# 単純に VC6 のせいではないということ。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク ひろ太 2010年2月5日 11:54
すべての返信
-
ご参考までに、COMの設計思想は以下から読み広げていくと、理解できると思います。
[Interface Pointers and Interfaces]
http://msdn.microsoft.com/en-us/library/ms688484(VS.85).aspx
COM interfaces are immutableと記載されていますね。
日本語訳が見つかりませんが、Inside COM(日本語訳版)という本が身近にあれば、
そちらを参照することをお勧めします。 -
>ディスパッチインターフェースを複数実装することはできません。
>そうなんですか? じゃあどうしようもないのかな・・・>>という風にプロパティ→メソッドの順に続き数字で書かないと動いてくれません。
>
>という制限はなかったような気がしますが。。。>もしかしてあとから追加するときは ↓ みたいにすればよいのでしょうか?properties://{{AFX_ODL_PROP(XXXXCtrl)[id(1)] long AAA;[id(2)] long BBB;//}}AFX_ODL_PROPmethods://{{AFX_ODL_METHOD(XXXXCtrl)[id(3)] long mmm();[id(4)] long nnn();//}}AFX_ODL_METHOD// 新しくプロパティを追加properties://{{AFX_ODL_PROP(XXXXCtrl)[id(5)] long CCC;//}}AFX_ODL_PROP -
properties://{{AFX_ODL_PROP(XXXXCtrl)[id(1)] long AAA;[id(2)] long BBB;[id(5)] long CCC;//}}AFX_ODL_PROPmethods://{{AFX_ODL_METHOD(XXXXCtrl)[id(3)] long mmm();[id(4)] long nnn();//}}AFX_ODL_METHOD
こういうことだけじゃないの?
(試していません)
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。 -
普通にフォームなどに貼り付けて使用しています。
その「普通」とはどのようなものか明確に説明してください。
少なくとも、どの環境で、どのバージョン、どのようなプロジェクトといった情報は必要だと思います。
(他の人から見たら「普通」という表現では、何も追加で分かることはありません。)
先ほど気づいたのですが、どうもVC6とVC8で違うようです。いままでVC6でやっていたのですが、VC8ではodl->idlというファイル名に変わっており、IDは続き数字でなくてもよくなったようです。
過去に VC6 で作っていた ActiveX コントロールのソースコードを確認しましたが、別に続き数字でもなく、C# からの利用でも特に問題はありませんでした。(連番になっていない ODL で問題なし)
このことから、「できない」のはそのプロジェクト、利用環境、ビルド環境のいずれかに何らかの問題があるのだと推測します。
# 単純に VC6 のせいではないということ。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク ひろ太 2010年2月5日 11:54