Образец MFCATL: использование COM-объектов ATL в сервере MFC
Обновлен: Ноябрь 2007
В образце MFCATL показано, как можно использовать COM-объекты ATL в EXE-файлах сервера MFC.
Сервер позволяет создавать два объекта: ObjectOne (реализованный в MFC и поддерживающий dispinterface) и ObjectTwo (реализованный в ATL и поддерживающий сдвоенный интерфейс).
Примечание о безопасности. |
---|
Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению. |
Чтобы получить образцы и инструкции по их установке, выполните следующие действия.
В меню Справка среды Visual Studio выберите пункт Примеры.
Дополнительные сведения см. в разделе Поиск файлов примеров.
Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.
Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.
Построение и запуск образца
Построение и запуск образца
Откройте файл решения mfcatl.sln.
В меню Построение выберите команду Построить решение.
В меню Отладка выберите команду Запуск без отладки. Сервер mfcatl.exe будет запущен в изолированном режиме и зарегистрирован.
Откройте файл mfcatl.htm в веб-обозревателе и нажатием кнопок вызовите соответствующие объекты. Можно вызвать каждый объект по отдельности или оба одновременно.
Замечания о преобразовании
Первоначально оба объекта MFCATL были реализованы в MFC. Оба были производными от класса CCmdTarget. Объект ObjectTwo был повторно реализован с помощью ATL путем выполнения следующих действий.
Включение файлов заголовка ATL (Atlbase.h и Atlcom.h) в файл Premfcat.h.
Включение файла Atlimpl.cpp в Premfcat.cpp.
Добавление класса, производного от CComModule, в файл Prefcat.h (аналогично образцу EXE BEEPER). В производном классе реализованы методы Lock и Unlock для перенаправления количества блокировок в MFC путем вызова методов AfxOleLockApp и AfxOleUnlockApp.
Добавление пары макросов для схемы объектов (BEGIN_OBJECT_MAP/END_OBJECT_MAP) в файл Mfcatl.cpp и добавление статического экземпляра класса модуля с именем _Module.
Вызов методов _Module.Init и Term из InitInstance и ExitInstance.
Добавление typelib в качестве ресурса.
Вызов метода _Module.RegisterServer(TRUE) из InitInstance в соответствии с вызовом MFC для COleObjectFactory::UpdateRegistryAll.
Вызов методов _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE) в соответствии с REGCLS_MULTIPLEUSE в фабриках классов MFC, что неявно выполняется макросом IMPLEMENT_OLECREATE.
Повторная реализация 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