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