visual c ++ - 我想从注册表获取所有启动程序,任何人都可以帮助我



我试过这个代码......'CStringArray csaStartUpProgram;

csaStartUpProgram.Add(Software\Microsoft\Windows\CurrentVersion\RunOnce);
csaStartUpProgram.Add(Software\Microsoft\Windows\CurrentVersion\Run);
csaStartUpProgram.Add(SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce);
csaStartUpProgram.Add(SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run);
for(int nStartupProgram=0;nStartupProgram<csaStartUpProgram.GetSize();nStartupProgram++)
{

    HKEY hKey;
    if (RegOpenKey(HKEY_LOCAL_MACHINE,csaStartUpProgram[nStartupProgram],&hKey) == ERROR_SUCCESS)
    {
    DWORD dwValues, dwMaxValueNameLen, dwMaxValueLen;
    LONG lRet = ::RegQueryInfoKey(hKey, 
                          NULL, NULL,    // lpClass, lpcClass
                          NULL,          // lpReserved
                          NULL, NULL,    // lpcSubKeys, lpcMaxSubKeyLen
                          NULL,          // lpcMaxClassLen
                          &dwValues,
                          &dwMaxValueNameLen,
                          &dwMaxValueLen,
                          NULL,          // lpcbSecurityDescriptor
                          NULL);         // lpftLastWriteTime
    if(ERROR_SUCCESS == lRet)
    {  
        // allocate enough to fit max. length name and value
        LPTSTR pszName = new TCHAR[dwMaxValueNameLen + 1];
        LPBYTE lpData   = new BYTE[dwMaxValueLen];
        for(DWORD dwIndex = 0; dwIndex < dwValues; dwIndex++)
        {
            DWORD dwNameSize  = dwMaxValueNameLen + 1;
            DWORD dwValueSize = dwMaxValueLen;
            DWORD dwType;
             lRet = ::RegEnumValue(hKey, dwIndex, pszName, &dwNameSize,0, &dwType, lpData, &dwValueSize);
            CString strName = pszName;
            if(REG_SZ == dwType)
            {
                CString strValue = (LPCTSTR)lpData;

            }
        CLog::Log(strName + _T(""));
        }
    delete []pszName;
    delete []lpData;
    }
    }
}`

我正在获得输出:

沟通SAP_WUS_UNT,BCSSync, 沟通 SAP_WUS_UNT, BCSSync,

相同的输出重复两次,但我希望上面的所有程序启动路径,请帮助我......

我相信

您的程序是您尝试在 32 位操作系统上运行的 Win64 程序。操作系统具有称为注册表重定向器的特殊机制,该机制允许 32 位应用程序访问 64 位环境中的单独注册表节点。基本上,每次您打开Software\Microsoft\密钥时,操作系统都会将您重定向到Software\Wow6432Node\Microsoft\密钥。因此,您正在两次读取相同的密钥。

在上面的超链接的文章中,他们说为了显式访问 64 位应用程序的节点,您需要使用此标志:KEY_WOW64_64KEY

KEY_WOW64_64KEY 和 KEY_WOW64_32KEY 标志启用显式访问 分别到 64 位注册表视图和 32 位视图。为 有关更多信息,请参见访问备用注册表视图。

在侧节点上,我看不到您关闭 HKEY 手柄的位置。用RegOpenKey打开它后关闭它总是一个好主意。此外,请使用较新的 API,RegOpenKeyEx .

要打开 64 位密钥,请使用以下代码:

::RegOpenKeyEx(
  HKEY_LOCAL_MACHINE,                 //_In_        HKEY hKey,
  csaStartUpProgram[nStartupProgram], //_In_opt_    LPCTSTR lpSubKey,
  NULL,                               //_Reserved_  DWORD ulOptions,
  KEY_WOW64_64KEY,                    //_In_        REGSAM samDesired,
  &hKey                               //_Out_       PHKEY phkResult
);

相关内容

  • 没有找到相关文章

最新更新