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
Гость
|
|
« Ответ #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 от Вад »
|
Записан
|
|
|
|