Я создаю библиотеку типов 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
может быть создан пользователем. Но я хотел бы ограничить его, поэтому единственный способ получить экземпляр One
кокласса - это вызвать NumberFactory.GetNumber("One")
.
Итак, мой вопрос: как следует написать IDL, чтобы пользователь не мог создать экземпляр One
, но по-прежнему имел возможность создавать экземпляр One
изнутри NumberFactory
кокласса и возвращать INumber
интерфейс One
пользователю?
Кроме того, есть ли что-нибудь особенное, что нужно сделать в ATL, чтобы это работало?