В листинге 2 показан пример кода, в котором используется функция DllRegisterServer. Этот код может быть помещен в библиотеку DLL.
Листинг 2
STDAPI DllRegisterServer(void)
{
HKEY hkKey=NULL;
if (RegCreateKey(HKEY_LOCAL_MACHINE,
"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\TestApp",
ShkKey)!=ERROR_SUCCESS) return (E_UNEXPECTED);
if (RegSetValue(hkKey, NULL, REG_SZ, "Foo", _tcslen("Foo"))!=ERROR SUCCESS)
{if (hkKey) RegCloseKey(hkKey) ;
return (E UNEXPECTED);
}
if (hkKey) RegCloseKey(hkKey) ;
return (S_OK); }
}
Создание библиотек DLL, прекращающих регистрацию
При создании библиотек DLL, прекращающих регистрацию, вы должны реализовать функцию DllUnregisterServer. Следует использовать те же самые коды возврата, что и для DllRegisterServer, а также один дополнительный код — S_FALSE. Он означает, что функция DllUnregisterServer удалит все известные разделы Реестра и пары параметр-значение, хотя в Реестре могут существовать другие записи.
В листинге 3 показан пример кода, в котором определяется функция DllUnregisterServer. В этом примере уничтожаются разделы, созданные в листинге 5.1.
Листинг 3
STDAPI DllUnregisterServer(void) {
if (RegDeleteKey( HKEY_LOCAL_MACHINE,
"SYSTEMX\CurrentControlSet\\Services\\EventLog\\Application\\TestApp"))
return (E_UNEXPECTED) ;
return (S_OK);
}
Регистрация и прекращение регистрации элементов управления ActiveX
Элементы управления ActiveX также можно зарегистрировать в Реестре или прекратить их регистрацию. О них мы подробно поговорим в главе 6. Находясь в библиотеках OCX, они могут экспортировать и DllRegisterServer и DllUnregisterServer. Программа regsvr32 работает с библиотеками OCX точно так же, как и с библиотеками DLL.
В листинге 4 показано определение функции DllRegisterServer в элементе управления ActiveX.
Листинг 4
STDAPI DllRegisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!Afx01eRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (ICOleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
В листинге 5 показан пример кода, в котором определяется функция DllUnregisterServer для того же элемента управления ActiveX, что и в листинге 4.
Листинг 5
STDAPI DllUnregisterServer(void) {
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!Afx01eUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR; }
Регистрация исполняемых файлов
Так как исполняемые файлы не могут экспортировать процедуры как библиотеки DLL или OCX, то исполняемые файлы следует регистрировать путем вызова их с аргументом командной строки /REGSERVER. Чтобы зарегистрировать исполняемый файл, вызовите его следующим образом:
regexe.exe /REGSERVER
Выполнение исполняемого файла с таким ключом эквивалентно вызову функции DllRegisterServer в DLL. Исполняемый файл не будет выполнять свою основную задачу, он просто произведет необходимые настройки в Реестре.
В листинге 6 показан пример кода, в котором выполняется регистрация исполняемого файла.
Листинг 6
#include <stdio.h>
#include <string.h>
#include <afx.h>
#include <winreg.h>
int main(int argc, char *argv[ ], char *envp[ ])
{
// Код, выполняющий регистрацию
if (argc==2)
{
if (!strcmp(argv[l] , "/REGSERVER"))
{
HKEY hkKey=NULL;
if (RegCreateKey( HKEY_LOCAL MACHINE, "SOFTWARE\\Widget Ware\\TestApp",
ShkKey)!=ERROR_SUCCESS) return (1);
if (RegSetValue(hkKey, NULL, REG_SZ, "Foo", _tcslen("Foo") ) !=ERROR SUCCESS) {
if (hkKey) RegCloseKey(hkKey);
return (1); }
if (hkKey) RegCloseKey(hkKey);
return (0);
}}
// Обычный код программы
return (0);
}
Прекращение регистрации исполняемых файлов
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.