为何打开一次注册表,然后进行多次读的时候,老是出现错误呢? 我使用RegOpenKeyEx打开注册表后,然后用RegQueryValueEx多次读,获得多个键名的键值赋给不同的变量,捕捉错误的时候总是莫名其妙的某一个或者某几个出现问题。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 估计是你的一个参数有问题! HKEY hKey; long reg=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,"DYCECS",0L,KEY_READ,&hKey); if(reg!=ERROR_SUCCESS) { MessageBox("无法打开相关的键值,请运行ECS.reg文件注册"); return FALSE; } char Value[50]={""}; DWORD dwValue; DWORD w=50;//sizeof(DWORD); DWORD dww=sizeof(DWORD); DWORD type=REG_SZ; DWORD type1=REG_DWORD; reg=::RegQueryValueEx(hKey,"X",NULL,&type1,(BYTE*)&dwValue,&dww); point.x=dwValue; reg=::RegQueryValueEx(hKey,"Y",NULL,&type1,(BYTE*)&dwValue,&dww); point.y=dwValue; reg=::RegQueryValueEx(hKey,"COM",NULL,&type1,(BYTE*)&dwValue,&dww); COM=dwValue+1; reg=::RegQueryValueEx(hKey,"DelayIn",NULL,&type1,(BYTE*)&dwValue,&dww); DelayIn=(int)(dwValue/10); reg=::RegQueryValueEx(hKey,"DelayOut",NULL,&type1,(BYTE*)&dwValue,&dww); DelayOut=(int)(dwValue/100); reg=::RegQueryValueEx(hKey,"COLOR1",NULL,&type1,(BYTE*)&dwValue,&dww); COLOR1=dwValue; reg=::RegQueryValueEx(hKey,"COLOR2",NULL,&type1,(BYTE*)&dwValue,&dww); COLOR2=dwValue; reg=::RegQueryValueEx(hKey,"HEAV1",NULL,&type1,(BYTE*)&dwValue,&dww); HEAV1=dwValue; reg=::RegQueryValueEx(hKey,"HEAV2",NULL,&type1,(BYTE*)&dwValue,&dww); HEAV2=dwValue; reg=::RegQueryValueEx(hKey,"THIN",NULL,&type1,(BYTE*)&dwValue,&dww); THIN=dwValue; reg=::RegQueryValueEx(hKey,"B_",NULL,&type,(BYTE*)Value,&w); B_[0]=atof(Value); w=50; reg=::RegQueryValueEx(hKey,"B_H",NULL,&type,(BYTE*)Value,&w); B_[1]=atof(Value);看看! 这个是我的工程中的可以的 我的代码是这样的,总是莫名其妙的某一个出毛病,而把他们的在程序中的查询位置换一换,有时候就好用了,但有时侯,还会出毛病代码如下,请帮我指出错误的地方。其中,存储键值的变量都为LPBYTE类型(LPBYTE DSN),再构造函数中初始化为DSN=new BYTE[20]HKEY hKEY; LPCTSTR data_Set="SOFTWARE\\SSHIS\\XTWH"; long ret=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY)); if(ret!=ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行 { AfxMessageBox("错误:无法打开有关的hKEY"); return; } DWORD type=REG_SZ;//定义数据类型 DWORD Cd1=20;//定义数据长度 DWORD Cd2=40; ret=::RegQueryValueEx(hKEY,"DSN",NULL,&type,DSN,&Cd1); if(ret!=ERROR_SUCCESS) { AfxMessageBox("错误:无法查询有关键名为DSN的注册表信息"); return; } ret=::RegQueryValueEx(hKEY,"LogID",NULL,&type,LogID,&Cd1); if(ret!=ERROR_SUCCESS) { AfxMessageBox("错误:无法查询有关键名为LogID的注册表信息"); return; } ret=::RegQueryValueEx(hKEY,"USEDSN",NULL,&type,useDSN,&Cd1); if(ret!=ERROR_SUCCESS) { AfxMessageBox("错误:无法查询有关键名为USEDSN的注册表信息"); return; } ret=::RegQueryValueEx(hKEY,"LogPwd",NULL,&type,LogPWD,&Cd1); if(ret!=ERROR_SUCCESS) { AfxMessageBox("错误:无法查询有关键名为LogPWD的注册表信息"); return; } ::RegCloseKey(hKEY); 每次调用RegQueryValueEx()后,Cd1的值可能改变。你确信每次读出来串的长度都是20吗? 每次调用RegQueryValueEx()后,Cd1的值可能改变。你确信每次读出来串的长度都是20吗?对!者就是问题所在!我的例子中dwWord=50;每次确定!! 你试试这样 unsigned char tmp[256]="\0"; DWORD type=REG_SZ; DWORD size=80; ret=::RegQueryValueEx(hKEY,"Path", NULL,&type,tmp,&size); if(ret!=ERROR_SUCCESS) { ::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK); return FALSE; } //取得软件安装根目录 gl_SoftInfo.Path = CString(tmp); type=REG_SZ; size=80; memcpy(tmp,"\0",256); ret=::RegQueryValueEx(hKEY,"SQLServerIP", NULL,&type,tmp,&size); if(ret!=ERROR_SUCCESS) { ::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK); return FALSE; } //获得数据库服务器地址 gl_SoftInfo.SQLServerIP = CString(tmp); type=REG_SZ; size=80; memcpy(tmp,"\0",256); ret=::RegQueryValueEx(hKEY,"SQLServerUser", NULL,&type,tmp,&size); if(ret!=ERROR_SUCCESS) { ::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK); return FALSE; } //获得数据库服务器用户 gl_SoftInfo.SQLServerUser = CString(tmp); type=REG_SZ; size=80; memcpy(tmp,"\0",256); ret=::RegQueryValueEx(hKEY,"SQLServerPassWord", NULL,&type,tmp,&size); if(ret!=ERROR_SUCCESS) { ::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK); return FALSE; } //获得数据库服务器用户口令 gl_SoftInfo.SQLServerPassword = CString(tmp); type=REG_SZ; size=80; memcpy(tmp,"\0",256); ret=::RegQueryValueEx(hKEY,"FtpServerIP", NULL,&type,tmp,&size); if(ret!=ERROR_SUCCESS) { ::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK); return FALSE; } //获得FTP服务器地址 gl_SoftInfo.FtpServerIP = CString(tmp); type=REG_SZ; size=80; memcpy(tmp,"\0",256); ret=::RegQueryValueEx(hKEY,"FTPServerUser", NULL,&type,tmp,&size); if(ret!=ERROR_SUCCESS) { ::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK); return FALSE; } 楼上说的对,把MSDN看清楚, lpcbData既是一个输入参数,也是一个输出参数,每回都应该重新附值。 Windows 中 lpstr是个什么类型? 下载服务器应该怎么设计 error C2065: 'bShiftdown' : undeclared identifier帮我解决一下,3Q~ 一个简单的数据库连接为什么不成功w DLL中无法执行CoInitializeEx. 如何动态数据源中的表名 stonespace请看,根本没有CView::OnFilePrintPreview? 写avi文件的问题!谢谢了! 一个初学者的关于Doc/View的问题? 一个很值得研究的问题,我有原代码 在sdi工程中添加了一个新的视图后。怎样切换新视图和老视图! 用VC编写生成Excel文件的COM
long reg=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,"DYCECS",0L,KEY_READ,&hKey);
if(reg!=ERROR_SUCCESS)
{
MessageBox("无法打开相关的键值,请运行ECS.reg文件注册");
return FALSE;
}
char Value[50]={""};
DWORD dwValue;
DWORD w=50;//sizeof(DWORD);
DWORD dww=sizeof(DWORD);
DWORD type=REG_SZ;
DWORD type1=REG_DWORD;
reg=::RegQueryValueEx(hKey,"X",NULL,&type1,(BYTE*)&dwValue,&dww);
point.x=dwValue;
reg=::RegQueryValueEx(hKey,"Y",NULL,&type1,(BYTE*)&dwValue,&dww);
point.y=dwValue;
reg=::RegQueryValueEx(hKey,"COM",NULL,&type1,(BYTE*)&dwValue,&dww);
COM=dwValue+1;
reg=::RegQueryValueEx(hKey,"DelayIn",NULL,&type1,(BYTE*)&dwValue,&dww);
DelayIn=(int)(dwValue/10);
reg=::RegQueryValueEx(hKey,"DelayOut",NULL,&type1,(BYTE*)&dwValue,&dww);
DelayOut=(int)(dwValue/100);
reg=::RegQueryValueEx(hKey,"COLOR1",NULL,&type1,(BYTE*)&dwValue,&dww);
COLOR1=dwValue;
reg=::RegQueryValueEx(hKey,"COLOR2",NULL,&type1,(BYTE*)&dwValue,&dww);
COLOR2=dwValue;
reg=::RegQueryValueEx(hKey,"HEAV1",NULL,&type1,(BYTE*)&dwValue,&dww);
HEAV1=dwValue;
reg=::RegQueryValueEx(hKey,"HEAV2",NULL,&type1,(BYTE*)&dwValue,&dww);
HEAV2=dwValue;
reg=::RegQueryValueEx(hKey,"THIN",NULL,&type1,(BYTE*)&dwValue,&dww);
THIN=dwValue;
reg=::RegQueryValueEx(hKey,"B_",NULL,&type,(BYTE*)Value,&w);
B_[0]=atof(Value);
w=50;
reg=::RegQueryValueEx(hKey,"B_H",NULL,&type,(BYTE*)Value,&w);
B_[1]=atof(Value);看看! 这个是我的工程中的可以的
代码如下,请帮我指出错误的地方。
其中,存储键值的变量都为LPBYTE类型(LPBYTE DSN),再构造函数中初始化为
DSN=new BYTE[20]
HKEY hKEY;
LPCTSTR data_Set="SOFTWARE\\SSHIS\\XTWH";
long ret=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY));
if(ret!=ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行
{
AfxMessageBox("错误:无法打开有关的hKEY");
return;
}
DWORD type=REG_SZ;//定义数据类型
DWORD Cd1=20;//定义数据长度
DWORD Cd2=40;
ret=::RegQueryValueEx(hKEY,"DSN",NULL,&type,DSN,&Cd1);
if(ret!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关键名为DSN的注册表信息");
return;
}
ret=::RegQueryValueEx(hKEY,"LogID",NULL,&type,LogID,&Cd1);
if(ret!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关键名为LogID的注册表信息");
return;
}
ret=::RegQueryValueEx(hKEY,"USEDSN",NULL,&type,useDSN,&Cd1);
if(ret!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关键名为USEDSN的注册表信息");
return;
}
ret=::RegQueryValueEx(hKEY,"LogPwd",NULL,&type,LogPWD,&Cd1);
if(ret!=ERROR_SUCCESS)
{
AfxMessageBox("错误:无法查询有关键名为LogPWD的注册表信息");
return;
}
::RegCloseKey(hKEY);
者就是问题所在!我的例子中dwWord=50;每次确定!!
unsigned char tmp[256]="\0"; DWORD type=REG_SZ;
DWORD size=80; ret=::RegQueryValueEx(hKEY,"Path", NULL,&type,tmp,&size);
if(ret!=ERROR_SUCCESS)
{
::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK);
return FALSE;
}
//取得软件安装根目录
gl_SoftInfo.Path = CString(tmp); type=REG_SZ;
size=80;
memcpy(tmp,"\0",256);
ret=::RegQueryValueEx(hKEY,"SQLServerIP", NULL,&type,tmp,&size);
if(ret!=ERROR_SUCCESS)
{
::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK);
return FALSE;
}
//获得数据库服务器地址
gl_SoftInfo.SQLServerIP = CString(tmp);
type=REG_SZ;
size=80;
memcpy(tmp,"\0",256);
ret=::RegQueryValueEx(hKEY,"SQLServerUser", NULL,&type,tmp,&size);
if(ret!=ERROR_SUCCESS)
{
::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK);
return FALSE;
}
//获得数据库服务器用户
gl_SoftInfo.SQLServerUser = CString(tmp); type=REG_SZ;
size=80;
memcpy(tmp,"\0",256);
ret=::RegQueryValueEx(hKEY,"SQLServerPassWord", NULL,&type,tmp,&size);
if(ret!=ERROR_SUCCESS)
{
::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK);
return FALSE;
}
//获得数据库服务器用户口令
gl_SoftInfo.SQLServerPassword = CString(tmp); type=REG_SZ;
size=80;
memcpy(tmp,"\0",256);
ret=::RegQueryValueEx(hKEY,"FtpServerIP", NULL,&type,tmp,&size);
if(ret!=ERROR_SUCCESS)
{
::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK);
return FALSE;
}
//获得FTP服务器地址
gl_SoftInfo.FtpServerIP = CString(tmp); type=REG_SZ;
size=80;
memcpy(tmp,"\0",256);
ret=::RegQueryValueEx(hKEY,"FTPServerUser", NULL,&type,tmp,&size);
if(ret!=ERROR_SUCCESS)
{
::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK);
return FALSE;
}