2012-05-24 65 views
2

可能重复:
How to detect true Windows version如何检测我的应用程序是否在兼容模式下运行?

我有一个使用第三方库的应用程序(DLL - 没有源代码),它保护(加密)的一些客户数据,该DLL必须根据当前的Windows版本使用不同的参数进行初始化。如果我的应用程序在Windows 7下以XP兼容模式执行,则dll加密方法将失败。所以我需要一种方法来检测我的应用程序何时在兼容模式下运行以防止此问题。所以How I can detect if my application is running under compatibility mode?

+2

抽查不合格加密是否似乎是一个显而易见的解决方案。 –

+2

我认为这个问题是有价值的,并且有足够的差异来保持它的独立性。没有投票结束。 –

回答

6

您可以比较反对Win32_OperatingSystem WMI类的版本属性GetVersionEx函数的返回值。

试试这个样本

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    Windows, 
    SysUtils, 
    ActiveX, 
    ComObj, 
    Variants; 

function WMI_OSVersion:string; 
var 
    FSWbemLocator : OLEVariant; 
    FWMIService : OLEVariant; 
    FWbemObjectSet: OLEVariant; 
    rgvar   : OLEVariant; 
    LEnum   : IEnumVARIANT; 
    pceltFetched : LongWord; 
begin 
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); 
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT Version FROM Win32_OperatingSystem','WQL', $00000020); 
    LEnum   := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; 
    if LEnum.Next(1, rgvar, pceltFetched) = S_OK then 
    Result:=String(rgvar.Version); 
end; 

function WinApi_OsVersion:string; 
var 
    lpVersionInformation: TOSVersionInfo; 
begin 
    ZeroMemory(@lpVersionInformation, SizeOf(lpVersionInformation)); 
    lpVersionInformation.dwOSVersionInfoSize:=SizeOf(lpVersionInformation); 
    GetVersionEx(lpVersionInformation); 
    Result:=Format('%d.%d.%d',[lpVersionInformation.dwMajorVersion, lpVersionInformation.dwMinorVersion, lpVersionInformation.dwBuildNumber]); 
end; 

function RunningCompatibilityMode : Boolean; 
begin 
    Result:=WMI_OSVersion<>WinApi_OsVersion; 
end; 

begin 
try 
    CoInitialize(nil); 
    try 
     Writeln('Running in Compatibility Mode - '+ BoolToStr(RunningCompatibilityMode, True)); 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:EOleException do 
     Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln; 
end. 
+0

还有其他几种方法可以检测真正的操作系统版本,而不仅仅是WMI。 'RtlGetVersion()','NetServerGetInfo()','NetWkstGetInfo()'也可以。此外,在Windows 8.1及以上版本中,影响'GetVersionEx()'的兼容性模式不仅仅是影响'GetVersionEx()'的表现也会影响它,所以仅检查版本号并不表示使用兼容模式本身,尽管它确实提示某种虚拟化通常是有效的。 –

相关问题