Программа работает в режиме совместимости - PullRequest
6 голосов
/ 10 августа 2010

Существует ли функция C ++ .NET, которую я могу вызвать, чтобы определить, работает ли моя программа в режиме совместимости?Если нет ни одного, кто-то может показать мне код для одного?Спасибо.

Например:

Программа загружает, проверяет режим совместимости, если true, затем завершается, в противном случае запускается

Ответы [ 3 ]

8 голосов
/ 10 августа 2010

С другого форума

После нескольких поисков в Google тщетно, я решил поэкспериментировать сам.Я обнаружил, что параметры совместимости для каждого исполняемого файла хранятся - как я и думал - в реестре Windows.

Ключ, в котором хранятся параметры:
HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \CurrentVersion \ AppCompatFlags \ Layers

Для каждого приложения, для которого указаны параметры совместимости, существует значение под этим ключом, имя которого представляет собой путь к исполняемому файлу, а данные - это строка, состоящая из параметров совместимости.

Ключевыми словами в строке, которые задают параметры совместимости, являются: WIN95 WIN98 NT4SP5
WIN2000 256COLOR 640X480
ОТКЛЮЧИТЬСЯ ОТМЕНЫ DISABLECICERO

Если указано несколько параметров (или они должны быть указаны), тоДанные состоят из настроек выше, разделенных пробелом каждый.Первые четыре параметра являются взаимоисключающими, то есть указывается только один из них (если вообще указан).Я не проверял последствия указания нескольких операционных систем.

Итак, вернемся к решению вашей проблемы.Чтобы проверить, настроен ли исполняемый файл (скажем, «C: \ path \ executetable.exe») для работы в 256-цветном режиме, необходимо указать значение с именем «C: \ path \ executetable.exe» (без кавычек,даже если путь содержит пробелы) под ключом [HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers], а данные, связанные со значением, будут содержать строку «256COLOR».Если он также настроен на работу в режиме совместимости под Windows 98 / ME, данные будут «WIN98 256COLOR».

Итак, подход прост.Проверьте, есть ли значение с полным путем к исполняемому файлу под ключом, который я упомянул выше.Если нет, в исполняемом файле не было указано никаких параметров совместимости.Если значение существует, извлеките его данные и проверьте наличие «256COLOR» в данных.Соответственно, наличие «WIN95», «WIN98», «NT4SP5» или «WIN2000» будет означать, что исполняемый файл настроен для работы в режиме совместимости для этой конкретной операционной системы.

3 голосов
/ 07 мая 2011

Получите версию операционной системы, возвращенную с GetVersionEx, и сравните ее с версией файла на kernel32.dll.В режиме совместимости приложений GetVersionEx всегда будет возвращать версию операционной системы, которая «эмулируется».Если обе версии разные, значит, вы находитесь в режиме совместимости приложений.

1 голос
/ 22 марта 2015

Ответ выше помог мне получить «решение» для данного вопроса.Это, вероятно, не самый элегантный, но, кажется, работает.Очевидно, вы можете стать более креативным в отношении типа возвращаемого значения.Булона здесь не хватает.Я думаю, что нативный API был бы хорош.

typedef VOID (NTAPI* TRtlGetNtVersionNumbers)(LPDWORD pdwMajorVersion, LPDWORD pdwMinorVersion, LPDWORD pdwBuildNumber);

bool IsRunningCompatMode()
{
    TRtlGetNtVersionNumbers RtlGetNtVersionNumbers = (TRtlGetNtVersionNumbers)GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlGetNtVersionNumbers");

    assert(RtlGetNtVersionNumbers);

    if(RtlGetNtVersionNumbers)
    {
        OSVERSIONINFO osInfo = {0};
        osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        GetVersionEx(&osInfo);

        DWORD dwMajorVersion;
        DWORD dwMinorVersion;
        DWORD dwBuildNumber;

        RtlGetNtVersionNumbers(&dwMajorVersion, &dwMinorVersion, &dwBuildNumber);

        dwBuildNumber &= 0x0000FFFF;

        if(osInfo.dwBuildNumber != dwBuildNumber)
        {
            return true;
        }
    }
    return false;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...