C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как производить поиск в Реестре!!!, Как производить поиск в Реестре!!!
Alex83
  Отправлено: 10.03.2004, 13:18


Ученик-кочегар

Группа: Участник
Сообщений: 25



Мне надо производить поиск в реестре !!!
допустим мне надо найти путь к ключу с именем "qwer"
как это сделать?
olegenty
Отправлено: 10.03.2004, 13:55


Ветеран

Группа: Модератор
Сообщений: 2412



Есть такой класс TRegistry.
Ты справку читать не пробовал? Будет примерно так:
CODE

TRegistry *r = new TRegistry();
// Реально вместо "\\Software" — твой ключ для поиска
// Корень определяется свойством r->RootKey, например:
// r->RootKey = HKEY_LOCAL_MACHINE;
// по умолчанию — HKEY_CURRENT_USER
if (r->OpenKey("\\Software", false))
{
   TStringList *l = new TStringList();
   // получаешь список входящих ключей;
   r->GetKeyNames(l);
   for (int i = 0; i < l->Strings->Count; i++)
   {
       if (l->Strings[i] == "qwer")
       {
           ShowMessage("Путь: " +  r->CurrentKey + "\\" + l->Strings[i]);
       }
   }
   
} else
{
   ShowMessage("Что-то не срослось")
}


писал навскидку по памяти, и, тебе будет нужна рекурсия, либо итерация, на твой вкус.
Gedeon
Отправлено: 10.03.2004, 15:33


Ветеран

Группа: Модератор
Сообщений: 1742



Да воспользуйтесь поиском по форуму со словом TRegistry — Инфы куча
Alex83
Отправлено: 10.03.2004, 16:05


Ученик-кочегар

Группа: Участник
Сообщений: 25



Что товой код твой не работает куча ошибок!!!
olegenty
Отправлено: 10.03.2004, 16:16


Ветеран

Группа: Модератор
Сообщений: 2412



Потерпи до завтра, рабочий опубликую.
olegenty
Отправлено: 10.03.2004, 17:10


Ветеран

Группа: Модератор
Сообщений: 2412



Вот тебе протестированный рабочий код (на форме компонент TTreeView *t и кнопка TButton *TButton1):

[CODE]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TRegistry *r = new TRegistry();

r->RootKey = HKEY_LOCAL_MACHINE;
if (r->OpenKey("\\", false))
{
TTreeNode *n = t->Items->AddChild(NULL, "HKEY_LOCAL_MACHINE");
TStringList *s = new TStringList();
r->GetKeyNames(s);
for (int i = 0; i < s->Count; i++)
{
TTreeNode *c = t->Items->AddChild(n, s->Strings[i]);
AnsiString asCurrentPath = r->CurrentPath;
if ((r->OpenKey(asCurrentPath + "\\" + s->Strings[i], false)) &&
(r->HasSubKeys()))
{
BuildNode(c, r, asCurrentPath + "\\" + s->Strings[i]);
}
r->OpenKey(asCurrentPath + "\\", false);
}
}
r->RootKey = HKEY_CURRENT_USER;
if (r->OpenKey("\\", false))
{
TTreeNode *n = t->Items->AddChild(NULL, "HKEY_CURRENT_USER");
TStringList *s = new TStringList();
r->GetKeyNames(s);
for (int i = 0; i < s->Count; i++)
{
TTreeNode *c = t->Items->AddChild(n, s->Strings[i]);
AnsiString asCurrentPath = r->CurrentPath;
if ((r->OpenKey(asCurrentPath + "\\" + s->Strings[i], false)) &&
(r->HasSubKeys()))
{
BuildNode(c, r, asCurrentPath + "\\" + s->Strings[i]);
}
r->OpenKey(asCurrentPath + "\\", false);
}
}
delete r;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BuildNode(TTreeNode *p, TRegistry *r, AnsiString asTopPath)
{
TStringList *s = new TStringList();
r->GetKeyNames(s);
for (int i = 0; i < s->Count; i++)
{
TTreeNode *c = t->Items->AddChild(p, s->Strings[i]);
if ((r->OpenKey(asTopPath + "\\" + s->Strings[i], false)) &&
(r->HasSubKeys()))
{
BuildNode(c, r, asTopPath + "\\" + s->Strings[i]);
}
r->OpenKey(asTopPath + "\\", false);
}
}
[CODE]
Alex83
Отправлено: 10.03.2004, 19:39


Ученик-кочегар

Группа: Участник
Сообщений: 25



В этом коде что не ладится компилятор не пропускает
(TTreeNode *n или TTreeView *t)
olegenty
Отправлено: 11.03.2004, 07:54


Ветеран

Группа: Модератор
Сообщений: 2412



