HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1119
ideas正確なwinverの取得5解決


ideas

リンク

2020/11/19(Thu) 20:43:27|NO.91821

hspのスクリプトで、windowsNT..というのをwindows10...という風にできませんか?



この記事に返信する


沢渡

リンク

2020/11/20(Fri) 12:18:48|NO.91825

HSPのsysinfo(0)は内部でGetVersionというAPIを使っているようですが、
このAPIは互換性の都合上、Windows8以降は同じ値しか返さないようです。
Windows2000以降のみですが、RtlGetVersionだと正確な値を返すようなので、
それでやってみました。

/* Windows2000以降のみ対応 ・getver p1 p1には9要素以上ある整数の配列変数を指定する。 p1の(0)〜(8)に、それぞれ以下の情報が入る。 0:メジャーバージョン(dwMajorVersion) 1:マイナーバージョン(dwMinorVersion) 2:ビルドナンバー(dwBuildNumber) 3:プラットフォームID(dwPlatformId) 4:サービスパックのメジャーバージョン(wServicePackMajor) 5:サービスパックのマイナーバージョン(wServicePackMinor) 6:製品スイートを表すビットマスク(wSuiteMask) 7:システムに関する追加情報(wProductType) 8:将来のための予約情報。現時点では常に0(wReserved) またrefstrにサービスパック名が入る。(サービスパックがインストールされていない場合は空文字になる) ・winver_text p1 p1にはgetverで取得した配列を指定する。 配列の内容に基づいて、Windowsのバージョンを表す文字列を返す。 (ネットで得た情報を参考にした仮実装です。  当方はWindows10環境しかなく、他バージョンについては互換モードで選べるものしか試していません。  特にサーバー系の動作確認は全くできておりません) */ #module #uselib "Ntdll.dll" #func RtlGetVersion "RtlGetVersion" int #deffunc getver array r dim osver,71 osver(0)=284 RtlGetVersion varptr(osver) memcpy r,osver,16,0,4 r(4)=osver(69)&0xFFFF r(5)=(osver(69)>>16)&0xFFFF r(6)=osver(70)&0xFFFF r(7)=(osver(70)>>16)&0xFF r(8)=(osver(70)>>24)&0xFF sdim utf16,256 memcpy utf16,osver,256,0,20 s=cnvwtos(utf16) dim osver : dim utf16 return s #defcfunc winver_text array a s="Unknown" x=a(0)*10+a(1) if a(7)>=2 { //サーバー系と思われる s="Windows Server " if x=100 : s+="2016 or later" if x=63 : s+="2012 R2" if x=62 : s+="2012" if x=61 : s+="2008 R2" if x=60 : s+="2008" if x=52 : s+="2003" } else { if x=100 : s="Windows 10" if x=63 : s="Windows 8.1" if x=62 : s="Windows 8" if x=61 : s="Windows 7" if x=60 : s="Windows Vista" if x=52 : s="Windows XP 64-Bit" if x=51 : s="Windows XP" if x=50 : s="Windows 2000" } return s #global //以下、使用例 dim ver,9 getver ver s=refstr repeat 9 if cnt=6 { mes strf("0x%04X",ver(cnt)) } else { mes ver(cnt) } loop mes mes winver_text(ver) mes s
バージョンとOS名の対応については、以下のページが参考になると思います。
https://docs.microsoft.com/ja-jp/windows/win32/sysinfo/operating-system-version?redirectedfrom=MSDN
http://chokuto.ifdef.jp/advanced/struct/OSVERSIONINFOEX.html
http://yamatyuu.net/computer/program/sdk/base/RtlGetVersion/index.html



あらや

リンク

2020/11/20(Fri) 23:25:42|NO.91826

winverコマンドで表示されるOS名やビルド番号などと同じ情報を取得するなら
レジストリのキーを取得するという方法もあります。



ideas

リンク

2020/11/23(Mon) 15:42:01|NO.91840

あらやさんに質問で、レジストリの値の読み込み方、どのレジストリを読み込むのか
教えてください。



あらや

リンク

2020/11/23(Mon) 16:02:58|NO.91841

レジストリの場所は『winver レジストリ』などで検索したら
すぐに見つかると思います。

#include "hspext.as" regkey 1, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0; ; バージョン情報等が書かれている場所 ProductName = ""; getreg ProductName, "ProductName", 1; // プロダクト名 ReleaseId = ""; getreg ReleaseId, "ReleaseId", 1; // バージョン CurrentBuildNumber = ""; getreg CurrentBuildNumber, "CurrentBuildNumber", 1; // OSビルド1 getreg UBR, "UBR", 2; // OSビルド2 mes "OS:"+ProductName+""; // 64ビットPCで32ビットプログラムを実行すると"Windows 10 Enterprise"になるかも mes "バージョン "+ReleaseId+"(OSビルド "+CurrentBuildNumber+","+UBR+")";



ideas

リンク

2020/11/24(Tue) 16:04:07|NO.91847

やってみたところ、2つとも正しい値が返されてできました。
ありがとうございました。



ONION software Copyright 1997-2021(c) All rights reserved.