Поделиться через


Образец MFCATL: использование COM-объектов ATL в сервере MFC

Обновлен: Ноябрь 2007

В образце MFCATL показано, как можно использовать COM-объекты ATL в EXE-файлах сервера MFC.

Сервер позволяет создавать два объекта: ObjectOne (реализованный в MFC и поддерживающий dispinterface) и ObjectTwo (реализованный в ATL и поддерживающий сдвоенный интерфейс).

s5ky1ss3.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

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

Чтобы получить образцы и инструкции по их установке, выполните следующие действия.

  • В меню Справка среды Visual Studio выберите пункт Примеры.

    Дополнительные сведения см. в разделе Поиск файлов примеров.

  • Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.

  • Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.

Построение и запуск образца

Построение и запуск образца

  1. Откройте файл решения mfcatl.sln.

  2. В меню Построение выберите команду Построить решение.

  3. В меню Отладка выберите команду Запуск без отладки. Сервер mfcatl.exe будет запущен в изолированном режиме и зарегистрирован.

  4. Откройте файл mfcatl.htm в веб-обозревателе и нажатием кнопок вызовите соответствующие объекты. Можно вызвать каждый объект по отдельности или оба одновременно.

Замечания о преобразовании

Первоначально оба объекта MFCATL были реализованы в MFC. Оба были производными от класса CCmdTarget. Объект ObjectTwo был повторно реализован с помощью ATL путем выполнения следующих действий.

  1. Включение файлов заголовка ATL (Atlbase.h и Atlcom.h) в файл Premfcat.h.

  2. Включение файла Atlimpl.cpp в Premfcat.cpp.

  3. Добавление класса, производного от CComModule, в файл Prefcat.h (аналогично образцу EXE BEEPER). В производном классе реализованы методы Lock и Unlock для перенаправления количества блокировок в MFC путем вызова методов AfxOleLockApp и AfxOleUnlockApp.

  4. Добавление пары макросов для схемы объектов (BEGIN_OBJECT_MAP/END_OBJECT_MAP) в файл Mfcatl.cpp и добавление статического экземпляра класса модуля с именем _Module.

  5. Вызов методов _Module.Init и Term из InitInstance и ExitInstance.

  6. Добавление typelib в качестве ресурса.

  7. Вызов метода _Module.RegisterServer(TRUE) из InitInstance в соответствии с вызовом MFC для COleObjectFactory::UpdateRegistryAll.

  8. Вызов методов _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE) в соответствии с REGCLS_MULTIPLEUSE в фабриках классов MFC, что неявно выполняется макросом IMPLEMENT_OLECREATE.

  9. Повторная реализация ObjectTwo в ATL путем выполнения следующих действий.

    • Изменение ODL-файла с интерфейса dispinterface на сдвоенный интерфейс.

    • Создание файла заголовка (Interf.h), необходимого ATL, в компиляторе ODL.

    • Повторное создание H-файлов и CPP-файлов (быстрее всего это выполняется путем запуска мастеров ATL и копирования, вставки и переименования автоматически созданного кода вместо исходного кода MFC).

    • Добавление OBJECT_ENTRY(CLSID_ObjectTwo, CObjectTwo) в схему объектов ATL.

Могут выполняться и дополнительные этапы преобразования (не описанные здесь), в том числе следующие.

  • Преобразование ODL-файла в формат IDL.

  • Добавление поддержки для аргументов командной строки -RegServer и -UnregServer.

Ключевые слова

В этом образце используются следующие ключевые слова:

AfxMessageBox; AfxOleInit; AfxOleLockApp; AfxOleUnlockApp; ASSERT; BEGIN_COM_MAP; CCmdTarget; CCmdTarget::OnFinalRelease; CComCoClass; CComModule; CComModule::GetLockCount; CComModule::Lock; CComModule::Unlock; CComObjectRoot; CDialog; CMenu::AppendMenu; COleObjectFactory::RegisterAll; COleObjectFactory::UpdateRegistryAll; COM_INTERFACE_ENTRY; CString::IsEmpty; CString::LoadString; CWindow::GetSystemMenu; DECLARE_DYNCREATE; DECLARE_NOT_AGGREGATABLE; DECLARE_REGISTRY; DestroyWindow; EnableAutomation; GetClientRect; GetSystemMetrics; IDispatchImpl; PostMessage; SendMessage; SetIcon; ShowWindow; SysAllocString

См. также

Другие ресурсы

Образцы ATL