gpt4 book ai didi

c - RegQueryValueExW 返回 C 中的访问冲突读取位置异常

转载 作者:行者123 更新时间:2023-11-30 16:22:05 25 4
gpt4 key购买 nike

我有两个用 C 编写的函数,它们应该从 Windows 注册表中读取一些信息。尽管两者使用相同的逻辑,但其中之一会引发错误。有效的函数会获取一些 CPU 信息。

struct CPUInfo {
wchar_t model[128];
DWORD frequency;
};

struct CPUInfo cpuinfo() {
SYSTEM_INFO siSysInfo;
HKEY hKey;

struct CPUInfo cpu = { L"", 0 };

LONG lRes = RegOpenKeyExW(
HKEY_LOCAL_MACHINE,
L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
0,
KEY_READ,
&hKey
);
if (lRes == ERROR_SUCCESS) {
DWORD dwBufferSize = sizeof(cpu.model);

ULONG nError = RegQueryValueExW(
hKey,
L"ProcessorNameString",
0,
NULL,
(LPBYTE)cpu.model,
&dwBufferSize
);
dwBufferSize = sizeof(DWORD);
nError = RegQueryValueExW(
hKey,
L"~MHz",
0,
NULL,
(LPBYTE)(&cpu.frequency),
&dwBufferSize
);
RegCloseKey(hKey);
}

return cpu;
}

此功能有效,并且从注册表中检索信息。现在,我用这个函数第二次做同样的事情

struct GPUInfo {
DWORD adaptersCount;
};

struct GPUInfo gpuinfo() {
HKEY hKey;
struct GPUInfo gpu = { 0 };

LONG lRes = RegOpenKeyExW(
HKEY_LOCAL_MACHINE,
L"HARDWARE\\DEVICEMAP\\VIDEO",
0,
KEY_READ,
&hKey
);
if (lRes == ERROR_SUCCESS) {
DWORD dwBufferSize = sizeof(DWORD);
ULONG nError = RegQueryValueExW(
hKey,
L"MaxObjectNumber",
0,
NULL,
(LPBYTE)(&gpu.adaptersCount),
dwBufferSize
);

RegCloseKey(hKey);
}

return gpu;
}

当我调试程序时,就像我说的,第一个函数可以工作,但第二个函数此时抛出异常:

ULONG nError = RegQueryValueExW( // !!!! Access violation reading location 0x0000000000000004
hKey,
L"MaxObjectNumber",
0,
NULL,
(LPBYTE)(&gpu.adaptersCount),
dwBufferSize
);

我已检查注册表,该路径确实存在。真的不明白为什么第一个有效但第二个无效。我一个接一个地调用他们

最佳答案

注意编译器警告。您正在lpcbData(缓冲区长度)按值传递,而不是按地址

它应该看起来像这样:

DWORD dwBufferSize = sizeof(gpu.adaptersCount);  // (2)
ULONG nError = RegQueryValueExW(
hKey,
L"MaxObjectNumber",
0,
NULL,
(LPBYTE)(&gpu.adaptersCount),
&dwBufferSize // (1)
);

变化:

  1. dwBufferSize 前面添加&符号,就像您的第一个示例
  2. 使用sizeof您的实际结构成员。这是等效的,但面对 future 的变化更安全。

引用:-RegQueryValueExW

关于c - RegQueryValueExW 返回 C 中的访问冲突读取位置异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54573530/

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