Interface ATL/COM:定义赢得';是否在DLL之外不可用?

Interface ATL/COM:定义赢得';是否在DLL之外不可用?,interface,private,atlcom,Interface,Private,Atlcom,我有一个基于ATL/COM的DLL,使用VC++6.0制作。它用于使用VB6构建的各种可执行文件 我想添加一些不能通过VB6访问的COM接口,仅用于DLL的内部使用。我希望它们是COM接口而不是C++接口,因为我将在它们上使用它们,而这些对象只有我的COM接口引用(在使用时)。p> 也就是说,我不知道(在使用时)这个指针指向CFoo;我只知道它指向一个IFoo,其中IFoo是一个COM接口,发布后VB6就知道了。从这个IFoo指针,我想得到一个IFooInternal指针,每个实现IFoo(不仅

我有一个基于ATL/COM的DLL,使用VC++6.0制作。它用于使用VB6构建的各种可执行文件

我想添加一些不能通过VB6访问的COM接口,仅用于DLL的内部使用。我希望它们是COM接口而不是C++接口,因为我将在它们上使用它们,而这些对象只有我的COM接口引用(在使用时)。p> 也就是说,我不知道(在使用时)这个指针指向CFoo;我只知道它指向一个IFoo,其中IFoo是一个COM接口,发布后VB6就知道了。从这个IFoo指针,我想得到一个IFooInternal指针,每个实现IFoo(不仅仅是CFoo)的类都将实现它。此外,我不希望IFooInternal可以在DLL本身之外访问;例如,我不希望VB6可以访问IFooInternal


在此方面的任何帮助都将不胜感激。此外,还将提出实现同一总体目标的替代方法的建议。提前感谢。

回答我自己的问题,以方便将来找到此帖子的人。然而,请注意,我只是在这里猜测,基于实验。。。至少在我的特定情况下,这似乎有效,但我不知道

首先,在一些适当的头文件(可能是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++头。< /P> 接下来,在要实现此接口的任何类的标头中,将该接口添加到类声明中:

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

和从那里开始,只是将标准的C++声明和接口函数的定义添加到类:

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

我希望这对将来的人有所帮助。我也希望它不会因为不正确而伤害我。不过,正如我所说,它似乎有效。

重复这不是与您链接的问题重复。在这个问题中,该接口将向Visual Basic(以及DLL本身之外的其他客户端)公开。这正是我想要避免的事情。
public:
   STDMETHOD(get_Something)(long *pVal);
STDMETHODIMP CBlah::get_Something(long *pVal)
{
   if ( !pVal )
   {
      (error handling)
   }

   *pVal = 37;

   return S_OK;
}