32位QT程序读取64位系统的注册表中的64位安装软件

时间:2022-09-05 09:02:10

什么开启和关闭系统文件重定向,或者开启或关闭注册表反射,或者头文件定义#defineKEY_WOW64_64KEY256,我都试过了,至少对我来说,都没用,最终实现代码如下:

测试:在64位的win7上安装了64位和32位的HFSS几款软件,能读取64位的HFSS的安装路径,如果要读取32位的HFSS,只保留RegOpenKeyEx中的KEY_ALL_ACCESS

在QT下使用msvc或minGW时记得在工程中添加  LIBS+= -lsetupapi-ladvapi32

QList<QString> ReadRegedit64()
{
    QList<QString> hfss64;
    hfss64.clear();
    QString Key = "SOFTWARE\\Ansoft\\HFSS\\1X.0\\Desktop";
    QList<QString> Key_List;
    for(int i=0;i<=6;i++)
    {
        QString  vesion_num = Key;
        vesion_num.replace("X",QString::number(i));
        Key_List.append(vesion_num);
    }
    for(int i=0;i<=6;i++)
    {
    LPCWSTR subkey = Key_List.at(i).utf16();
    HKEY key;
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0, KEY_ALL_ACCESS | KEY_WOW64_64KEY,&key)==0)
    {
        char szDataFile[200]={0};
 
        QString install_dir = "InstallationDirectory";
        LPCWSTR subkey = install_dir.utf16();
        ULONG cbSize = 1024;
        RegQueryValueEx(key,subkey,NULL,NULL,(LPBYTE)szDataFile,&cbSize);
        QString hfss64_path = QString::fromUtf16((LPCTSTR)szDataFile);
        hfss64_path.insert(hfss64_path.size(),"/hfss.exe");
        hfss64.append(hfss64_path);
        RegCloseKey(key);
    }
    }
 
 
  return hfss64;
 
}
 
判断系统是否为64位:
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
BOOL IsWow64()
{
    LPFN_ISWOW64PROCESS fnIsWow64Process;
    BOOL bIsWow64 = FALSE;
    fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
        GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
    if(NULL != fnIsWow64Process)
    {
        if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
        {
        }
    }
    return bIsWow64;
}