
Шустрый

Профиль
Группа: Участник
Сообщений: 71
Регистрация: 18.12.2004
Где: Кишинёв
Репутация: 1 Всего: 1
|
Спосибо Alexandr87 за эту полезную информацию (я эту инфу пишу от его имени). Цитата | Реестр ,пожалуй, одна из самых замечательных особенностей Windows-действительно насколько удобно ,что все настройки системы, а также программ,установленных на компьютере, находятся в одном месте. На самом деле, работать с реестром очень просто, единственной проблемой, которая может возникнуть, является незнание тонкостей API. Я постараюсь в этой статье рассмотреть некоторые из них, за остальным как обычно посылаю к MSDN. Что нужно уметь делать с реестром? Очевидно, создавать ключи в нем и присваивать им значения.Ключ создается с помощью функции RegCreateKeyEx:
LONG RegCreateKeyEx( HKEY hKey, // хэндл открытого ключа LPCTSTR lpSubKey, // имя "под_ключа" DWORD Reserved, // всегда 0 LPTSTR lpClass, // имя класса DWORD dwOptions, // специальные опции REGSAM samDesired, // уровень защиты\доступа LPSECURITY_ATTRIBUTES lpSecurityAttributes, // параметр важный если хэндл // ключа будет унаследован // дочерним процессом
PHKEY phkResult, // в это поле вернется хэндл // созданного ключа
LPDWORD lpdwDisposition // этот параметр показывает // был ли ключ создан, или // он уже присутствовал и // был просто открыт без // изменения его значения // (обязательно переменная) );
* HKEY hkey-хэндл открытого уже ключа или одно из заранее определенных значений: HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS Windows NT/2000 or later: HKEY_PERFORMANCE_DATA Windows 95/98/Me: HKEY_DYN_DATA
* LPCTSTR lpSubKey-собственно имя ключа,который мы хотим создать (должно заканчиваться символом нуль) * LPTSTR lpClass-для уже существующего ключа игнорируется,вобще почти всегда можно давать этому параметру значение NULL * DWORD dwOptions-формально,оперделяет,когда ключ начнет действовать, приведу выдранный из MSDN кусок,разобраться в нем не сложно:
REG_OPTION_NON_VOLATILE This key is not volatile; this is the default. The information is stored in a file and is preserved when the system is restarted. The RegSaveKey function saves keys that are not volatile.
REG_OPTION_VOLATILE Windows NT/2000 or later: All keys created by the function are volatile. The information is stored in memory and is not preserved when the corresponding registry hive is unloaded. For HKEY_LOCAL_MACHINE, this occurs when the system is shut down. For registry keys loaded by the RegLoadKey function, this occurs when the corresponding RegUnloadKey is performed. The RegSaveKey function does not save volatile keys. This flag is ignored for keys that already exist. Windows 95/98/Me: This value is ignored. If REG_OPTION_VOLATILE is specified, the RegCreateKeyEx function creates nonvolatile keys and returns ERROR_SUCCESS.
REG_OPTION_BACKUP_RESTORE Windows NT/2000 or later: If this flag is set, the function ignores the samDesired parameter and attempts to open the key with the access required to backup or restore the key. If the calling thread has the SE_BACKUP_NAME privilege enabled, the key is opened with ACCESS_SYSTEM_SECURITY and KEY_READ access. If the calling thread has the SE_RESTORE_NAME privilege enabled, the key is opened with ACCESS_SYSTEM_SECURITY and KEY_WRITE access. If both privileges are enabled, the key has the combined accesses for both privileges.
т.к ,к сожалению, на данный момент у меня стоит win98,то этот параметр в ней практически игнорируется.
* REGSAM samDesired-уровень доступа к ключу, подробно описание можно посмотреть во все том же MSDN, скажу только, что для полного доступа значением должно быть KEY_ALL_ACCESS|KEY_READ|KEY_WRITE * LPSECURITY_ATTRIBUTES lpSecurityAttributes-рассмотрение описания данной структуры в тему данной статьи не входит, это скорее относится к многопоточному программированию,кому же очень интересно-идите к ... ну вы поняли В дальнейшем смысл одноименных параметров сохраняется ,поэтому я буду оговаривать только новые значения и кое-что об их формате.
Поскольку зачастую просто лень указывать все значения параметров,я использую иногда функцию RegCreateKey(16-bit):
LONG RegCreateKey( HKEY hKey, LPCTSTR lpSubKey, PHKEY phkResult );
Ключ мы создали,надо ему присвоить значение.Делается это с помощью функции RegSetValueEx:
LONG RegSetValueEx( HKEY hKey, // уже открытый ключ LPCTSTR lpValueName, // имя значения(поля) ключа,которому приваиваем что-то DWORD Reserved, // всегда 0 DWORD dwType, // тип значения CONST BYTE *lpData, // буфер с данными (ДОЛЖЕН ЗАВЕРШАТЬСЯ ДВУМЯ НУЛЯМИ!!!) DWORD cbData // размер данных в байтах );
* DWORD dwType-тип значения может принимать константы REG_SZ (для дефолтового поля), REG_EXPAND_SZ(для строки символов),REG_MULTI_SZ (для типа DWORD). Закрывается хэндл ключа с помощью функции LONG RegCloseKey(HKEY hkey),hkey-хэндл ключа, который надо закрыть.
Открать ключ снова можно функцией RegOpenKeyEx: LONG RegOpenKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, // 0 REGSAM samDesired, PHKEY phkResult );
Смысл и возможные значения параметров аналогичны функции RegCreateKeyEx.
Получить значения полей ключа/инфу о субключах можно используя RegQueryValueEx:
LONG RegQueryValueEx( HKEY hKey, // уже открытый ключ LPCTSTR lpValueName, // имя значения(поля) ключа,из которого читаем LPDWORD lpReserved, // всегда 0 LPDWORD lpType, // тип значения поля возвращается сюда LPBYTE lpData, // буфер для данных LPDWORD lpcbData // размер буфера в байтах );
И наконец удаляется ключ функцией RegDeleteKey:
LONG RegDeleteKey( HKEY hKey, // уже открытый ключ LPCTSTR lpSubKey // имя ключа для удаления );
Обратите внимание, если hkey указывает на HKLM\key\subkey, а lpSubKey="subkey\0",то неудаленным останется HKLM\key,правильный вариант, если надо удалить весь HKLM\key\subkey, то lpSubKey="key\0". При работе с реестром все строки, если это отдельно не оговорено ,должны завершаться нулем. Все упомянутые функции при удачном завершении возвращают ERROR_SUCCESS.
Ну вот ,наверное , все ,что я хотел рассказать о реестре.Чтобы все упомянутое стало немного более понятным приведу небольшой сорс(почти без коментариев),иллюстрирующий предмет статьи:прога открывает ключ ,записывает в него имя файла,из которого она запущена(GetModuleFileName),закрывает ключ,снова его открывает,проверяет его значение и удаляет.
#include <windows.h> #include <stdio.h> int main() { HKEY hkey; const char path[]="c-duke\\test\0"; const char name[]="key\0"; long result=RegCreateKey(HKEY_LOCAL_MACHINE,(char *) &path,&hkey); if (result!=ERROR_SUCCESS) { printf("Cannot open key\n");//здесь и далее так обрабатываются return -1; //ошибки } char p[256]; unsigned long len=GetModuleFileName(NULL,p,256); p[len]=0x00; result=RegSetValueEx(hkey,(char *) &name,0,REG_EXPAND_SZ, (byte *)p,lstrlen(p)+1);//p-double NULL terminated if (result!=ERROR_SUCCESS) { printf("failed to write key value\n"); return -1; } result=RegCloseKey(hkey); if (result!=ERROR_SUCCESS) { printf("failed to close key \n"); return -1; } result=RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0, KEY_ALL_ACCESS|KEY_READ|KEY_WRITE,&hkey); if (result!=ERROR_SUCCESS) { printf("failed to open key \n"); return -1; } len=lstrlen(p)+1; result=RegQueryValueEx(hkey,name,NULL,NULL,(byte *)&p,&len); if (result!=ERROR_SUCCESS) { printf("failed to query key value \n"); return -1; } printf("key value:%s\n",p); result=RegDeleteKey(HKEY_LOCAL_MACHINE,"c-duke\0"); //надо указывать корневой ключ if (result!=ERROR_SUCCESS) { printf("failed to delete key \n"); return -1; } result=RegCloseKey(hkey); if (result!=ERROR_SUCCESS) { printf("failed to close key \n"); return -1; } return 0; }
--------------------------------------------------------------------------------
Date :19.10.2002 Author:C-Duke E-mail:c-duke#cydem.zp.ua
--------------------
|
|