优化大师其中有一项清理注册表的功能。我想问怎样判断是冗余项?怎样判断哪些项是非法的?可以删除?是不是说健值的数据项为空就是冗余项?高手请给出代码,不胜感激。还有怎样遍历注册表???????????????????
急急急!!!!
给分100

解决方案 »

  1.   

    // purpose : to enum reg key#include<stdio.h>
    #include<conio.h>
    #include<time.h>
    #include<windows.h>HKEY hKey[] = {HKEY_CLASSES_ROOT,
       HKEY_CURRENT_USER,
       HKEY_LOCAL_MACHINE,
       HKEY_USERS,
       HKEY_CURRENT_CONFIG};
    char *sKey[] = {"HEKY_CLASSES_ROOT",
       "HEKY_CURRENT_USER",
       "HEKY_LOCAL_MACHINE",
       "HEKY_USERS",
       "HEKY_CURRENT_CONFIG"};char data_set[1024];
    DWORD nCount = 0; // calculate the keys numbervoid EnumValue(HKEY hKey)
    {
    int dwIndex = 0;
    char valuename[MAX_PATH + 1];
    DWORD valuenamelen;
    DWORD Type;
    union{
    BYTE data[1024];
    DWORD idata;
    }lpdata;
    DWORD datalen; valuenamelen = sizeof(valuename);
    datalen = sizeof(lpdata);
    memset(&lpdata,0,sizeof(lpdata));
    while(::RegEnumValue (hKey,dwIndex,(LPTSTR)valuename,&valuenamelen,
    0,&Type,lpdata.data,&datalen) != ERROR_NO_MORE_ITEMS)
    {
    switch(Type)
    {
    case REG_SZ:
    printf("value:\t%s\tdata:\t%s\n",valuename,(char*)lpdata.data);
    break;
    case REG_DWORD:
    printf("value:\t%sdata:\t%ld\n",valuename,lpdata.idata);
    break;
    default:
    break;
    } dwIndex ++;
    valuenamelen = sizeof(valuename);
    datalen = sizeof(lpdata);
    memset(&lpdata,0,sizeof(lpdata));
    }}void EnumKey(HKEY hKey,char *sKey)
    {
    HKEY h;
    int dwIndex = 0;

    char strkey[2048];
    char name[1024] = {0};
    DWORD namelen = sizeof(name);
    FILETIME ftLastWriteTime; if(::RegOpenKeyEx (hKey,(LPTSTR)data_set,0,KEY_READ,&h) != ERROR_SUCCESS)
    {
    printf("cann't open key %s!\n",strkey);
    return;
    }

    while(::RegEnumKeyEx (h,dwIndex,name,&namelen,0,NULL,NULL,&ftLastWriteTime) != ERROR_NO_MORE_ITEMS)
    {
    EnumValue(h);
    nCount ++;
    printf("%s\\%s\n",sKey,name);
    Sleep(100);
    HKEY hk;
    if(::RegOpenKeyEx (h,(LPTSTR)name,0,KEY_READ,&hk) == ERROR_SUCCESS)
    {
    strcpy(data_set,"");
    strcpy(strkey,sKey);
    strcat(strkey,"\\");
    strcat(strkey,name);
    EnumKey(hk,strkey);
    ::RegCloseKey (hk);
    }
    dwIndex += 1;
    namelen = sizeof(name); //must be specified every time!!!
    }
    ::RegCloseKey (hKey);

    }void main()
    {
    printf("Enum all reg keys and values\n");
    printf("press Enter to start...\n");
    getch();
    time_t start,end;
    time(&start);
    for(int i = 0 ; i < 5; i++)
    {
    strcpy(data_set,"");
    EnumKey(hKey[i],sKey[i]);
    }
    time(&end);
    printf("altogether %ld keys!!!\n",nCount);
    printf("using time : %ld seconds!\n",end - start );}
      

  2.   

    估计是用多种办法协和检查.可能一种就是固定的windows本身不用的条目删除.还有动态根据无效路径检查有没有冗余.应该还有更多的方法,一种方法不可能做好.