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

Trying to find the path to excel by searching the registry

本文关键字:excel 路径 注册表 搜索      更新时间:2023-10-16

我正在尝试使用注册表找到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 valuen";
    RegCloseKey(hKey);
}
else
    cout << "Can not open keyn";
cin.ignore();
return 0;
}

有人知道为什么不起作用吗?谢谢James

尝试更改

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标志,以访问你想要的密钥。

几乎所有的Windows API函数在失败时,都会设置更详细的错误代码,您可以通过调用GetLastError()获取更多详细信息。您应该在对RegOpenKey()的调用失败后调用它。

在您的示例中,RegOpenKey()可能由于访问被拒绝错误而失败。RegOpenKey()打开具有完全读/写/删除访问权限的注册表项。Windows 7上的标准用户没有对HKLM的写入或删除访问权限,因此RegOpenKey()将失败。

您应该使用RegOpenKeyEx(),它将允许您指定只读访问,如下所示。

RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkey, 0, KEY_READ, &hKey)

PS。当问像上面这样的问题时,你应该更多地描述代码是如何失败的。在上面的示例中,您应该包括哪一行/函数调用失败。例如"当我使用此代码时,对RegOpenKey的调用失败。