试图通过搜索注册表找到excel的路径

时间:2012-02-06 12:45:02

标签: c++ windows registry

我正在尝试使用注册表找到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;
}

有谁知道为什么这不起作用? 谢谢 詹姆斯

2 个答案:

答案 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标志,以便能够访问所需的密钥。