Хобрук: Ваш путь к мастерству в программировании

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

Итак, мой вопрос: как следует написать IDL, чтобы пользователь не мог создать экземпляр One, но по-прежнему имел возможность создавать экземпляр One изнутри NumberFactory кокласса и возвращать INumber интерфейс One пользователю?

Кроме того, есть ли что-нибудь особенное, что нужно сделать в ATL, чтобы это работало?

27.07.2009

Ответы:


1
  1. Удалите CoClass из IDL
  2. Удалите CoClass из таблицы объектов (удалите его OBJECT_ENTRY_AUTO)
  3. Сохраните класс CNumber
  4. Ваш код для GetNumber (...) должен выглядеть примерно так:
*pVal = new CComObject<CNumber>();  
(*pVal)->AddRef();

Таким образом, пользователь не может создавать CoClass, и ваша фабрика - единственная, кто может их производить.

28.07.2009
  • Отлично! Это именно то, что мне нужно! Спасибо! На самом деле это делает то, что я искал, лучше, чем то, что я нашел, лол ... 29.07.2009
  • Вам также необходимо удалить наследование от CComCoClass ‹CNumber›. 03.03.2015

  • 2

    По-видимому, я искал не то ... Я нашел ответ в связанном вопросе (на боковой панели), хотя мне не удалось найти его во время поиска, прежде чем задать вопрос ...

    Ответ двоякий:

    1. Добавить noncreatable в определение кокласса в IDL
    2. Удалите запись OBJECT_ENTRY_AUTO из файла заголовка ATL (внизу, если создается мастером)

    См. Эту статью MSDN: http://msdn.microsoft.com/en-us/library/4tc639ss.aspx

    27.07.2009
  • Фактически, атрибут noncreatable - лучший способ объявить классы PublicNotCreatable, потому что вы можете определить исходный интерфейс и разрешить клиентам [VB6] затемнять компонентный класс WithEvents. В противном случае клиентам придется напрямую использовать интерфейс. 29.07.2009
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...