을 방지하는 방법 coclass 구현에서는 노출에 ATL 형식 라이브러리

StackOverflow https://stackoverflow.com/questions/1191012

  •  19-09-2019
  •  | 
  •  

문제

내가 건축 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 의에서 이를 위해서 일하는가?

도움이 되었습니까?

해결책

  1. IDL에서 Coclass를 제거하십시오
  2. 객체 테이블에서 Coclass를 제거합니다 (Object_entry_auto 제거).
  3. cnumber 클래스를 유지하십시오
  4. getNumber (...)에 대한 코드는 다음과 같습니다.
*pVal = new CComObject<CNumber>();  
(*pVal)->AddRef();

이렇게하면 사용자가 생성 할 코 클라스가 없으며 공장은이를 생산할 수있는 유일한 사람입니다.

다른 팁

분명히 나는 검색을 위해 잘못된 것은...내가 대답을 발견에 관한 질문(사이드 바에서)았음에도 불구하고 그것을 찾을 수 없는 동안 찾기 질문을...

대답은 두 가지입니다:

  1. 추가 noncreatable coclass 정의에서 IDL
  2. 제거 OBJECT_ENTRY_AUTO 항목에서 ATL 헤더 파일(하단에있는 경우가 생성 마법사)

이 MSDN 문서 http://msdn.microsoft.com/en-us/library/4tc639ss.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top