2009-04-30 4 views
0

IDL에서 noncreatable coclasses를 다음과 같이 선언 한 이유는 무엇입니까?IDL의 비 가공 할 수있는 균류의 목적은 무엇입니까?

[ 
    uuid(uuidhere), 
    noncreatable 
] 
coclass CoClass { 
    [default] interface ICoClass; 
}; 

어쨌든 이러한 클래스는 COM에 등록되지 않습니다. IDL 파일과 그 IDL 파일을 컴파일하여 생성 된 유형 라이브러리에서 언급해야하는 이유는 무엇입니까?

답변

2

noncreatable 속성은 개체의 소비자에게 힌트 일뿐입니다. 예를 들어 .Net 및 VB6은이 속성을 볼 때 클라이언트가 "일반적인 방법"과 같은 개체를 만드는 것을 허용하지 않습니다. New CoClass()를 호출하여 [VB6].

그러나 COM 서버의 클래스 팩토리는 주어진 클래스의 개체를 만들 수 있는지 여부를 결정할 수있는 확실한 권한입니다. 따라서 실제로 클래스가 noncreatable로 표시 될 수도 있지만 클래스 팩터 리 개체를 만들 수 있습니다. 이러한 상황을 피하려면 클래스 팩토리를 적절하게 업데이트해야합니다.

IDL에서 작성할 수없는 클래스를 언급하는 것은 실제로 선택 사항입니다. 그러나 어쨌든 MIDL은 CLSID_CoClass 상수 등을 만들 것입니다.

+0

이 클래스의 객체가 외부에서 생성되는 것을 원하지 않는 척 해봅시다 - 일부만 인터페이스를 반환하십시오. 검색/생성 방법. IDL에 클래스를 선언하고 그것을 작성 불가능하게 만드는 데 어떤 의미가 있습니까? 왜 그 선언을 생략하지 않습니까? – sharptooth

+0

noncreatable은 당신이 물어 본 것뿐입니다 :). 이 클래스를 그대로두면 다른 클래스의 모든 MS-VBA 호환 도구의 개체보기에있는 모든 기능을 사용할 수 있지만 사용자 지정 작성자를 통해 만들 수는 있지만 만들 수는 없습니다. –

+0

@sharptooth 형식 라이브러리에서 클래스를 모두 생략하면 지원하는 메서드를 어떻게 정의 할 수 있습니까? –

관련 문제