Visual c++ 我想从注册表中获取所有启动程序,有人能帮我吗?

Visual c++ 我想从注册表中获取所有启动程序,有人能帮我吗?,visual-c++,mfc,Visual C++,Mfc,我试过这个密码。。。。。。 `CStringArray csastartprogram csaStartUpProgram.Add(Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce); csaStartUpProgram.Add(Software\\Microsoft\\Windows\\CurrentVersion\\Run); csaStartUpProgram.Add(SOFTWARE\\Wow6432Node\\Microso

我试过这个密码。。。。。。 `CStringArray csastartprogram

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;
    }
    }
}`
csastartprogram.Add(软件\\Microsoft\\Windows\\CurrentVersion\\RunOnce);
csaStartUpProgram.Add(软件\\Microsoft\\Windows\\CurrentVersion\\Run);
csaStartUpProgram.Add(软件\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\RunOnce);
csaStartUpProgram.Add(软件\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run);

对于(int nStartupProgram=0;nStartupProgram我相信您的程序是一个Win32程序,您正试图在64位操作系统上运行。该操作系统有一种称为的特殊机制,允许32位应用程序在64位环境中访问一个单独的注册表节点。基本上,每次打开
Software\\Microsoft\\
键时,操作系统都会重定向u到
Software\\Wow6432Node\\Microsoft\\
键。因此,您将读取同一个键两次

在上面超链接的文章中,他们说为了显式访问64位应用程序的节点,您需要使用以下标志:KEY\u WOW64\u 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
);

我认为它指向WoW6432Node路径,即Software\\Microsoft\\Windows\\CurrentVersion\\Run路径。这可能是指向WoW6432Node的Win32函数,然后如何从上面的路径获取程序。。。。。。。