Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реестр, Просто и мягко 
:(
    Опции темы
InfMag
Дата 16.1.2005, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Прошу рассказать мне о применении реестра, как к нему подрубаться, открывать разедлы, писать, удалять и т.п.
Зы. Плиз, составьте хоть один маленький примерчик...
PM   Вверх
Nicky
Дата 16.1.2005, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 18.12.2004
Где: Кишинёв

Репутация: 1
Всего: 1



Вот тебе примерчик, но я могу ещё и рассказать как можно достать такие примеры НАЖАТИЕМ ВОЛШЕБНОЙ КЛАВИШИ F1 если хочешь конечно smile
Код

//This OnClick event handler deletes all values saved in the registry under they key named in an edit control.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TRegistry Reg = new TRegistry;
 try
 {
   Reg->RootKey = HKEY_LOCAL_MACHINE; // Section of registry to look for
   if (!Reg->OpenKey(Edit1->Text,false))
     ShowMessage("Error opening key");
   else
   {
     TStringList Val = new TStringList;
     try
     {
       Reg->GetValueNames(Val);
       for (int i = 0; i < Val->Count; i++)

       {
         ShowMessage(Edit1->Text + "\n" +
                     "has an Entry Called "+Val->Strings[i]+"\n"+
                     "With a Value of "+Reg->ReadString(Val->Strings[i]));
       }
       if (Application->MessageBox("OK to delete the key and lose these values?",
                                   "Delete?", MB_YESNO) == IDYES)
         Reg->DeleteKey(Edit1->Text);
     }
     __finally
     {
       delete Val;

     }
   }
 }
 __finally
 {
   delete Reg;
 }
}

PM MAIL ICQ   Вверх
Nicky
Дата 27.1.2005, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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



--------------------

PM MAIL ICQ   Вверх
NiJazz
Дата 27.1.2005, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



InfMag
Смотри в справке методы класса TRegistry.
PM MAIL   Вверх
Nicky
Дата 27.1.2005, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 18.12.2004
Где: Кишинёв

Репутация: 1
Всего: 1



Спосибо большое smile
Я до сих пор по тупому икал,никак не мог найти... smile
PM MAIL ICQ   Вверх
lynx_916
Дата 30.1.2005, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 13.6.2004
Где: Молдова

Репутация: нет
Всего: 1



Nicky а вот студийный апишный фак нафиг нужен? ведь просто и мягко просили...хехе


--------------------
Who dares, wins. (с) Solid Snake
PM MAIL ICQ YIM MSN   Вверх
InfMag
Дата 6.2.2005, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Ой! А я забыл сказать спасибо!
Спасибо! smile smile
PM   Вверх
InfMag
Дата 6.2.2005, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Nicky
Стоп, он мне мол долбит, что ниче не знает про TRegistry... Нада какой-то include дописать?
Добавлено @ 22:06
Блин, слава богу я со справкой подружился...
Пишем:
#include <registry.hpp>
PM   Вверх
Nicky
Дата 7.2.2005, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 18.12.2004
Где: Кишинёв

Репутация: 1
Всего: 1



Если честно я только начинающий и ешё многое не успел проверить на своём опыте. Я просто пытаюсь делится с имеющейся информацией и добывать новую. smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0820 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.