ATLのインターフェイスを非表示にするには

解決


ひで  2004-11-19 23:00:54  No: 55239

初めて質問させて頂きます。

自分で作成したインターフェイスを、同じライブラリの中からしか
使用できないようにするには、どの様にしたらいいのでしょうか?

どの様な事がしたいのかというと、別々のインターフェイスを持つ
ATLオブジェクトA/Bを呼び出すATLオブジェクトCを作成し、C以外は
直接使用禁止(呼び出し時にも見えない)にしたいのです。

※実際には直接使用禁止のオブジェクトが6種類位で、その組み合わ
せを変えて3種類ぐらいのオブジェクトを作成しようと考えています。

とりあえず、A/B/CのオブジェクトをATLウィザードを使用して作成し、
CにA/Bのインターフェイスを呼び出すプロパティを作成ました。
VBで確認して見ましたが、C.A.プロパティ という風に表示できたので
ここ迄は問題ないと思います。
(既にここ迄で必要な操作が抜けてる、もしくは間違っているのだとは
思っていますが・・・)
ただし、ライブラリからCを呼び出そうとした際に、A/BもVBから見え
てしまいます。これを見えないようにしたいのです。

何か情報お持ちの方がいたら教えていただけないでしょうか?

以上、申し訳ありませんがよろしくお願いします。


RAPT  2004-11-23 20:04:54  No: 55240

/*
んー、こんな感じかな?
Windows2000sp4/VC++6.0sp6/Console/cpp

1.スーパークラスは全部protectedにします。
これにより、スーパークラスのインスタンス作成すら禁止されます。

2.サブクラスでprivate継承すれば、それ以上継承したとしても、
スーパークラスへのアクセス権がなくなります。

3.スーパークラスの処理を使用したいときは、
サブクラス側でそのための窓口を作ってやります。

試しに、Implement::printA()、Implement::printB()を
コメントアウトしてコンパイルしてみてください。
エラーになるはずです。

*/

class InterfaceA{
protected:
  InterfaceA(){}
  virtual ~InterfaceA(){}
  void printA(){
    std::cout << "InterfaceA" << std::endl;
  }
};

class InterfaceB{
protected:
  InterfaceB(){}
  virtual ~InterfaceB(){}
  void printB(){
    std::cout << "InterfaceB" << std::endl;
  }
};

class Implement : private InterfaceA, private InterfaceB{
public:
  Implement(){}
  virtual ~Implement(){}
  void printA(){
    // オーバーライドしないとアクセスが拒否される
    InterfaceA::printA();
  }
  void printB(){
    // オーバーライドしないとアクセスが拒否される
    InterfaceB::printB();
  }
  void printC(){
    std::cout << "Implement" << std::endl;
  }
};

int main()
{
  Implement in;
  in.printA();
  in.printB();
  in.printC();

  return 0;
}


ひで  2004-11-24 23:31:53  No: 55241

RAPTさん、ありがとうございます。

ちょっと忙しくて返信が遅くなってしまいました。

うまく説明できませんが下記の用に使用したいという事です。
(VBですが^^;)
Private obj As ATL_TESTLib.C ------ #1

Private Sub Form_Load()
    obj.A.ptyAA = xx      ------ インターフェイスAのプロパティ
    obj.A.mtdAAA()        ------ インターフェイスAのメソッド 
    obj.B.ptyBB = xx      ------ インターフェイスBのプロパティ
    obj.A.ptyBBB()        ------ インターフェイスBのメソッド 
    obj.ptyCC = xx        ------ インターフェイスCのプロパティ
    obj.mtdCCC()          ------ インターフェイスCのメソッド 
End Sub

#1の時、「Lib.」を入れるとA/B/Cが全て表示されてしまうのです。
これを表示させないようにしたい。

と、いろいろ調べている間におそらく解決しました。

修正方法は自分の書き込みにReplyして上げておきます。

ありがとうございました


ひで  2004-11-24 23:55:10  No: 55242

とりあえずIDLファイルを修正して解決しました。

おそらく、他にちゃんとした方法があるのかもしれませんが、
私の用途ではこれで十分でした。
※もし合ったら、だれか教えて下さい。^^;

修正内容は#1/#2で、両方にhiddenをつければ消えました。

以下、「hoge.IDL」の修正内容です。

//省略してます
[
  object,
  uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),
  dual,
  helpstring("IclsA Interface"),
  hidden,                           ----- #1
  pointer_default(unique)
]
interface IclsA: IDispatch
{
  //省略してます
}
//省略してます
interface IclsC: IDispatch
{
  [propget, id(1), helpstring("プロパティ A")] 
            HRESULT A([out, retval] IclsA* *pVal);
  [propput, id(1), helpstring("プロパティ A")]
            HRESULT A([in] IclsA* newVal);
  //省略してます
}

library hogeLib
{
  //省略しています
  [
    uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),
    hidden,                         ----- #2
    helpstring("clsA Class")
  ]
  coclass clsA
  {
    [default] interface IclsA;
  };
//省略しています
}


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加