为什么执行结果会这样,不明白????

时间:2023-01-14 22:25:24
#include<Windows.h>
#include<stdio.h>
#include<math.h>
void readreg(HKEY,LPCSTR);
HKEY hKey, phkResult ;        // handle to open key
LPCTSTR lpSubKey; // name of subkey to open  // handle to open key
void main()
{
hKey=HKEY_LOCAL_MACHINE;
lpSubKey="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
readreg(hKey,lpSubKey);

}
void readreg(HKEY hkey,LPCSTR lpcstr)
{
long error;
int index;
LPSTR buf;
DWORD lpType;
LPBYTE lpData;
DWORD lpcbData;
FILE *fp;
int i;
unsigned long size;
buf=(LPSTR)malloc(sizeof(unsigned char )*50);
error=RegOpenKey(hkey,lpcstr,&phkResult);
if(error)
{

fp=fopen("c:\\readme.txt","a");
fputs("not find",fp);
fputc('\n',fp);
fclose(fp);
exit(0);
}
index=0;
lpData=(LPBYTE)malloc(sizeof(unsigned char)*50);
fp=fopen("c:\\readme.txt","a+");
while((RegEnumValue(phkResult,index,buf,&size,NULL,&lpType,lpData,&lpcbData))!=ERROR_NO_MORE_ITEMS)
{  
i=0;
while((buf[i]))
{
fputc(buf[i],fp);
i++;
}
fputc(' ',fp);
        memset(buf,NULL,size);
if(lpType==REG_SZ)

i=0;
while((lpData[i]))
{
fputc(lpData[i],fp);
i++;
}
memset(lpData,NULL,lpcbData);
}
else
fputc((char)(*lpData),fp);
fputc('\n',fp);
index++;
}
free(buf);
free(lpData);
fclose(fp);
}
执行结果不尽人意,还有如果处理注册表中DWORD中的数据的时候该怎么处理呢?等候答复!!!谢谢

6 个解决方案

#1


LPCTSTR lpSubKey; // name of subkey to open  // handle to open key
void main()
{
hKey=HKEY_LOCAL_MACHINE;
lpSubKey="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
readreg(hKey,lpSubKey);

}

???
不要令 LPCTSTR 等于一个值,那会出错的
还有就算是 LPSTR 也是不行的
LPSTR 应该使用 new、strcpy 等操作

LPCTSTR lpSubKey="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
倒是可以的

-----------------------------------
现在混水园了!

#2


如果要“尽如人意”,应该是怎样?

#3


返回的value存放在lpData缓冲区里面,但是返回的值有字符串型的,也有双字节整型的,在把数据保存在本地文件中的时候会出现错误,所以不尽人意。
Behard(我爱*) ( ) 提出的建议是好像的,好在指针初始化的时候没有指向系统的内存区域,没有出现致命的错误,嗯,改正,谢谢,能不能帮我修改一下,让他尽人意呢,昨晚我琢磨了一个晚上都没有成功,实在是没有办法了,谢谢。

#4


关于那个常量字符串可改可不改,因为你没有对这个常量字符串做过“写”的动作。

以下是改正方法,请参考:
while((RegEnumValue(phkResult,index,buf,&size,NULL,&lpType,lpData,&lpcbData))!=ERROR_NO_MORE_ITEMS)
{  
    //- Write the value name
    fputs(buf,fp);

fputc(' ',fp);

  //- Write the value data
    TCHAR szTmp[100];
    switch(lpType)
    {
    case REG_SZ:
    if(lpcbData>=50)
            lpData[49]='\0';
        else
            lpData[lpcbData]='\0';

        fputs(lpData,fp);
        break;
    case REG_DWORD:
        _stprintf(szTmp,_T("%d"),(DWORD)lpData);
        fputs(szTmp,fp);
        break;
    default:
        fputs(_T("I do not know what it is."),fp);
    }
    
    fputc('\n',fp);
    index++;
}
(以上程序未经测试,使用者后果自负,作者保留所有版权)

