我正在尝试使用注册表找到Excel的路径,并尝试调整我在互联网上找到的一些代码。我正在使用64位Win7并确认密钥是使用regedit。
#include <windows.h>
#include <iomanip>
#include <iostream>
using namespace std;
int main()
{
HKEY hKey = 0;
char buf[255] = {0};
DWORD dwType = 0;
DWORD dwBufSize = sizeof(buf);
const char* subkey = "SOFTWARE\\Classes\\Excel.Application\\CLSID";
if( RegOpenKey(HKEY_LOCAL_MACHINE,subkey,&hKey) == ERROR_SUCCESS)
{
dwType = REG_SZ;
if( RegQueryValueEx(hKey,"default",0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS)
{
cout << "key value is '" << buf << "'\n";
}
else
cout << "can not query for key value\n";
RegCloseKey(hKey);
}
else
cout << "Can not open key\n";
cin.ignore();
return 0;
}
有谁知道为什么这不起作用? 谢谢 詹姆斯
答案 0 :(得分:1)
几乎所有Windows API函数在失败时都会设置更详细的错误代码,您可以通过调用GetLastError()
获取更多详细信息。在调用RegOpenKey()
失败后,您应该调用它。
在您的示例中,RegOpenKey()
可能因访问被拒绝错误而失败。 RegOpenKey()
打开具有完全读/写/删除访问权限的注册表项。 Windows 7上的标准用户在HKLM上没有写入或删除访问权限,因此RegOpenKey()
将失败。
您应该使用RegOpenKeyEx()来指定只读访问权限,如下所示。
RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkey, 0, KEY_READ, &hKey)
PS。在询问上述问题时,您应该更好地描述代码失败的方式。在上面的示例中,您应该包括哪个行/函数调用失败。例如“当我使用此代码时,对RegOpenKey的调用失败。
答案 1 :(得分:1)
尝试更改
RegQueryValueEx(hKey,"default",0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS)
与
RegQueryValueEx(hKey, NULL, 0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS)
如果你想要“默认”值,你应该在lpValueName字段中传递NULL或空字符串。
此外,如果您的应用程序不是64位且您在64位操作系统中运行,则应检查RegOpenKeyEx函数上的KEY_WOW64_64KEY标志,以便能够访问所需的密钥。