2012-05-24 2 views
2

가능한 중복 :
How to detect true Windows version응용 프로그램이 호환 모드에서 실행 중인지 어떻게 확인할 수 있습니까?

I가 타사 라이브러리를 사용하는 응용 프로그램 (DLL - 아니 소스 코드)하는 (암호화) 일부 고객 데이터 보호,이 DLL을해야합니다 현재 Windows 버전에 따라 다른 매개 변수를 사용하여 초기화해야합니다. Windows 7에서 내 응용 프로그램을 XP 호환 모드로 실행하면 dll 암호화 방법이 실패합니다. 그래서 내 응용 프로그램이 호환성 모드에서이 문제를 방지하기 위해 실행 중일 때 감지하는 방법이 필요합니다. 따라서 How I can detect if my application is running under compatibility mode?

+2

을보십시오. –

+2

저는이 질문이 가치 있고 다른 것으로 충분하다고 생각합니다. 닫으 려하지 않습니다. –

답변

6

GetVersionEx 함수에 의해 반환 된 값과 Win32_OperatingSystem WMI 클래스의 Version 속성을 비교할 수 있습니다.

실패 암호화가 확실한 해결책처럼 보인다 여부 확인이 샘플을

{$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뿐만 아니라 실제 OS 버전을 감지하는 몇 가지 다른 방법이 있습니다. 'RtlGetVersion()','NetServerGetInfo()','NetWkstGetInfo()'도 작동합니다. 또한, Windows 8.1+에서 'GetVersionEx()'에 영향을주는 것은 호환성 모드뿐만 아니라 매니페스트에도 영향을 미치므로 버전 번호를 확인하는 것만으로 호환성 모드의 사용을 나타내지는 않습니다. 일반적으로 효과가 있습니다. –

관련 문제