作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个用 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)
);
变化:
dwBufferSize
前面添加&符号,就像您的第一个示例sizeof
您的实际结构成员。这是等效的,但面对 future 的变化更安全。引用:-RegQueryValueExW
关于c - RegQueryValueExW 返回 C 中的访问冲突读取位置异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54573530/
我正在 Windows CE 上查询注册表。我想从注册表的 TcpIp 区域拉回 DhcpDNS 值,这有效。 但是,如果有两个值 - 在我的 CE 注册表编辑器中显示为 "x.x.x.x""x.x.
我有两个用 C 编写的函数,它们应该从 Windows 注册表中读取一些信息。尽管两者使用相同的逻辑,但其中之一会引发错误。有效的函数会获取一些 CPU 信息。 struct CPUInfo {
我是一名优秀的程序员,十分优秀!