t — TTreeView, лежит на форме. Всё ладится, я сначала у себя запустил.
Button1 — TButton.
olegenty
Отправлено: 11.03.2004, 08:03


Ветеран

Группа: Модератор
Сообщений: 2412



Файл проекта
RegSearch.bpr
CODE

<?xml version='1.0' encoding='utf-8' ?>
<!-- C++Builder XML Project -->
<PROJECT>
 <MACROS>
   <VERSION value="BCB.06.00"/>
   <PROJECT value="RegSearch.exe"/>
   <OBJFILES value="RegSearch.obj FormMain.obj"/>
   <RESFILES value="RegSearch.res"/>
   <IDLFILES value=""/>
   <IDLGENFILES value=""/>
   <DEFFILE value=""/>
   <RESDEPEN value="$(RESFILES) FormMain.dfm"/>
   <LIBFILES value=""/>
   <LIBRARIES value=""/>
   <SPARELIBS value="vcl.lib rtl.lib"/>
   <PACKAGES value="vcl.bpi rtl.bpi dbrtl.bpi adortl.bpi vcldb.bpi vclx.bpi bdertl.bpi
     vcldbx.bpi ibxpress.bpi dsnap.bpi cds.bpi bdecds.bpi qrpt.bpi teeui.bpi
     teedb.bpi tee.bpi dss.bpi teeqr.bpi visualclx.bpi visualdbclx.bpi
     dsnapcrba.bpi dsnapcon.bpi bcbsmp.bpi vclie.bpi xmlrtl.bpi inet.bpi
     inetdbbde.bpi inetdbxpress.bpi inetdb.bpi nmfast.bpi webdsnap.bpi
     bcbie.bpi websnap.bpi soaprtl.bpi dclocx.bpi dbexpress.bpi dbxcds.bpi
     indy.bpi bcb2kaxserver.bpi MultilineTab6.bpi elpackB6.bpi rxctl6.bpi
     rxdb6.bpi rxbde6.bpi OfficeVCL6.bpi tb2k_cb6.bpi FIBPlus_CB6.bpi
     EhLibB60.bpi"/>
   <PATHCPP value=".;"/>
   <PATHPAS value=".;"/>
   <PATHRC value=".;"/>
   <PATHASM value=".;"/>
   <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
   <RELEASELIBPATH value="$(BCB)\lib\release"/>
   <LINKER value="ilink32"/>
   <USERDEFINES value="_DEBUG"/>
   <SYSDEFINES value="_RTLDLL;NO_STRICT;USEPACKAGES"/>
   <MAINSOURCE value="RegSearch.cpp"/>
   <INCLUDEPATH value=""E:\Program Files\Borland\CBuilder6\Projects";E:\dev\Registry;$(BCB)\include;$(BCB)\include\vcl;E:\prg6\DexExPS\Lib;E:\prg6\DexExPS\Sources"/>
   <LIBPATH value=""E:\Program Files\Borland\CBuilder6\Projects";E:\dev\Registry;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;E:\prg6\FIBPlus52\sources;E:\prg6\FIBPlus52\sources\Editors;E:\prg6\DexExPS\Lib;E:\prg6\DexExPS\Sources"/>
   <WARNINGS value="-w-par"/>
   <OTHERFILES value=""/>
 </MACROS>
 <OPTIONS>
   <IDLCFLAGS value="-I"E:\Program Files\Borland\CBuilder6\Projects" -IE:\dev\Registry
     -I$(BCB)\include -I$(BCB)\include\vcl -IE:\prg6\DexExPS\Lib
     -IE:\prg6\DexExPS\Sources -src_suffix cpp -D_DEBUG -boa"/>
   <CFLAG1 value="-Od -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -c
     -tW -tWM"/>
   <PFLAGS value="-$YD -$W -$O- -$A8 -v -JPHNE -M"/>
   <RFLAGS value=""/>
   <AFLAGS value="/mx /w2 /zd"/>
   <LFLAGS value="-D"" -aa -Tpe -x -Gn -v"/>
   <OTHERFILES value=""/>
 </OPTIONS>
 <LINKER>
   <ALLOBJ value="c0w32.obj $(PACKAGES) Memmgr.Lib sysinit.obj $(OBJFILES)"/>
   <ALLRES value="$(RESFILES)"/>
   <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib"/>
   <OTHERFILES value=""/>
 </LINKER>
 <FILELIST>
     <FILE FILENAME="RegSearch.res" FORMNAME="" UNITNAME="RegSearch.res" CONTAINERID="ResTool" DESIGNCLASS="" LOCALCOMMAND=""/>
     <FILE FILENAME="RegSearch.cpp" FORMNAME="" UNITNAME="RegSearch" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
     <FILE FILENAME="FormMain.cpp" FORMNAME="Form1" UNITNAME="FormMain" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
 </FILELIST>
 <BUILDTOOLS>
 </BUILDTOOLS>

 <IDEOPTIONS>
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1049
CodePage=1251

