c++ - HKEY 句柄为 NULL,在调试期间它写入未使用的<无法读取内存>

标签 c++ c windows winapi registry

我在匿名命名空间中定义了 HKEY,以便在更多 cpp 中使用它。我创建寄存器键,它通常返回 HKEY,然后我想在另一个 cpp 中使用该句柄,它是 NULL。当我调试时,它会写入未使用的。

这是一个 .h 文件 (structAndHandle.h)

namespace
{
StCommand command;
HANDLE dataInEvent;
HANDLE dataOutEvent;
HANDLE threadHandle;
HANDLE mutexHandle;
HKEY hKey;
TCHAR repositoryPath[MAX_PATH];
}

我在这里创建它...(repositoryStore.cpp)

if (RegCreateKeyEx(HKEY_CURRENT_USER, STR_KEY_NAME, 0L, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL)
    != ERROR_SUCCESS)
{
    _tprintf_s(_T("Could not create or open register key: %s\n"), STR_KEY_NAME);
}

TCHAR pathValueName[MAX_PATH] = _T("repositoryPath");
TCHAR indexValueName[MAX_PATH] = _T("repositoryIndex");

TCHAR repPath[MAX_PATH] = _T("C:\\repository\0");
if (RegSetValueEx(hKey, pathValueName, 0L, REG_SZ, (LPBYTE)repPath, _tcslen(repPath) * sizeof(TCHAR))
    != ERROR_SUCCESS)
{
    _tprintf_s(_T("Could not create or set register value: %s\n"), repPath);
}

DWORD repositoryIndex = 0;
if (RegSetValueEx(hKey, indexValueName, 0L, REG_DWORD, (LPBYTE)&repositoryIndex, sizeof(DWORD))
    != ERROR_SUCCESS)
{
    _tprintf_s(_T("Could not create or set register value: repositoryIndex\n"));
}

当我想在这里使用它时,在另一个cpp中,它是NULL(settings.cpp)

DWORD GetDwordSetting(TCHAR* valueName, DWORD defaultValueData)
{
DWORD receivedData;
DWORD type = REG_DWORD;
DWORD size = sizeof(DWORD);
if (RegQueryValueEx(hKey, valueName, 0L, &type, (LPBYTE)&receivedData, &size)
    != ERROR_SUCCESS)
{
    _tprintf_s(_T("Could not get register value: repositoryIndex\n"));
    return defaultValueData;
}
return receivedData;
}

DWORD SetDwordSetting(TCHAR* valueName, DWORD valueData)
{
if (RegSetValueEx(hKey, valueName, 0L, REG_DWORD, (LPBYTE)&valueData, sizeof(DWORD))
    != ERROR_SUCCESS)
{
    _tprintf_s(_T("Could not set register value: repositoryIndex\n"));
    return GetLastError();
}
return 0;
}

DWORD GetSzSetting(TCHAR* valueName, TCHAR* defaultValueData)
{
DWORD type = REG_SZ;
DWORD size = sizeof(TCHAR) * sizeof(MAX_PATH);
if (RegQueryValueEx(hKey, valueName, 0L, &type, (LPBYTE)&repositoryPath, &size)
    != ERROR_SUCCESS)
{
    _tcscpy_s(repositoryPath, defaultValueData);
    _tprintf_s(_T("Could not get register value: repositoryPath\n"));
    return GetLastError();
}
return 0;
}

最佳答案

不要将句柄放在未命名的命名空间中,而是将它们放在单例类中,这样多个 .cpp 文件可以访问同一个实例:

class AllMyHandles {
public:
    static AllMyHandles& instance() {
         static AllMyHandles theInstance;
         return theInstance;
    }

    // provide getter setter methods for these handles

private:
    StCommand command;
    HANDLE dataInEvent;
    HANDLE dataOutEvent;
    HANDLE threadHandle;
    HANDLE mutexHandle;
    HKEY hKey;
    TCHAR repositoryPath[MAX_PATH];

    AllMyHandles() {}    
};

另一种方法是拥有一个简单的类/结构(没有 instance() 函数),并将它们的实例作为引用参数传递。

关于c++ - HKEY 句柄为 NULL,在调试期间它写入未使用的<无法读取内存>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26561621/

相关文章:

c++ - 混淆的引用输出,如何分析?

c - 将 argv[] 存储到两个数组中,用一个特殊的字符串分隔 (C)

windows - 如何重新评估批处理变量?

c - 将指针值放入数组中

c - 重用可变参数

Windows cmd 删除每个 bin 和 obj 文件夹

windows - Windows 中的不朽进程;没办法杀死它

c++ - 防止滥用专为运输设计的结构

c++ - lua + 视觉 C++ 2008 : fatal error LNK1107

c++ - boost序列化多态类