을 방지하는 방법 coclass 구현에서는 노출에 ATL 형식 라이브러리
문제
내가 건축 ATL 형식 라이브러리와 함께 클래스 형식 공장입니다.뭔가를 그렇다고 다음과 같다:
[ object, uuid(...), ... ]
interface INumber : IDispatch {
[propget, id(0)] HRESULT Value([out, retval] LONG* pVal);
}
[ object, uuid(...), ... ]
interface INumberFactory : IDispatch {
[id(1)] HRESULT GetNumber([in] BSTR numberName, [out, retval] INumber* pVal);
}
[ uuid(...) ]
coclass NumberFactory {
[default] interface INumberFactory;
}
사용자는 다음의 인스턴스를 구현하는 클래스 INumber
인터페이스를 통해 NumberFactory
.
이,하지만 잘 작동할 수 없는 방법을 정의하고 인스턴스화 ATL 반환하는 개체를 통해 NumberFactory.GetNumber()
방법입니다.를 정의하는 경우에 숫자 IDL 다음과 같다:
[ uuid(...) ]
coclass One {
[default] interface INumber;
}
이 One
coclass 인스턴스화할 수 있습니다.그러나 나는 것을 제한하도록 그것을 얻을 수있는 유일한 방법의 인스턴스 One
coclass 를 호출하여 NumberFactory.GetNumber("One")
.
그래서 제 질문은:어떻게해야 IDL 쓰도록 사용자는 인스턴스화할 수 없습니다 One
, 지만,여전히 수 있 인스턴스화 One
내에서 다음 NumberFactory
coclass 환 INumber
의 인터페이스 One
하는 사용자가?
또한,한 특별한 일이 있는 것에서 수행해야 합 ATL 의에서 이를 위해서 일하는가?
해결책
- IDL에서 Coclass를 제거하십시오
- 객체 테이블에서 Coclass를 제거합니다 (Object_entry_auto 제거).
- cnumber 클래스를 유지하십시오
- getNumber (...)에 대한 코드는 다음과 같습니다.
*pVal = new CComObject<CNumber>(); (*pVal)->AddRef();
이렇게하면 사용자가 생성 할 코 클라스가 없으며 공장은이를 생산할 수있는 유일한 사람입니다.
다른 팁
분명히 나는 검색을 위해 잘못된 것은...내가 대답을 발견에 관한 질문(사이드 바에서)았음에도 불구하고 그것을 찾을 수 없는 동안 찾기 질문을...
대답은 두 가지입니다:
- 추가
noncreatable
coclass 정의에서 IDL - 제거
OBJECT_ENTRY_AUTO
항목에서 ATL 헤더 파일(하단에있는 경우가 생성 마법사)
이 MSDN 문서 http://msdn.microsoft.com/en-us/library/4tc639ss.aspx