1

VC++6.0を使用して作成されたATL/COMベースのDLLがあります。これは、VB6を使用して構築されたさまざまな実行可能ファイルに使用されます。

DLLの内部使用のみを目的として、VB6経由でアクセスできないCOMインターフェイスをいくつか追加したいと思います。(使用時に)COMインターフェイス参照しかないオブジェクトで使用するため、C++インターフェイスではなくCOMインターフェイスにします。

つまり、このポインタがCFooを指していることを(使用時に)知りません。私はそれがIFooを指していることを知っています。IFooはCOMインターフェイスであり、VB6がそれを認識できるように公開されています。このIFooポインターから、IFooを実装するすべてのクラス(CFooだけでなく)が実装するIFooInternalポインターを取得したいと思います。さらに、DLL自体の外部からIFooInternalにアクセスできるようにしたくありません。たとえば、VB6からIFooInternalにアクセスできるようにしたくありません。

これに関する助けをいただければ幸いです。同じ全体的な目標を達成するための代替方法の提案もあります。前もって感謝します。

4

2 に答える 2

2

将来このスレッドを見つけた人の利益のために、私自身の質問に答えます。ただし、ここでは実験に基づいて推測しているだけであることに注意してください...少なくとも私の特定の状況ではうまくいくようですが、わかりません。

まず、適切なヘッダー ファイル (おそらく Hidden.h) に次のコードを記述し、新しく生成されたUUIDを新しく生成された UUID に置き換えます。

#ifndef __Hidden_h__
#define __Hidden_h__

extern "C" {

#ifndef __IHidden_FWD_DEFINED__
#define __IHidden_FWD_DEFINED__
typedef interface IHidden IHidden;
#endif // __IHidden_FWD_DEFINED__

#ifndef __IHidden_INTERFACE_DEFINED__
#define __IHidden_INTERFACE_DEFINED__

EXTERN_C const IID IID_IHidden;

MIDL_INTERFACE("a newly generated UUID")  
IHidden : public IUnknown
{
    public:
        virtual HRESULT STDMETHODCALLTYPE get_Something (
            long __RPC_FAR *pVal ) = 0; 
};

#endif // __IHidden_INTERFACE_DEFINED__

}

#endif // __Hidden_h__

関数の他の種類のパラメーターなどを定義する方法については、IDL ファイルから MIDL によって生成された C++ ヘッダーを参照してください。

次に、このインターフェイスを実装する任意のクラスのヘッダーで、インターフェイスをクラス宣言に追加します。

class ATL_NO_VTABLE CBlah :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CBlah, &CLSID_CBlah>,
   public ISupportErrorInfo,
   public IConnectionPointContainerImpl<CBlah>,
   public IBlah,
   public IHidden

また、COM_MAP に追加します。

BEGIN_COM_MAP(CBlah)
   COM_INTERFACE_ENTRY(IBlah)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
   COM_INTERFACE_ENTRY(IConnectionPointContainer)
   COM_INTERFACE_ENTRY(IHidden)
END_COM_MAP

それ以降は、標準の C++ 宣言とインターフェイスの関数の定義をクラスに追加するだけです。

public:
   STDMETHOD(get_Something)(long *pVal);

(...)

STDMETHODIMP CBlah::get_Something(long *pVal)
{
   if ( !pVal )
   {
      (error handling)
   }

   *pVal = 37;

   return S_OK;
}

これが将来誰かに役立つことを願っています。また、それが間違っているために私を傷つけないことを願っています。おっしゃる通りですが、効果はありそうです。

于 2009-10-01T21:04:11.330 に答える