Данный макрос включается автоматически при создании объекта на основе ATL:
///////////////////////////// // Ceee class ATL_NO_VTABLE Ceee: public CComObjectRootEx, public CComCoClass, public IDispatchImpl { public: Ceee() { } DECLARE_REGISTRY_RESOURCEID(IDR_EEE)
Смысл этого макроса обновить системный реестр путем вызова функции UpdateRegistryFromResource():
#define DECLARE_REGISTRY_RESOURCE(x)\ static HRESULT WINAPI UpdateRegistry(BOOL bRegister)\ {\ return _Module.UpdateRegistryFromResource(_T(#x), bRegister);\ }
Эта функция использует идентификатор ресурса для обновления реестра. Вы можете найти этот идентификатор в ресурсах. Там записана информация для помещения в реестр.
Данная методика применяется часто при работе с OLE. Например, если Вы создаете приложение сервер ActiveX, то там то же при запуске приложения производится обновления реестра:
// When a server application is launched stand-alone, it is a good idea // to update the system registry in case it has been damaged. m_server.UpdateRegistry(OAT_INPLACE_SERVER); // Dispatch commands specified on the command line
Этот подход чрезвычайно грамотный на мой взгляд. Запустил приложение, а оно взяло и зарегистрировало компоненты. Именно такая возможность при запуске, а не только при инсталляции. И хотя здесь приложение регистрируем само себя, но не тяжело добавиться и регистрацию других.