Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Работа с реестром. Вопрос про значения 0x80000000-0x80000006  (Прочитано 46791 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 04-04-2008 15:14 » 

15000 строк - 3 секунды
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #31 : 04-04-2008 15:22 » 

вывод ? Улыбаюсь
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #32 : 04-04-2008 15:25 » 

Вывод что проблема со считыванием огромного кол-ва инфы из реестра единовременно. Надо как-то переписывать =\
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #33 : 04-04-2008 15:32 » 

FallenSoul, а откуда огромный размер данных из реестра?
Цитата
Т.о. заполнение происходит только того, что хочет видеть пользователь
- если я правильно понимаю, кликаешь по дереву - разворачивается и грузит внутрь на один уровень?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #34 : 04-04-2008 15:33 » 

FallenSoul,  а зачем тебе сразу ВСЁ?

Считай и покажи сначала первый уровень. При клике на узел - считаешь его,  покажешь детей. И тд. Так все работают. Сразу никто ничего не считывает.

Ты прикинь, допустим там одной только инфы мегов на 10-30. Да и ещё одна аксиома - операции отображения на экране - самые мделенные.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #35 : 04-04-2008 15:36 » 

Джон, Вад, да, именно о такой реализации говорил. Попробую
Записан
VendelG
Гость
« Ответ #36 : 12-10-2009 17:23 » 

Sla, Программа работы с функциями реестра Windows 2000/XP. Нужно использовать 5: GetSystemRegistryQuota, RegCreateKeyEx, RegDeleteKey, RegEnumKeyEx, RegQueryInfoKey. Должно быть

на подобие regedit.exe/

Использую Visual C++ 6.0.

В книге Румянцева - "Азбука программирования в WIN32 API" есть пример по отображению дерева реестра, но там используются эти значения 0x80000000-0x80000006.

При компилировании - 0 ошибок. Но когда программа линкуется - ничего не происходит. (как будто зависает) но .exe создает, который не запускается. Поменял значения, которые выше на :

0x800000-0x800006 - появляется одно окно программы - без дерева Жаль (в project-setting менял, что угодно...подключал кучу библиотек - ничего)

Решил, что с этим разбираться глупо. Начал подходить с другой стороны - изменил немного функции Румянцева, теперь программа дерево отображает, но только главные ключи и ключи "второго

порядка" - а дальше сплошные тормоза Жаль

В этой теме есть похожая функция с циклом перебора ключей, я пробовал поттасововать под свою, но заплутался...

Вот полностью код моей рабочей версии. Помогите!!! Спасите - тону! Должен же быть выход!!! Сколько об стенку не бейся...

Код:
#include<windows.h>
#include<commctrl.h>
#pragma comment(lib,"comctl32.lib")
//#define hKeyMin 0x800000
//#define hKeyMax 0x800004

HINSTANCE hInst;
HWND hTreeChild;
TV_INSERTSTRUCT InsertStruct;


LRESULT CALLBACK RegistryWndProc(HWND,UINT,UINT,LONG);

void MyFun (HKEY); //?????? ?????. ???????? ?????
void FillTree(HWND,HTREEITEM); //?????? ?????. ????????? ???????? ?????
void FillBranch(HKEY,DWORD,HWND,HTREEITEM);//?????? ?????. ??? ???????? ???. ?????
void FillSubBranch(HKEY,char*,HWND,HTREEITEM);//?????? ?????. ????????? ?????


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR IpszCmdParam, int nCmdShow)
{
HWND hWnd;
WNDCLASS WndClass;
MSG Msg;
char szClassName[]="Registry";
hInst=hInstance;
/*Registering our window class*/
/*Fill WNDCLASS structure*/

    WndClass.style=CS_HREDRAW|CS_VREDRAW;
WndClass.lpfnWndProc=RegistryWndProc;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hInstance=hInstance;
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName="";
WndClass.lpszClassName=szClassName;

if(!RegisterClass(&WndClass))
{
MessageBox(NULL,"Cannot registry class","Error",MB_OK);
return 0;
}

hWnd=CreateWindow(szClassName,"Registry Demo Program",WS_POPUPWINDOW|WS_VISIBLE|WS_CAPTION,100,100,300,400,NULL,NULL,hInstance,NULL);

   if(!hWnd)
{
MessageBox(NULL,"Cannot create window","Error",MB_OK);
return 0;
}

InitCommonControls();
/*Show our window*/
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
/*Beginning of message cycle*/
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}

LRESULT CALLBACK RegistryWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
RECT Rect;
static HWND hTreeChild;
static HTREEITEM hParentItem;

