我用RegOpenKeyEx()打开一个键,结果保存在句柄HKEY hKEY中。
当我再调用RegEnumValue()时程序就不能运行了。debug这个程序可以看到RegEnumValue中的第一个参数hKEY是unused,但是调用RegOpenValueEx()是可行的。
我在打开句柄的时候注意到了设置为KEY_QUERY_VALUE.
请高手指教
谢谢
当我再调用RegEnumValue()时程序就不能运行了。debug这个程序可以看到RegEnumValue中的第一个参数hKEY是unused,但是调用RegOpenValueEx()是可行的。
我在打开句柄的时候注意到了设置为KEY_QUERY_VALUE.
请高手指教
谢谢
{
HKEY key;
DWORD dwValue, dw;
long ret; ret = RegOpenKeyEx (HKEY_CURRENT_USER, path, 0L, KEY_ALL_ACCESS, &key);
if(ret != ERROR_SUCCESS)
{
ret = RegCreateKeyEx (HKEY_CURRENT_USER, path, 0L, NULL,
0, KEY_ALL_ACCESS, NULL, &key, &dw);
}
if(ret == ERROR_SUCCESS)
{
dwValue = (DWORD)val;
ret = RegSetValueEx (key, pszKey, 0L, REG_DWORD, (const BYTE*)&dwValue, sizeof(DWORD));
RegCloseKey(key);
return (ret==ERROR_SUCCESS);
} return FALSE;
}BOOL SetRegValue(const char *path, const char *pszKey, const char *val)
{
HKEY key;
DWORD dw;
long ret; ret = RegOpenKeyEx (HKEY_CURRENT_USER, path, 0L, KEY_ALL_ACCESS, &key);
if(ret != ERROR_SUCCESS)
{
ret = RegCreateKeyEx (HKEY_CURRENT_USER, path, 0L, NULL,
0, KEY_ALL_ACCESS, NULL, &key, &dw);
}
if(ret == ERROR_SUCCESS)
{
ret = RegSetValueEx (key, pszKey, 0L, REG_SZ, (const BYTE*)val, strlen(val)+1);
RegCloseKey(key);
return (ret==ERROR_SUCCESS);
} return FALSE;
}BOOL SetRegBinary(const char *path, const char *pszKey, const void *val, int len)
{
HKEY key;
DWORD dw;
long ret; ret = RegOpenKeyEx (HKEY_CURRENT_USER, path, 0L, KEY_ALL_ACCESS, &key);
if(ret != ERROR_SUCCESS)
{
ret = RegCreateKeyEx (HKEY_CURRENT_USER, path, 0L, NULL,
0, KEY_ALL_ACCESS, NULL, &key, &dw);
}
if(ret == ERROR_SUCCESS)
{
ret = RegSetValueEx (key, pszKey, 0L, REG_BINARY, (const BYTE*)val, len);
RegCloseKey(key);
return (ret==ERROR_SUCCESS);
} return FALSE;
}
大多数情况是HKEY未保存.
int index = 0;
char sub_path[260];
char sub_name[260], szTmp[260];
char cSystem, szWindows[260]; const char *glpath = "software\\xxxxxx\\Game";
if(RegOpenKey(HKEY_CURRENT_USER, glpath, &key)==ERROR_SUCCESS)
{
index = 0;
while(1)
{
if(RegEnumKey(key, index, sub_name, sizeof(sub_name))!=ERROR_SUCCESS)
break;
_snprintf(sub_path, sizeof(sub_path), "%s\\%s", glpath, sub_name);
sub_path[sizeof(sub_path) -1] = 0; if(ReadRegPath(sub_path, "Path", szTmp, sizeof(szTmp)))
{
formula_path(szTmp, sizeof(szTmp)); //下面开始是否已经存在指定的目录
for(int i=0; i<m_glpath_count; i++)
{
if(stricmp(m_glpath[i], szTmp) == 0)
break;
}
//
if(i == m_glpath_count)
{
strcpy(m_glpath[m_glpath_count], szTmp);
m_glpath_count ++;
if(m_glpath_count >= MAX_PATH_LIST)
break;
}
}
index ++;
}//while(1)
RegCloseKey(key);
}
参考参考。
HKEY hKEY;
LPCTSTR path="Identities\\{48C75F63-789B-47F7-96EF-752E399408E4}";
long ret0=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Control\\Nls\\CodePage",0,KEY_QUERY_VALUE,&hKEY);
if(ret0!=ERROR_SUCCESS){
AfxMessageBox("错误: 无法打开有关的hKEY!");
return;
}
DWORD iQuery_Value=0;
while(1){
if(iQuery_Value==5){
break;
}
LPTSTR lpValueName=NULL;
DWORD lpcbValueName=sizeof(lpValueName);
DWORD type_1;
LPBYTE pchGUID=NULL;
DWORD lpcbData_1=sizeof(pchGUID);
long ret1=::RegEnumValue(hKEY,iQuery_Value,lpValueName,&lpcbValueName,NULL,&type_1,pchGUID,&lpcbData_1);
if(ret1==ERROR_NO_MORE_ITEMS){
AfxMessageBox("Over!");
break;
}
}
::RegCloseKey(hKEY);
LPTSTR lpValueName=NULL;
DWORD lpcbValueName=sizeof(lpValueName);
有误
你可以先分配Buffer,再传入::RegEnumValue函数中
如果你是重用同一块Buffer,记得要重新将lpcbValueName赋值
因为lpcbValueName会被RegEnumValue 修改以下是获取DSN的代码,可供参考
HKEY hKey = NULL;
if(ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER,_T("Software\\ODBC\\ODBC.INI\\ODBC Data Sources"),0,KEY_READ,&hKey))
{
char strVal[512];
int nIndex = 0;
DWORD nSize = 512;
while(ERROR_SUCCESS == ::RegEnumValue(hKey,nIndex,strVal,&nSize,NULL,NULL,NULL,NULL))
{
strVal[511] = 0;
pList->AddString(strVal);
nSize = 512;
nIndex ++;
}
}
::RegCloseKey(hKey);
if(ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Software\\ODBC\\ODBC.INI\\ODBC Data Sources"),0,KEY_READ,&hKey))
{
char strVal[512];
int nIndex = 0;
DWORD nSize = 512;
while(ERROR_SUCCESS == ::RegEnumValue(hKey,nIndex,strVal,&nSize,NULL,NULL,NULL,NULL))
{
strVal[511] = 0;
pList->AddString(strVal);
nSize = 512;
nIndex ++;
}
}
::RegCloseKey(hKey);