становится ли ОС 32-битной или 64-битной - PullRequest
0 голосов
/ 26 января 2019

получение информации, если операционная система является 32-битной или 64-битной из Qt Framework, для переноса на другие ОС

Я могу получить из Qt информацию, для которой приложение было собрано как 32 или 64-бит (QSysInfo :: buildCpuArchitecture ()) или 32-битный или 64-битный процессор (QSysInfo :: currentCpuArchitecture ()), имя операционной системы (QSysInfo :: prettyProductName ()), но я не могу найти, как определить,операционная система является 32- или 64-битной с Qt (должна быть переносимой!).Есть ли какая-либо функция в Qt для получения этой информации?

Спасибо за ваше время.

qDebug() << "QSysInfo::buildCpuArchitecture():" << QSysInfo::buildCpuArchitecture();
qDebug() << "QSysInfo::currentCpuArchitecture():" << QSysInfo::currentCpuArchitecture();
qDebug() << "QSysInfo::buildAbi():" << QSysInfo::buildAbi();
qDebug() << "QSysInfo::prettyProductName():" << QSysInfo::prettyProductName();
// the result with MinGW 32-bit:
// QSysInfo::buildCpuArchitecture(): "i386"
// QSysInfo::currentCpuArchitecture(): "x86_64"
// QSysInfo::buildAbi(): "i386-little_endian-ilp32"
// QSysInfo::prettyProductName(): "Windows 10"
// the result with VC++ 64-bit:
// QSysInfo::buildCpuArchitecture(): "x86_64"
// QSysInfo::currentCpuArchitecture(): "x86_64"
// QSysInfo::buildAbi(): "x86_64-little_endian-llp64"
// QSysInfo::prettyProductName(): "Windows 10"

Ответы [ 2 ]

0 голосов
/ 28 января 2019

После многих испытаний я нашел решение, которое дает также правильный результат с 32-разрядным приложением для 64-разрядной Windows:

#if defined(Q_OS_WIN)
inline bool isWow64Process()
{
    // https://docs.microsoft.com/en-us/windows/desktop/api/wow64apiset/nf-wow64apiset-iswow64process

    typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
    BOOL bIsWow64 = FALSE;

    //IsWow64Process is not available on all supported versions of Windows.
    //Use GetModuleHandle to get a handle to the DLL that contains the function
    //and GetProcAddress to get a pointer to the function if available.
    LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
                GetModuleHandle(TEXT("kernel32")),"IsWow64Process");

    if( NULL != fnIsWow64Process )
    {
        if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64))
        {
            // we couldn't get the pointer to the function,
            // we assume that app is not running as 
            // WOW64 process and return therefore FALSE
            bIsWow64 = FALSE;
        }
    }
    return bIsWow64;
}
#endif  // (_MSC_VER)

QString osInfo()
{
#if defined(Q_OS_WIN)
    QString osBitness( QSysInfo::buildAbi().contains("ilp32") && !isWow64Process()? "32-bit" : "64-bit" );
    return QString( QSysInfo::prettyProductName() + " - " + osBitness);
#else   // we do not know how to get OS bitness on Linux and OS-X (we do not mean processor, neither application, but OS!)
     return QSysInfo::prettyProductName();
#endif
}
0 голосов
/ 26 января 2019

Хотя название предполагает иное, currentCpuArchitecture не говорит вам, является ли процессор 32-битным или 64-битным, но расскажет вам о разрядности операционной системы.

QString QSysInfo :: currentCpuArchitecture()

Возвращает архитектуру процессора, на котором работает приложение, в текстовом формате.Обратите внимание, что эта функция зависит от того, что ОС сообщит, и может не определить фактическую архитектуру ЦП, если ОС скрывает эту информацию или не может ее предоставить. Например, 32-разрядная ОС, работающая на 64-разрядном процессоре, обычно не может определить, действительно ли процессор способен выполнять 64-разрядные программы.

http://doc.qt.io/qt-5/qsysinfo.html#currentCpuArchitecture

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...