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

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

本文关键字:但这 hKey CRegKey      更新时间:2023-10-16

我想通过注册表获得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。那么发生了什么?如何修复这个bug?

下面是我的代码:
// 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);

您不能在尝试Open之后简单地使用CRegKey变量key,而不检查它的返回值。

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

系统错误码和/或FormatMessage

您还可以查看函数的实现,并在其中进行调试,因为它内联在头文件中:

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;
}
相关文章: