程序是否以兼容模式运行

时间:2010-08-09 23:43:12

标签: c++

我是否可以调用C ++ .NET函数来检测我的程序是否在兼容模式下运行?如果没有,有人可以给我一个代码吗?感谢。

例如:

程序加载 兼容模式检查 如果是,则退出 否则运行

3 个答案:

答案 0 :(得分:8)

来自其他论坛

  

经过一些谷歌搜索进入后   徒劳,我决定自己试验一下。   我发现兼容性   每个可执行文件的设置是   存储 - 正如我想的那样 - 存在   Windows注册表。

     

存储设置的键   是
  HKEY_CURRENT_USER \ SOFTWARE \微软\的Windows   NT \ CURRENTVERSION \ AppCompatFlags \层

     

对于每个有它的应用程序   指定兼容性设置,   该密钥下存在一个值   谁的名字是通往   可执行文件和数据是一个字符串   由兼容性组成   设置。

     

字符串中的关键字   指定兼容性设置   是:WIN95 WIN98 NT4SP5
  WIN2000 256COLOR 640X480
  DISABLETHEMES DISABLECICERO

     

如果指定了多个设置(或   将被指定),数据   由上面的设置组成   每个空间隔开一个空格。首先   四个设置是互斥的,   即只有其中一个   指定(如果有的话)。我没有   测试了指定的后果   多个操作系统。

     

所以,回到解决你的问题。   检查是否有可执行文件(比方说,   “C:\ path \ executable.exe”)设置为   以256色模式运行,会有   名为“C:\ path \ executable.exe”的值   (没有引号,即使是路径   在键下包含空格   [HKEY_CURRENT_USER \软件\微软\的Windows   NT \ CURRENTVERSION \ AppCompatFlags \图层]   以及与该值相关的数据   将包含字符串“256COLOR”。   如果它也设置为运行   Windows下的兼容模式   98 / ME,数据将是“WIN98   256COLOR”。

     

所以,方法很简单。测试是否   有一个完整路径的值   密钥I下的可执行文件   上文提到的。如果没有,那么   可执行文件尚未指定任何   兼容性设置。如果值   存在,检索其数据并检查   因为“256COLOR”的存在   数据。因此,存在   “WIN95”或“WIN98”或“NT4SP5”或   “WIN2000”就意味着了   可执行文件设置为运行   该特定的兼容模式   操作系统。

答案 1 :(得分:3)

获取从GetVersionEx返回的操作系统版本,并将其与kernel32.dll上的文件版本进行比较。在应用程序兼容模式下,GetVersionEx将始终返回正在“模拟”的操作系统版本。如果两个版本不同,那么您处于应用程序兼容模式。

答案 2 :(得分:1)

上面的答案帮助我得到了一个“解决方案”来解决手头的问题。它可能不是最优雅的,但似乎有效。显然,您可以在返回类型上获得更多创意。 Booleon在这里还不够。我认为原生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;
};