2012-05-24 64 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()'的表現也會影響它,所以僅檢查版本號並不表示使用兼容模式本身,儘管它確實提示某種虛擬化通常是有效的。 –

相關問題