Какова цель необработанных коклассов в IDL? - PullRequest
0 голосов
/ 30 апреля 2009

По какой причине в IDL объявляются необработанные коклассы, подобные следующим?

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

Я имею в виду, что такой класс не будет зарегистрирован в COM в любом случае. В чем причина упоминания об этом в файле IDL и в библиотеке типов, созданной путем компиляции этого файла IDL?

Ответы [ 2 ]

2 голосов
/ 01 мая 2009

Неприменимый атрибут - это всего лишь подсказка потребителю объекта - например, .Net и VB6, увидев этот атрибут, не позволят клиенту создать объект «обычным способом», например, вызывая New CoClass () [VB6].

Тем не менее, фабрика классов COM-сервера является определенным органом для принятия решения о том, позволяет ли она создавать объекты данного класса или нет - так что на самом деле, возможно, что класс помечен как необработанный, и, тем не менее, фабрика классов позволяет объекты, которые будут созданы. Чтобы избежать подобных ситуаций, убедитесь, что вы обновили фабрику классов соответствующим образом.

Упоминание необработанных классов в IDL фактически необязательно. Однако обратите внимание, что вы в любом случае получаете по крайней мере одно преимущество: midl создаст константы CLSID_CoClass и т. Д.

1 голос
/ 30 апреля 2009

noncreatable - это хорошо, если вы хотите, чтобы клиенты не могли создавать экземпляры объекта с фабрикой классов по умолчанию, но при этом иметь правильный CLSID для ведения журнала, отладки & c; см. пример на http://www.eggheadcafe.com/software/aspnet/29555436/noncreatable-atl-object.aspx проблемы, которая правильно решена таким образом.

...