Работа с Реестром ОС WindowsNT/2000/XP, страница 8

В листинге 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);

}

Прекращение регистрации исполняемых файлов