switch(Message)
{
case WM_CREATE:
GetClientRect(hWnd,&Rect);
hTreeChild=CreateWindow(WC_TREEVIEW,"",WS_VISIBLE|WS_TABSTOP|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|WS_DLGFRAME,0,0,Rect.right,Rect.bottom,hWnd,NULL,hInst,NULL);
InsertStruct.item.mask=TVIF_TEXT;
InsertStruct.item.hItem=NULL;
InsertStruct.item.pszText="Registry Keys";
InsertStruct.item.cchTextMax=14;
InsertStruct.hParent=TVI_ROOT;
InsertStruct.hInsertAfter=TVI_LAST;
hParentItem=TreeView_InsertItem(hTreeChild,&InsertStruct);
FillTree(hTreeChild,hParentItem);
TreeView_Expand(hTreeChild,hParentItem,TVE_EXPAND);
TreeView_SelectItem(hTreeChild,hParentItem);
return 0;

case WM_SIZE:
MoveWindow(hTreeChild,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);
return 0;

case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,Message,wParam,lParam);
}

void FillTree(HWND hTreeWnd,HTREEITEM hParentItem)
{
static ULONG i;
TV_ITEM Item;
TV_INSERTSTRUCT InsertStruct;
LPSTR lpszKeys[5]={"HKEY_CLASSES_ROOT",
"HKEY_CURRENT_USER",
"HKEY_LOCAL_MACHINE",
"HKEY_USERS",
"HKEY_CURRENT_CONFIG",
};

static HKEY HlpszKeys[5]={HKEY_CLASSES_ROOT,
HKEY_CURRENT_USER,
HKEY_LOCAL_MACHINE,
HKEY_USERS,
HKEY_CURRENT_CONFIG,
};

char cClass[80]="";
DWORD dwSize=80,dwSubKeys,dwMaxLength,dwMaxClass,dwValues,dwMaxValue,dwMaxData,dwSec;

FILETIME ftFileTime;
HTREEITEM hNewParentItem;

for (i=0;i<=4;i++)
{
// Add the highest items

if(ERROR_SUCCESS==RegQueryInfoKey( HlpszKeys[i],
cClass,
&dwSize,
NULL,
&dwSubKeys,
&dwMaxLength,
&dwMaxClass,
&dwValues,
&dwMaxValue,
&dwMaxData,
&dwSec,
&ftFileTime))

{
Item.mask=TVIF_TEXT;
Item.pszText=lpszKeys[i];
InsertStruct.item=Item;
InsertStruct.hParent=hParentItem;
hNewParentItem=TreeView_InsertItem(hTreeWnd,&InsertStruct);
FillBranch( HlpszKeys[i],dwSubKeys,hTreeWnd,hNewParentItem);
} else
MessageBox(NULL,"?? ???? ?????????? ????","Error",MB_OK);
}
}




void FillBranch(HKEY Zzz ,DWORD dwSubKeys, HWND hTreeWnd,HTREEITEM hNewParentItem)
{

int j;
DWORD dwClassNameSize=80;
char cClassName[80]="";

if(dwSubKeys==0) //MessageBox(NULL,"podl","Error",MB_OK);
return;

else
{
for(j = 0; j<(int)dwSubKeys; j++)
{
RegEnumKey(Zzz, (int) j, cClassName, dwClassNameSize);
dwClassNameSize = 80;

FillSubBranch( (HKEY) cClassName, (char*) cClassName, hTreeWnd, hNewParentItem);
} }
}







void FillSubBranch(HKEY ZZz, char* cClassName,HWND hTreeWnd,HTREEITEM hParentItem)
{  //int k;
HKEY hNewKey;
char cClass[80],cNewClass[80];
DWORD dwClassSize=80,dwSK,k;
TV_ITEM Item;
TV_INSERTSTRUCT InsertStruct;
HTREEITEM hNewParentItem;


Item.mask=TVIF_TEXT;
Item.pszText=cClassName;
InsertStruct.hParent=hParentItem;
InsertStruct.hInsertAfter=TVI_SORT;
InsertStruct.item=Item;
hNewParentItem=TreeView_InsertItem(hTreeWnd,&InsertStruct);
RegOpenKey(ZZz,cClassName,&hNewKey);
RegQueryInfoKey(hNewKey,cClass,&dwClassSize,NULL,&dwSK,NULL,NULL,NULL,NULL,NULL,NULL,NULL);

dwClassSize=80;

/* if(dwSK!=0)
for(k=0;k< (int)dwSK;k++)
{
RegEnumKey(hNewKey,k,cNewClass,dwClassSize);

FillSubBranch((HKEY) cNewClass, (char*) cNewClass,hTreeWnd,hNewParentItem);
}*/
MyFun(hNewKey);
}



void MyFun (HKEY t)
{
RegCloseKey(t);
}
Записан
VendelG
Гость
« Ответ #37 : 12-10-2009 17:31 » 

Извините, может не точно выразился. Как отобразить реестр полностью??? Исходя из кода, который выше.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #38 : 13-10-2009 07:41 » 

