デルファイWIN8、WIN8.1、WIN10システムのバージョンを分析

今日はWIN10システムGetVersionEx機能の下で、WIN8、WIN8.1をテストし、実際にはバージョン6.2から取り出します。メモに記録されているので、カーネルのバージョン番号を取得する方法を見つけるためにインターネットは、最終的には、いくつかの有用な方法を見つけました。
方法1:https://msdn.microsoft.com/en-us/library/ms724451.aspx:GetVersionExは、この方法はWIN8.1後に参照しなかった
手順TForm1.Button1Click(送信者:TObjectを);
VARの
STR:文字列;
SS :TStringStream;
BUF:バイトの配列[0..6];
OSVI:OSVERSIONINFO;
バージョン:文字列;
始める
OSVI.dwOSversioninfoSize:=はsizeof(OSVERSIONINFO);
GetVersionEx(OSVI);
Edit4.Text:IntToStr(OSVI.dwMajorVersionを)= + ''
+ IntToStr(OSVI.dwMinorVersion)+ ''
+ IntToStr(OSVI.dwBuildNumber)+ ''
+ IntToStr(OSVI.dwPlatformId)+ '' + OSVI.szCSDVersion;
END;

方法2:のWin32_OperatingSystem、この方法は、通常のシステムテーブルFWMIServiceクエリシステムのバージョンWIN8(6.2)によって読み取ることができる、WIN81(6.3)、WIN10(10)

関数GetWMIProperty(WMIType、WMIProperty:文字列):文字列。
constの
WbemUser = '';
WbemPassword = '';
WbemComputer = 'localhost'の;
VaRの
FSWbemLocator、FWMIService、FWbemObjectSet、OBJの:OleVariant;
C:枢機卿。
私は、レン:整数;
tempItem:IEnumVariant。
カウント:整数;
MSG:文字列。
開始
トライ
結果を:=「」;
FSWbemLocator:= CreateOleObject( 'WbemScripting.SWbemLocator')。
FWMIService:= FSWbemLocator.ConnectServer(WbemComputer、 'ルートの\ CIMV2'、WbemUser、WbemPassword)。
FWbemObjectSet:= FWMIService.ExecQuery(+ WMIType 'Win32_から選択*');
tempItem:= IEnumVariant(IUnknownの(FWbemObjectSet._NewEnum))。
結果:= '';
カウント:= 0;
(tempItem.Next(1、OBJ、C)= S_OK)んが
始まる
= Obj.Properties_.Item(WMIProperty、0).Valueの;のObj
そうでない場合はVarIsNull(OBJ)を
開始し
た場合(> 0をカウント)、次に
つながる:=結果+ '';
結果:=は+トリム(OBJの)結果。
株式会社(カウント)。
終わり;
終わり;
除く
Eの場合:例外はない
始まる
=フォーマット:MSG( 'GetWMIPropertyエラー、WMIType:%sの、WMIProperty:%sの、メッセージ:%s'は、
[WMIType、WMIProperty、E.ToStringを]);
ShowMessage(MSG)。
終わり;
終わり;
IF(小文字(結果)= 'なし')は、次に
結果:= '';
エンド;
调用:GetWMIProperty( 'OperatingSystemの'、 '

方法3:ntdll.dllのは、NetServerGetInfo機能はカーネルのバージョンを取得します

プログラムProject5;

{$ APPTYPE CONSOLE}


使用
sysutilsの、Windowsが。


入力
NET_API_STATUS = DWORDと、


_SERVER_INFO_101 =レコード
sv101_platform_id:DWORD;
sv101_name:LPWSTR。
sv101_version_major:DWORD;
sv101_version_minor:DWORD;
sv101_type:DWORD;
sv101_comment:LPWSTR。
終わり;
SERVER_INFO_101 = _SERVER_INFO_101。
PSERVER_INFO_101 = ^ SERVER_INFO_101。
LPSERVER_INFO_101 = PSERVER_INFO_101。


constの
MAJOR_VERSION_MASKは$ 0F =。


関数NetServerGetInfo(サーバー名:LPWSTR;レベル:DWORD; VARのBUFPTR):NET_API_STATUS。STDCALL; 外部'NETAPI32.DLL';
関数のNetApiBufferFree(緩衝液:ポインタ):NET_API_STATUS。STDCALL; 外部'NETAPI32.DLL';

入力
pfnRtlGetVersion =関数(VARのRTL_OSVERSIONINFOEXW):倍長整数。STDCALL;
VAR
バッファ:PSERVER_INFO_101。
版:RTL_OSVERSIONINFOEXW。
RtlGetVersion:pfnRtlGetVersion。
開始
バッファー:= nilを;
// Win32MajorVersionとWin32MinorVersionは、GetVersionEx()...から移入された
のwriteln(形式( 'GetVersionEx:%D%のD'、[Win32MajorVersion、Win32MinorVersion]))。GetVersionEx()のドキュメントあたりの予想通り//は、6.2を示し


@RtlGetVersion:=のGetProcAddress(のGetModuleHandle( 'NTDLL.DLL')、 'RtlGetVersion')。
(RtlGetVersion)が割り当てられている場合、次いで
開始
ZeroMemory(@ver、にSizeOf(版))。
ver.dwOSVersionInfoSize:=にSizeOf(版)。


RtlGetVersionは(版)0 =次いで場合
のwriteln(形式( 'RtlGetVersion:%D%のD'、[ver.dwMajorVersion、ver.dwMinorVersionを]))。//は10.0を示し
終わりを。


次いでNetServerGetInfo(NIL、101、緩衝液)= NO_ERRORがあれば
試みる
のwriteln(形式( 'NetServerGetInfoた:%d%のD'、[Buffer.sv101_version_majorとMAJOR_VERSION_MASK、Buffer.sv101_version_minor]))。// 10.0を示し
、最終的
のNetApiBufferFree(バッファ);
終わり;
ReadLn;
終わり。

おすすめ

転載: www.cnblogs.com/blogpro/p/11453907.html