2009-10-01 5 views
0

VC++ 6.0을 사용하여 만든 ATL/COM 기반 DLL이 있습니다. 그것은 VB6를 사용하여 만들어진 다양한 실행 파일에 사용됩니다.ATL/COM : DLL 외부에서 사용할 수없는 COM 인터페이스 정의?

나는 단지 DLL의 내부 사용을 위해, VB6를 통해 액세스 할 수 없습니다 일부 COM 인터페이스를 추가 할. COM 인터페이스를 사용하는 객체에서만 사용한다는 사실 때문에 C++ 인터페이스가 아닌 COM 인터페이스가되기를 원합니다. 나는 (사용시) 몰라

하는 CFoo이 포인터 포인트; IFoo가 IFoo를 가리키고 있다는 것을 알고 있습니다. IFoo는 VB6이 그것에 대해 알고 있도록 COM 인터페이스입니다. 이 IFoo 포인터에서, IFoo (단순히 CFoo가 아니라)를 구현하는 모든 클래스가 구현할 IFooInternal 포인터를 얻고 싶습니다. 게다가 IFooInternal이 DLL 자체 외부에서 액세스 가능하기를 원하지 않습니다. 예를 들어 IFooInternal이 VB6에서 액세스 할 수 없도록하고 싶습니다.

이 문제에 도움을 주시면 매우 감사하겠습니다. 동일한 전반적인 목표를 달성하기위한 대체 방법에 대한 제안도있을 것입니다. 미리 감사드립니다.

+0

중복 http://stackoverflow.com/questions/1191012/how-to-prevent-coclass-implementations-from-being-exposed-in-an-atl-type-library/1192207#1192207 –

+0

이것은 아닙니다. * 연결된 질문의 사본. 이 질문에서 인터페이스는 Visual Basic (및 DLL 자체 외부의 다른 클라이언트)에 노출됩니다. 그게 제가 피하려고하는 것입니다 *. –

답변

1

미래에이 스레드를 찾는 모든 사용자를 위해 내 자신의 질문에 대답합니다. 그러나, 나는 단지 실험을 기반으로 여기에서 추측하고 있다는 것을 기억하십시오 ... 적어도 특정 상황에서는 효과가있는 것 같지만 잘 모르겠습니다.

첫째, 일부 적절한 헤더 파일 (아마도 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; 
} 

나는이 미래에 누군가가 도움이되기를 바랍니다. 나는 그것이 잘못되어 나를 다치게하지 않기를 바란다. 내가 말했듯이, 그것은 효과가있는 것처럼 보입니다.