gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:45:19 28 4
gpt4 key购买 nike

我在匿名命名空间中定义了 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com