我用CRegKey打开一些,但是这个m_hKey != 0

I use CRegKey to open some, but this m_hKey != 0

我想通过注册表获取JDk路径,这个路径是:

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.8

当我使用:

CRegKey.open(HKEY_LOCAL_MACHINE, L"SOFTWARE\JavaSoft\Java Development Kit\1.8")

它抛出表达式 m_hKey != 0。那么发生了什么?如何修复此错误?

这是我的代码:

// Get Java environment variable install path
CRegKey key;
wchar_t JavaHome[40];
ULONG szJavaHome = 40;
bool rest = key.Open(HKEY_LOCAL_MACHINE, L"SOFTWARE\JavaSoft\Java Development Kit\1.8");
if (key.m_hKey == 0)
    MessageBox(L"11");
rest = key.QueryStringValue(L"JavaHome", JavaHome, &szJavaHome);

您不能简单地使用 CRegKey variable key after trying to Open 它,而不检查它的 return 值。

auto retOpenKey = key.Open(...); //LONG not bool
if (ERROR_SUCCESS == retOpenKey)
{
    //Ok do stuff with key
}
else
    auto err = GetLastError();

System error codes and / or FormatMessage

您还可以查看函数的实现,并在那里进行调试,因为它在 header:

中是内联的
inline LONG CRegKey::Open(
    _In_ HKEY hKeyParent,
    _In_opt_z_ LPCTSTR lpszKeyName,
    _In_ REGSAM samDesired) throw()
{
    ATLASSUME(hKeyParent != NULL);
    HKEY hKey = NULL;
    LONG lRes = m_pTM != NULL ?
        m_pTM->RegOpenKeyEx(hKeyParent, lpszKeyName, 0, samDesired, &hKey) :
        RegOpenKeyEx(hKeyParent, lpszKeyName, 0, samDesired, &hKey);
    if (lRes == ERROR_SUCCESS)
    {
        lRes = Close();
        ATLASSERT(lRes == ERROR_SUCCESS);
        m_hKey = hKey;
#if WINVER >= 0x0501
        m_samWOW64 = samDesired & (KEY_WOW64_32KEY | KEY_WOW64_64KEY);
#endif
    }
    return lRes;
}