初めて質問させて頂きます。
自分で作成したインターフェイスを、同じライブラリの中からしか
使用できないようにするには、どの様にしたらいいのでしょうか?
どの様な事がしたいのかというと、別々のインターフェイスを持つ
ATLオブジェクトA/Bを呼び出すATLオブジェクトCを作成し、C以外は
直接使用禁止(呼び出し時にも見えない)にしたいのです。
※実際には直接使用禁止のオブジェクトが6種類位で、その組み合わ
せを変えて3種類ぐらいのオブジェクトを作成しようと考えています。
とりあえず、A/B/CのオブジェクトをATLウィザードを使用して作成し、
CにA/Bのインターフェイスを呼び出すプロパティを作成ました。
VBで確認して見ましたが、C.A.プロパティ という風に表示できたので
ここ迄は問題ないと思います。
(既にここ迄で必要な操作が抜けてる、もしくは間違っているのだとは
思っていますが・・・)
ただし、ライブラリからCを呼び出そうとした際に、A/BもVBから見え
てしまいます。これを見えないようにしたいのです。
何か情報お持ちの方がいたら教えていただけないでしょうか?
以上、申し訳ありませんがよろしくお願いします。
/*
んー、こんな感じかな?
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;
}
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して上げておきます。
ありがとうございました
とりあえず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;
};
//省略しています
}
ツイート | ![]() |