RegQueryInfoKey没有给出注册表项名称文本

时间:2013-06-08 12:55:15

标签: mfc registry key

使用RegQueryInfoKey上可用的示例中的http://msdn.microsoft.com/en-us/library/windows/desktop/ms724256(v=vs.85).aspx,并未在输出参数achClass中提供注册表文件夹名称。我总是收到一个空字符串。 我的问题是:在获取密钥名称后,是否必须调用任何其他函数?或者我可以使用它,但我错过了什么?

旁注:机器是Windows 7,64位。

提前致谢

更新:代码

//呼叫网站:

HKEY hKey;
LSTATUS status= RegOpenKeyEx(HKEY_CURRENT_USER, InstanceFullName, 0, KEY_ALL_ACCESS, &hKey);
if ( status != ERROR_SUCCESS)
{
    LPVOID lpMsgBuf;
    FormatMessage( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM | 
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        status,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
        (LPTSTR) &lpMsgBuf,
        0,
        NULL 
    );

    this->MessageBox( (LPCTSTR)lpMsgBuf, GetProgramTitle(), MB_OK | MB_ICONERROR );
    LocalFree( lpMsgBuf );
    return;     
}

status= MyRegSaveKey(hKey, sTempRegFilePath, NULL);

//调用函数

LSTATUS MyRegSaveKey(_In_ HKEY hKey, _In_ LPCTSTR lpFile, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes)
{
CXmlWriter xmlWriter;
if(!xmlWriter.Begin(lpFile))
    return ERROR_CANNOT_MAKE;

LSTATUS retCode= _MyRegSaveKey(hKey, lpFile, lpSecurityAttributes, xmlWriter);

xmlWriter.Finish();

return retCode;
}

//内部调用函数

LSTATUS _MyRegSaveKey(_In_ HKEY hKey, _In_ LPCTSTR lpFile, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, CXmlWriter& writer)
{
//http://msdn.microsoft.com/en-us/library/windows/desktop/ms724256(v=vs.85).aspx
TCHAR    achKey[MAX_KEY_LENGTH];   // buffer for subkey name
DWORD    cbName;                   // size of name string 
TCHAR    achClass[MAX_PATH] = TEXT("");  // buffer for class name 
achClass[0] = '\0'; 
DWORD    cchClassName = MAX_PATH;  // size of class string 
DWORD    cSubKeys=0;               // number of subkeys 
DWORD    cbMaxSubKey;              // longest subkey size 
DWORD    cchMaxClass;              // longest class string 
DWORD    cValues;              // number of values for key 
DWORD    cchMaxValue;          // longest value name 
DWORD    cbMaxValueData;       // longest value data 
DWORD    cbSecurityDescriptor; // size of security descriptor 
FILETIME ftLastWriteTime;      // last write time 

DWORD i, retCode; 

TCHAR  achValue[MAX_VALUE_NAME]; 
DWORD cchValue = MAX_VALUE_NAME;
DWORD type;
BYTE* pData= NULL;
DWORD size;

// Get the class name and the value count. 
retCode = RegQueryInfoKey(
    hKey,                    // key handle 
    achClass,                // buffer for class name 
    &cchClassName,           // size of class string 
    NULL,                    // reserved 
    &cSubKeys,               // number of subkeys 
    &cbMaxSubKey,            // longest subkey size 
    &cchMaxClass,            // longest class string 
    &cValues,                // number of values for this key 
    &cchMaxValue,            // longest value name 
    &cbMaxValueData,         // longest value data 
    &cbSecurityDescriptor,   // security descriptor 
    &ftLastWriteTime       // last write time 
);

if(retCode != ERROR_SUCCESS)
    return retCode;

//... the rest does not make any difference

return ERROR_SUCCESS;
}

1 个答案:

答案 0 :(得分:1)

现在我可以看到代码,看起来你希望得到打开密钥的名称。

您不能使用RegQueryInfoKey()的lpClass参数 - 请参阅此SO answer;看起来您提到的示例仅使用cSubKeys来电中的cValuesRegQueryInfoKey()

从这个SO answer [虽然问题是针对Perl],它看起来不像Win32注册表API有一个函数会让你拿走句柄并返回键名。

在同一篇文章中,只有两个实用的解决方案是

  • 维护Open的返回对象列表及其自己的路径

  • 扩展Win32 :: Registry API以调用NtQueryKey中的ntdll.dll导出函数并执行this stackoverflow answer

  • 中显示的内容
相关问题