[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=

[Excluded Packages]
E:\PROGRA~1\Borland\CBUILD~2\Projects\Bpl\elpackB6.bpl=ElTree Lite
E:\Program Files\Borland\CBuilder6\Projects\Bpl\FibPdbms_b6.bpl=FibPdbms_b6
e:\program files\borland\cbuilder6\Bin\dclsoap60.bpl=Borland SOAP Components

[HistoryLists\hlIncludePath]
Count=3
Item0=$(BCB)\include;$(BCB)\include\vcl;E:\prg6\DexExPS\Lib;E:\prg6\DexExPS\Sources
Item1=$(BCB)\include;$(BCB)\include\vcl;E:\prg6\FIBPlus52\sources;E:\prg6\FIBPlus52\sources\Editors
Item2=$(BCB)\include;$(BCB)\include\vcl

[HistoryLists\hlLibraryPath]
Count=3
Item0=$(BCB)\lib\obj;$(BCB)\lib;E:\prg6\FIBPlus52\sources;E:\prg6\FIBPlus52\sources\Editors;E:\prg6\DexExPS\Lib;E:\prg6\DexExPS\Sources
Item1=$(BCB)\lib\obj;$(BCB)\lib;E:\prg6\FIBPlus52\sources;E:\prg6\FIBPlus52\sources\Editors
Item2=$(BCB)\lib\obj;$(BCB)\lib

[HistoryLists\hlDebugSourcePath]
Count=1
Item0=$(BCB)\source\vcl

[HistoryLists\hlConditionals]
Count=1
Item0=_DEBUG

[Debugging]
DebugSourceDirs=$(BCB)\source\vcl

[Parameters]
RunParams=
Launcher=
UseLauncher=0
DebugCWD=
HostApplication=
RemoteHost=
RemotePath=
RemoteLauncher=
RemoteCWD=
RemoteDebug=0

[Compiler]
ShowInfoMsgs=0
LinkDebugVcl=0
LinkCGLIB=0

[CORBA]
AddServerUnit=1
AddClientUnit=1
PrecompiledHeaders=1

[Language]
ActiveLang=
ProjectLang=
RootDir=
 </IDEOPTIONS>
</PROJECT>


Форма FormMain
CODE

object Form1: TForm1
 Left = 192
 Top = 138
 Width = 696
 Height = 480
 Caption = 'Form1'
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'MS Sans Serif'
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object sb: TStatusBar
   Left = 0
   Top = 434
   Width = 688
   Height = 19
   Panels = <>
   SimplePanel = False
 end
 object Panel1: TPanel
   Left = 0
   Top = 0
   Width = 688
   Height = 41
   Align = alTop
   Caption = 'Panel1'
   TabOrder = 1
   object Button1: TButton
     Left = 4
     Top = 12
     Width = 75
     Height = 25
     Caption = 'Button1'
     TabOrder = 0
     OnClick = Button1Click
   end
 end
 object t: TTreeView
   Left = 0
   Top = 41
   Width = 329
   Height = 393
   Align = alLeft
   Indent = 19
   TabOrder = 2
 end
end


CPP и H формы:
CODE

//---------------------------------------------------------------------------

#ifndef FormMainH
#define FormMainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
   TStatusBar *sb;
   TPanel *Panel1;
   TTreeView *t;
   TButton *Button1;
   void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
   __fastcall TForm1(TComponent* Owner);
   void __fastcall BuildNode(TTreeNode *p, TRegistry *r, AnsiString asTopPath);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


CODE

//---------------------------------------------------------------------------

#include <vcl.h>
#include <registry.hpp>
#pragma hdrstop

#include "FormMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TRegistry *r = new TRegistry();

   r->RootKey = HKEY_LOCAL_MACHINE;
   if (r->OpenKey("\\", false))
   {
       TTreeNode *n = t->Items->AddChild(NULL, "HKEY_LOCAL_MACHINE");
       TStringList *s = new TStringList();
       r->GetKeyNames(s);
       for (int i = 0; i < s->Count; i++)
       {
           TTreeNode *c = t->Items->AddChild(n, s->Strings[i]);
           AnsiString asCurrentPath = r->CurrentPath;
           if ((r->OpenKey(asCurrentPath + "\\" + s->Strings[i], false)) &&
               (r->HasSubKeys()))
           {
               BuildNode(c, r, asCurrentPath + "\\" + s->Strings[i]);
           }
           r->OpenKey(asCurrentPath + "\\", false);
       }
   }
   r->RootKey = HKEY_CURRENT_USER;
   if (r->OpenKey("\\", false))
   {
       TTreeNode *n = t->Items->AddChild(NULL, "HKEY_CURRENT_USER");
       TStringList *s = new TStringList();
       r->GetKeyNames(s);
       for (int i = 0; i < s->Count; i++)
       {
           TTreeNode *c = t->Items->AddChild(n, s->Strings[i]);
           AnsiString asCurrentPath = r->CurrentPath;
           if ((r->OpenKey(asCurrentPath + "\\" + s->Strings[i], false)) &&
               (r->HasSubKeys()))
           {
               BuildNode(c, r, asCurrentPath + "\\" + s->Strings[i]);
           }
           r->OpenKey(asCurrentPath + "\\", false);
       }
   }
   delete r;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BuildNode(TTreeNode *p, TRegistry *r, AnsiString asTopPath)
{
   TStringList *s = new TStringList();
   r->GetKeyNames(s);
   for (int i = 0; i < s->Count; i++)
   {
       TTreeNode *c = t->Items->AddChild(p, s->Strings[i]);
       if ((r->OpenKey(asTopPath + "\\" + s->Strings[i], false)) &&
           (r->HasSubKeys()))
       {
           BuildNode(c, r, asTopPath + "\\" + s->Strings[i]);
       }
       r->OpenKey(asTopPath + "\\", false);
   }
}


И файл с функцией WinMain RegSearch.cpp
CODE

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("FormMain.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
   try
   {
        Application->Initialize();
        Application->CreateForm(__classid(TForm1), &Form1);
        Application->Run();
   }
   catch (Exception &exception)
   {
        Application->ShowException(&exception);
   }
   catch (...)
   {
        try
        {
            throw Exception("");
        }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
   }
   return 0;
}
//---------------------------------------------------------------------------
olegenty
Отправлено: 11.03.2004, 08:05


Ветеран

Группа: Модератор
Сообщений: 2412



стоп. первый (файл проекта) не трогай, у меня там экзотических пакетов полно...
olegenty
Отправлено: 11.03.2004, 08:10


Ветеран

Группа: Модератор
Сообщений: 2412



Там одна реальная ошибка, я забыл
CODE

delete s;

написать. сам напиши. но реестр сканируется на ура. в результате имеешь две заполненные ветки ключей: HKEY_LOCAL_MACHINE и HKEY_CURRENT_USER
Alex83
Отправлено: 11.03.2004, 10:20


Ученик-кочегар

Группа: Участник
Сообщений: 25



Я долго мучался с твоим кодом но он у меня так и не за работал если не трудно прили исходник файла на KHRAM@ua.fm
плиз!!!
olegenty
Отправлено: 11.03.2004, 10:29


Ветеран

Группа: Модератор
Сообщений: 2412



Отправил. Сообщи о результате.
Gedeon
Отправлено: 11.03.2004, 10:42


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (olegenty @ 11/03/2004, 09:07)
стоп. первый (файл проекта) не трогай, у меня там экзотических пакетов полно...

В этом случае самый простой вариат из файла проекта удалить все библиотеки, если они конечно не используются, билдер сам добавит все, что нужно.
В этом случае надо удалить следующее
QUOTE
vcl.bpi rtl.bpi dbrtl.bpi adortl.bpi vcldb.bpi vclx.bpi bdertl.bpi
    vcldbx.bpi ibxpress.bpi dsnap.bpi cds.bpi bdecds.bpi qrpt.bpi teeui.bpi
    teedb.bpi tee.bpi dss.bpi teeqr.bpi visualclx.bpi visualdbclx.bpi
    dsnapcrba.bpi dsnapcon.bpi bcbsmp.bpi vclie.bpi xmlrtl.bpi inet.bpi
    inetdbbde.bpi inetdbxpress.bpi inetdb.bpi nmfast.bpi webdsnap.bpi
    bcbie.bpi websnap.bpi soaprtl.bpi dclocx.bpi dbexpress.bpi dbxcds.bpi
    indy.bpi bcb2kaxserver.bpi MultilineTab6.bpi elpackB6.bpi rxctl6.bpi
    rxdb6.bpi rxbde6.bpi OfficeVCL6.bpi tb2k_cb6.bpi FIBPlus_CB6.bpi
    EhLibB60.bpi
olegenty
Отправлено: 11.03.2004, 11:06


Ветеран

Группа: Модератор
Сообщений: 2412



Жаль, нельзя архивы прикладовать к сообщениям, я бы просто сюда положил...

Вернуться в Вопросы программирования в C++Builder