VendelG, почитай
https://club.shelek.ru/viewart.php?id=313
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
VendelG
Гость
« Ответ #39 : 14-10-2009 16:32 » 

Sla, дякую за зауваження. тей сайт хороший, я його "облазив" багато разів. Поясню спочатку, може в цьму проблема (так воно і є)

наступний програм код мені дали тут:

Код:
hitem=(HTREEITEM)SendMessage(hTreeChild,TVM_GETNEXTITEM,TVGN_ROOT,0); //получает хэндл самого пеpвого из коpневых элементов tree view (реєстра)
if(hitem)hItem=(HTREEITEM)SendMessage(hTreeChild,TVM_GETNEXTITEM,TVGN_CARET,(LPARAM)hitem);//отримуємо дискриптор виділеної вітки реєстра

if(hItem){
TV_ITEM item;
item.hItem=hItem;
item.mask=TVIF_TEXT;//задаєм маску для вибору інформації з вітки
item.pszText=szBuffer;// в szBuffer заноситься імя вітки реєстра, яке є її HKEY ( szBuffer=(char*) HKEY ) у мене в програмі вітки це ключі
item.cchTextMax=MAXLEN;

SendMessage(hTreeChild,TVM_GETITEM,0,(LPARAM)&item);//дістає з виділено вітки її імя
Тепер маючи імя вітки, я хочу використати в ф RegQueryInfoKey.
RegQueryInfoKey(
(HKEY)szBuffer, cClass, &dwSize, NULL, &dwSubKeys, &dwMaxLength, &dwMaxClass, &dwValues, &dwMaxValue, &dwMaxData, &dwSec, &ftFileTime))

але так воно не працює((. чому воно повинно апрацювати ВИ запитаєте, ось прикла програми який в мене працює:
Код:
//від першого елемента відки до останнюго
for(j = 0; j<(int)dwSubKeys; j++)
{
RegEnumKey(Zzz, (int) j, cClassName, dwClassNameSize);//читаємо і-тий підлюч, ключа (HKEY) Zzz, і присвоюємо його cClassName(char cClassName[80]=""

FillSubBranch( (HKEY) cClassName/*вітка 2-го порядку*/, (char*) cClassName/*имя вытка 2-го порядку*/, hTreeWnd, hNewParentItem);
}
//FillSubBranch це власна функція яка виконує ф RegQueryInfoKey над cClassName!!! яка раніше була char, а перетворили примусово у HKEY. і вона працює.
чому з szBuffer це не проходить.

P.S. сьогодні подумав, може краще мені із вітки брати не імя, а зразу HKEY? і використовувати його в функціях без ніякого перетворення. Задача - як вибрати із вітки її HKEY?
« Последнее редактирование: 14-10-2009 17:38 от Вад » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #40 : 14-10-2009 16:55 » 

VendelG,

https://forum.shelek.ru/index.php?action=vu-rules#post_p3-2
https://forum.shelek.ru/index.php?action=vu-rules#post_p3-7

И еще просьба: оборачивай код тегами [code]  [/code]
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #41 : 15-10-2009 06:07 » new

VendelG, что такое?
Код:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
Если читал статью, то это корневые элементы реестра.
Других быть не может. Это и есть hKey


Твоя задача - получить список (дерево) от каждого корня.
т.е получит список существующих  pSubKey.

а вот тут возможно дан ответ по крайней мере, попытка получения.
« Последнее редактирование: 15-10-2009 06:11 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #42 : 15-10-2009 08:43 » 

VendelG,

прошу прощения за недоработки в тестовом проекте - просто нет времени на полировку.
Сейчас происходит следующее: задаешь в левом едит_боксе один из 5-ти основных ключей реестра, правый едит_бокс оставляешь пустым, жмешь на кнопочку "seek all keys" и  получаешь все подключи, находящиеся в внутри.
Например, задай HKEY_CURRENT_CONFIG и посмотри на результат (другие ключи задавать не советую - слишком много инфы будет).
Если же хочешь более конкретную инфу, задай в правом боксе имя подключа.

* RegistryManipTest.zip (19.05 Кб - загружено 845 раз.)
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
VendelG
Гость
« Ответ #43 : 15-10-2009 09:45 » 

Malaja, СПАСИБО! УЖЕ РЕАЛЬНО ЕСТЬ ОТ ЧЕГО ДВИГАТЬСЯ ДАЛЬШЕ)
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #44 : 15-10-2009 10:15 » 

VendelG,
да не за что, лишь бы на пользу пошло!

Я сейчас немного посмотрела свой код (ибо не помню, что там делается):
функция GetNamesOfAllSubKeys() вызывается рекурсивно, т.е. за счет этого ты и получаешь все ключи от первого до последнего уровня. Соответственно, отключив эту рекурсию, ты всегда будешь получать только 1 уровень ключей (т.е. это теоретически именно то, что тебе надо для заполнения формы).

Если будут вопросы - задавай.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines