미래에이 스레드를 찾는 모든 사용자를 위해 내 자신의 질문에 대답합니다. 그러나, 나는 단지 실험을 기반으로 여기에서 추측하고 있다는 것을 기억하십시오 ... 적어도 특정 상황에서는 효과가있는 것 같지만 잘 모르겠습니다.
첫째, 일부 적절한 헤더 파일 (아마도 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;
}
나는이 미래에 누군가가 도움이되기를 바랍니다. 나는 그것이 잘못되어 나를 다치게하지 않기를 바란다. 내가 말했듯이, 그것은 효과가있는 것처럼 보입니다.
중복 http://stackoverflow.com/questions/1191012/how-to-prevent-coclass-implementations-from-being-exposed-in-an-atl-type-library/1192207#1192207 –
이것은 아닙니다. * 연결된 질문의 사본. 이 질문에서 인터페이스는 Visual Basic (및 DLL 자체 외부의 다른 클라이언트)에 노출됩니다. 그게 제가 피하려고하는 것입니다 *. –