#5


但是结果还是乱如麻,并且会出现重复的值,跟了一下,index一直很正常,于是我又试了一下讲buf和laData每次都清空,但是还是那样,实在不知道到底出了什么问题,其实呢,程序很小,目的呢,就是读出注册表下的值,然后存入文件,但是做了好多天就是这个结果搞不定,领导要求结果一定要清晰。
但是也奇怪的很,比如在local_machine\\software\\microsoft\\windows\\currentversion\\run下,所有的值都是reg_SZ类型的,结果很正常,在是换一个在存在REG_DWORD的就不正常了,就出现了乱码,或者重复的现象,实在是无法想通这个问题。

#6


所谓的清晰是什么呢?是指人看着清楚,还是指程序写的清楚?
REG_DWORD是一个整数值,如果要人看着清楚,需要把它转换为字符串。当然,再写入注册表的时候又需要转换为整数了。并且,如果对文本文件有格式要求,那么字符串数字的长度也需要注意。

#1


LPCTSTR lpSubKey; // name of subkey to open  // handle to open key
void main()
{
hKey=HKEY_LOCAL_MACHINE;
lpSubKey="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
readreg(hKey,lpSubKey);

}

???
不要令 LPCTSTR 等于一个值,那会出错的
还有就算是 LPSTR 也是不行的
LPSTR 应该使用 new、strcpy 等操作

LPCTSTR lpSubKey="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
倒是可以的

-----------------------------------
现在混水园了!

#2


如果要“尽如人意”,应该是怎样?

#3


返回的value存放在lpData缓冲区里面,但是返回的值有字符串型的,也有双字节整型的,在把数据保存在本地文件中的时候会出现错误,所以不尽人意。
Behard(我爱*) ( ) 提出的建议是好像的,好在指针初始化的时候没有指向系统的内存区域,没有出现致命的错误,嗯,改正,谢谢,能不能帮我修改一下,让他尽人意呢,昨晚我琢磨了一个晚上都没有成功,实在是没有办法了,谢谢。

#4


关于那个常量字符串可改可不改,因为你没有对这个常量字符串做过“写”的动作。

以下是改正方法,请参考:
while((RegEnumValue(phkResult,index,buf,&size,NULL,&lpType,lpData,&lpcbData))!=ERROR_NO_MORE_ITEMS)
{  
    //- Write the value name
    fputs(buf,fp);

fputc(' ',fp);

  //- Write the value data
    TCHAR szTmp[100];
    switch(lpType)
    {
    case REG_SZ:
    if(lpcbData>=50)
            lpData[49]='\0';
        else
            lpData[lpcbData]='\0';

        fputs(lpData,fp);
        break;
    case REG_DWORD:
        _stprintf(szTmp,_T("%d"),(DWORD)lpData);
        fputs(szTmp,fp);
        break;
    default:
        fputs(_T("I do not know what it is."),fp);
    }
    
    fputc('\n',fp);
    index++;
}
(以上程序未经测试,使用者后果自负,作者保留所有版权)

#5


但是结果还是乱如麻,并且会出现重复的值,跟了一下,index一直很正常,于是我又试了一下讲buf和laData每次都清空,但是还是那样,实在不知道到底出了什么问题,其实呢,程序很小,目的呢,就是读出注册表下的值,然后存入文件,但是做了好多天就是这个结果搞不定,领导要求结果一定要清晰。
但是也奇怪的很,比如在local_machine\\software\\microsoft\\windows\\currentversion\\run下,所有的值都是reg_SZ类型的,结果很正常,在是换一个在存在REG_DWORD的就不正常了,就出现了乱码,或者重复的现象,实在是无法想通这个问题。

#6


所谓的清晰是什么呢?是指人看着清楚,还是指程序写的清楚?
REG_DWORD是一个整数值,如果要人看着清楚,需要把它转换为字符串。当然,再写入注册表的时候又需要转换为整数了。并且,如果对文本文件有格式要求,那么字符串数字的长度也需要注意。