喫茶XRAYトップページ


[9379] Windows10バージョンチェック返信 削除
2015/11/8 (日) 22:41:51 Mr.XRAY
某掲示板で質問で出ていたのでやってみました.
質問者と同じ Delphi 2007
EXE 作成は Windows 7 U64(SP1) + Delphi 2007-R2
コードは以下.アプリケーションマニュフェストを使わないと正しく
取得できません.

Windows のバージョンの値の関係は以下を参照してくださいませ
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724834%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

procedure TForm1.Button1Click(Sender: TObject);
begin
  if CheckWin32Version(10, 0) then begin
    MessageBox(Handle, 'Window 10', 'OS Version', MB_ICONINFORMATION);
  end else begin
    MessageBox(Handle, 'Other Version', 'OS Version', MB_ICONINFORMATION);
  end;
end;

インストールしてから初めて起動した Windows 10 ですが,
やたら動作がもたつきます.何なんだ !?


↓ 合成画像ではありません.一発キャプチャの画像でございやす.
   MessageBox の第一引数を Handle にしないと一発キャプチャできません.

[9380] Re:Windows10バージョンチェック返信 削除
2015/11/8 (日) 23:36:11 Mr.XRAY
> コードは以下.アプリケーションマニュフェストを使わないと正しく
> 取得できません.


WMI だとアプリケーションマニュフェストなしで取得できるようです.
Version のメジャー,マイナーの値は,デリミタを . にして文字列から取り出せます.


[9382] Re2:Windows10バージョンチェック返信 削除
2015/11/9 (月) 08:55:38 おかぽん
▼ Mr.XRAYさん

http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201510/15100008.txt

ここで、RtlGetVersion なんてのもありますよ〜とレスしたのですが、
Win7 SP1 でしか確認していませんが、WMI だと、exeを互換モードで実行しても、
常に正しくOSの情報が返るようですね。

GetVersionExは、マニフェスト無しでは偽装される(Windows8以降)。
RtlGetVersionは、GetVersionExと同じ引数で使用でき、マニフェストなしでも
動作しますが、互換モード実行時は互換モードのバージョンが返る。

実にややこしいです。




[9383] Re3:Windows10バージョンチェック返信 削除
2015/11/9 (月) 11:22:47 Mr.XRAY
▼ おかぽんさん

> GetVersionExは、マニフェスト無しでは偽装される(Windows8以降)。
> RtlGetVersionは、GetVersionExと同じ引数で使用でき、マニフェストなしでも
> 動作しますが、互換モード実行時は互換モードのバージョンが返る。
>
> 実にややこしいです。


むむむっ.越後屋,お主ややこしいのぅ.
Windows Vista 以降では,基本的にマニフェストを使用した方がいいようですね.
Windows 7 ではマニフェストがないと,Vista 互換での動作になりますし.


[9384] 互換モードのバージョンチェック返信 削除
2015/11/9 (月) 21:53:02 Mr.XRAY
▼ おかぽんさん

> GetVersionExは、マニフェスト無しでは偽装される(Windows8以降)。
> RtlGetVersionは、GetVersionExと同じ引数で使用でき、マニフェストなしでも
> 動作しますが、互換モード実行時は互換モードのバージョンが返る。
>
> 実にややこしいです。


折角情報を頂いたので記事にしました.
ただし,テストは他の方がやっているので,リンクだけとしています.
(ソースコードと結果があるので信頼できる情報と判断できます)

[互換モードでの Windows のバージョンと互換モードの取得]
http://mrxray.on.coocan.jp/Delphi/Others/WindowsVersion.htm#02

リンクを貼るだけだと,説明が数行で終わってしまうので,
例によって,余計なものを追加して「難解」にしていますです.


[9385] Re:互換モードのバージョンチェック返信 削除
2015/11/10 (火) 09:21:30 おかぽん
▼ Mr.XRAYさん
> 折角情報を頂いたので記事にしました.
素早い記事対応、お疲れさまです。

せっかくなので、記事の更新ネタをもう少し。

更新された記事のものは、ユーザー単位ですが、全てのユーザーの互換モードを
指定するレジストリもあります。
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

また、OSの互換性だけでなく、設定に関するものも、同レジストリに記載されます。
RUNASADMIN:管理者としてこのプログラムを実行する
640X480:640 x 480の解像度で実行する
など

設定値のリストがほしいとこですが、Windows7の設定までしか見つけられませんでした。
Running an Application as Administrator or in Compatibility Mode
http://www.verboon.info/2011/03/running-an-application-as-administrator-or-in-compatibility-mode/

> 例によって,余計なものを追加して「難解」にしていますです.
Microsoftの仕様の方が難解・・・

[9386] Windows のバージョンの取得返信 削除
2015/11/11 (水) 10:37:02 Mr.XRAY
▼ おかぽんさん

> せっかくなので、記事の更新ネタをもう少し。

ということで記事がどんどん増えちゃうんですね.
それに乗る私も私ですが (笑)
で,追加しました.ついでに,Windows のバージョン取得関係を全て
そのページに集中させました.

[Windows のバージョンの取得]
http://mrxray.on.coocan.jp/Delphi/Others/WindowsVersion.htm

> Microsoftの仕様の方が難解・・・

なんと嬉しい言葉でしょう (涙...)


[9381] アプリケーションマニュフェスト返信 削除
2015/11/9 (月) 08:44:10 Mr.XRAY
思い出しました.

> コードは以下.アプリケーションマニュフェストを使わないと正しく
> 取得できません.


アプリケーションマニュフェストの使い方,注意してくださいませ.
[ランタイムテーマ] を無効にする必要があります.
以前,アプリケーションマニュフェストを組み込んだのに,
管理者権限の昇格ダイアログが現れない !! という質問があったので.

[アプリケーションマニフェストの使用方法 - Delphi XE 以前]
http://mrxray.on.coocan.jp/Delphi/Others/WindowsVista.htm#13


> ↓ 合成画像ではありません.一発キャプチャの画像でございやす.
>    MessageBox の第一引数を Handle にしないと一発キャプチャできません.


失礼 !! これは,拙作の画面キャプチャのプログラムを使用した場合のことです.

えっ!! 画像の Window は s が抜けている ?
それはですね.みなさんの注意力を試すためなんです !!
誤字脱字ではありません !! (ウソつけ !!)


INCM/CMT
Cyclamen v3.82