none
ActiveXコントロールへの新しいメンバの追加について RRS feed

  • 質問

  • いつもお世話になっています。
    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_PROP

    methods:
    //{{AFX_ODL_METHOD(XXXXCtrl)
    [id(3)] long mmm();
    [id(4)] long nnn();
    //}}AFX_ODL_METHOD


    という風にプロパティ→メソッドの順に続き数字で書かないと動いてくれません。
    これだと後からプロパティを増やしたいとき、メソッドのIDをすべてずらす必要があり、かなり不便です。
    またIDを変更すると以前のものと互換性が無くなるように思います。

    こういうものなのでしょうか? それともなにか私のやり方がまずいのでしょうか?
    どなたかご存じのかたいらっしゃいましたら教えて下さい。






    2010年1月27日 7:15

回答

  • COM に関しては以前結構調べてたのですが、最近すっかり忘れてしまいました。
    でも以下の記事とか参考になりませんでしょうか?

    http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-22843.htm
    • 回答としてマーク ひろ太 2010年1月29日 6:12
    2010年1月27日 7:39
  • 普通にフォームなどに貼り付けて使用しています。
    その「普通」とはどのようなものか明確に説明してください。
    少なくとも、どの環境で、どのバージョン、どのようなプロジェクトといった情報は必要だと思います。
    (他の人から見たら「普通」という表現では、何も追加で分かることはありません。)

    先ほど気づいたのですが、どうもVC6とVC8で違うようです。いままでVC6でやっていたのですが、VC8ではodl->idlというファイル名に変わっており、IDは続き数字でなくてもよくなったようです。
    過去に VC6 で作っていた ActiveX コントロールのソースコードを確認しましたが、別に続き数字でもなく、C# からの利用でも特に問題はありませんでした。(連番になっていない ODL で問題なし)
    このことから、「できない」のはそのプロジェクト、利用環境、ビルド環境のいずれかに何らかの問題があるのだと推測します。

    # 単純に VC6 のせいではないということ。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク ひろ太 2010年2月5日 11:54
    2010年2月1日 13:44
    モデレータ

すべての返信

  • COM に関しては以前結構調べてたのですが、最近すっかり忘れてしまいました。
    でも以下の記事とか参考になりませんでしょうか?

    http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-22843.htm
    • 回答としてマーク ひろ太 2010年1月29日 6:12
    2010年1月27日 7:39
  • ひらぽんさん、こんにちは。 hiro-taです。

    ご回答ありがとうございました。

    難しくてまだよくは理解できていないのですが、ようするに新しいメンバを追加するときはinterfaceを増やすのがCOMの流儀ということですね。

    2010年1月29日 6:12
  • ご参考までに、COMの設計思想は以下から読み広げていくと、理解できると思います。

    [Interface Pointers and Interfaces]
      http://msdn.microsoft.com/en-us/library/ms688484(VS.85).aspx

      COM interfaces are immutableと記載されていますね。


    日本語訳が見つかりませんが、Inside COM(日本語訳版)という本が身近にあれば、
    そちらを参照することをお勧めします。
    2010年1月29日 8:53
  • >ようするに新しいメンバを追加するときはinterfaceを増やすのがCOMの流儀ということですね。

    それはカスタムインターフェースの場合です。

    ディスパッチインターフェースを複数実装することはできません。

    ちなみに

    >という風にプロパティ→メソッドの順に続き数字で書かないと動いてくれません。

    という制限はなかったような気がしますが。。。
    2010年1月29日 9:08
  • >ディスパッチインターフェースを複数実装することはできません。
    >
    そうなんですか? じゃあどうしようもないのかな・・・

    >>という風にプロパティ→メソッドの順に続き数字で書かないと動いてくれません。
    >
    >という制限はなかったような気がしますが。。。
    >
    もしかしてあとから追加するときは ↓ みたいにすればよいのでしょうか?

    properties:
    //{{AFX_ODL_PROP(XXXXCtrl)
    [id(1)] long AAA;
    [id(2)] long BBB;
    //}}AFX_ODL_PROP

    methods:
    //{{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

    2010年1月29日 12:06
  • ダメでした。
    properties:
    が2つ以上あるとビルドでエラーになるみたいです。
    2010年1月29日 12:16
  • properties:
    //{{AFX_ODL_PROP(XXXXCtrl)
    [id(1)] long AAA;
    [id(2)] long BBB;
    [id(5)] long CCC;
    //}}AFX_ODL_PROP

    methods:
    //{{AFX_ODL_METHOD(XXXXCtrl)
    [id(3)] long mmm();
    [id(4)] long nnn();
    //}}AFX_ODL_METHOD

    こういうことだけじゃないの?
    (試していません)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年1月29日 12:55
    モデレータ
  • hiro-taです。 >こういうことだけじゃないの? >(試していません) > それがダメなんです。ビルドは通りますが、上記の場合だとIDが3以降のメンバは動作しなくなります。
    2010年1月30日 8:29
  • それがダメなんです。
    ビルドは通りますが、上記の場合だとIDが3以降のメンバは動作しなくなります。
    どのようにその ActiveX コントロールを利用しているのでしょうか。
    また、別の ActiveX コントロールを新規に作成しても同じ現象になるのでしょうか。

    ある程度情報を集まったら、手元でも試します。

    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年1月30日 9:41
    モデレータ
  • 普通にフォームなどに貼り付けて使用しています。
    先ほど気づいたのですが、どうもVC6とVC8で違うようです。いままでVC6でやっていたのですが、VC8ではodl->idlというファイル名に変わっており、IDは続き数字でなくてもよくなったようです。
    もう少しいろいろ調べてみます。

    2010年2月1日 1:56
  • 普通にフォームなどに貼り付けて使用しています。
    その「普通」とはどのようなものか明確に説明してください。
    少なくとも、どの環境で、どのバージョン、どのようなプロジェクトといった情報は必要だと思います。
    (他の人から見たら「普通」という表現では、何も追加で分かることはありません。)

    先ほど気づいたのですが、どうもVC6とVC8で違うようです。いままでVC6でやっていたのですが、VC8ではodl->idlというファイル名に変わっており、IDは続き数字でなくてもよくなったようです。
    過去に VC6 で作っていた ActiveX コントロールのソースコードを確認しましたが、別に続き数字でもなく、C# からの利用でも特に問題はありませんでした。(連番になっていない ODL で問題なし)
    このことから、「できない」のはそのプロジェクト、利用環境、ビルド環境のいずれかに何らかの問題があるのだと推測します。

    # 単純に VC6 のせいではないということ。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク ひろ太 2010年2月5日 11:54
    2010年2月1日 13:44
    モデレータ
  • すみません、どうも私の勘違いだったようで、AzuleanさんのおっしゃるとおりVC6でも続き数字でなくても大丈夫でした。
    以前試したときにうまくいかずできないものと思いこんでしまったようです。 そのときはおそらく他のソースに問題があったのだと思います。
    大変失礼いたしました。
    2010年2月5日 11:56