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

7.  Скомпилируйте файл EvtLog.def, выбрав Build > Build EvtLog.exe.

8.  Зарегистрируйте исполняемый файл, введя с клавиатуры командную строку

regsvr32  EvntLog.dll

Следует перейти в каталог, где находится EvtLog.exe.

В листинге 10 также реализована функция DllUnregisterServer, что позволит вам в последствии удалить записи из Реестра.

Листинг 10

#include <afx.h>

// расширения MFC

#include <afxext.h>

#include <afxwin.h>

#include <iostream.h>

#include <basetyps.h>

STDAPI DllRegisterServer(void)

{

DWORD dwAllocBufferLength=500;

LPTSTR IpszBuffer = new TCHAR[dwAllocBufferLength];

HKEY hKey=HKEY_LOCAL_MACHINE;      // обработчик открытого раздела

HKEYhkResultl;      // адрес обработчика открытого раздела

HKEY hkResult2;      // адрес обработчика открытого раздела

DWORD u!0ptions=0;

REGSAM samDesired=KEY_ALL_ACCESS;

DWORD Reserved=0; DWORD dwTypesSupported=7;

DWORD dwCategoryCount=l;

// Получить информацию о расположении файла DLL

if (!GetCurrentDirectory(dWAllocBufferLength, IpszBuffer)) goto Error;

_tcscat (IpszBuffer, "\\EvntLog.dll");

// Настройки Реестра, связанные с протоколированием событий

if (RegOpenKeyEx(hKey, "SYSTEM\\CurrentControlSet\\Services\\EventLog\\

Application", ulOptions, samDesired, ShkResultl)!=ERROR_SUCCESS) goto Error;

if (RegCreateKey(hkResultl, "EvntLog", &hkResult2) !=ERROR_SUCCESS)

{RegCloseKey(hkResultl) ;

goto Error;

}

if (RegSetValueEx(hkResult2, "EventMessageFile", Reserved, REG_EXPAND_SZ, (CONST BYTE *)IpszBuffer, _tcslen(IpszBuffer)) != ERROR_SUCCESS)

{

RegCloseKey(hkResultl);

RegCloseKey(hkResult2);

goto Error;

}

if (RegSetValueEx(hkResult2, "CategoryMessageFile", Reserved, REG_EXPAND_SZ,

(CONST BYTE *)IpszBuffer, _tcslen(IpszBuffer))!= ERROR_SUCCESS)

{

RegCloseKey(hkResultl); RegCloseKey(hkResult2); goto Error;

}

if (RegSetValueEx(hkResult2, "TypesSupported", Reserved, REG_DWORD,

(CONST BYTE *)SdwTypesSupported, sizeof(DWORD)) != ERROR_SUCCESS)

{

RegCloseKey(hkResultl); RegCloseKey(hkResult2); goto Error;

}

if (RegSetValueEx(hkResult2, "CategoryCount",

Reserved, REG_DWORD, (CONST BYTE *)SdwCategoryCount,

sizeof(DWORD))!= ERROR_SUCCESS)

{

RegCloseKey(hkResultl) ;

RegCloseKey(hkResult2);

goto Error;

}

RegCloseKey(hkResultl) ; RegCloseKey(hkResult2) ;

delete  IpszBuffer; return(S_OK);

Error:

delete IpszBuffer.

return(E_UNEXPECTED) ;

}

STDAPI DllUnregisterServer(void)

{

if (RegDeleteKey(HKEY_LOCAL_MACHINE,

"SYSTEMX\CurrentControlSet\\Services\\EventLog\\

Application\\EvE)tLog"

) )

{

return (E_UNEXPECTED);

}

return (S_OK);

}

Записи Реестра, внесенные при регистрации EvntLog.dll

Настало время поговорить о записях Реестра, созданных при регистрации библиотеки EvntLog.dll.

Для того чтобы Журнал событий вызвал вашу DLL, в область Реестра, относящуюся к Журналу, необходимо поместить соответствующую запись. Для добавления приложения следует создать раздел в HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Semces\EventLog\Application\<Имя>, который будет хранить информацию из библиотеки DLL. Здесь <Имя> — это имя приложения. Например, мы создали раздел HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\Services\ EventLog\ Application\ EventLog.

Вы можете создать подраздел в системной области в HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\Services\EventLog\System и в области безопасности HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\Services\EventLog\ Security.

Имя созданного раздела будет именем источника в Журнале событий. Независимо от того, находится ли подраздел, относящийся к Журналу, в разделе безопасности, приложений или системном разделе, он должен иметь следующие четыре пары параметр-значение: