喫茶XRAYトップページ

[スレッド全体
]

[11569] Re:インストール済み.NET Framework返信 削除
2017/11/19 (日) 00:00:53 Mr.XRAY
> インストール済みの .NET Framework のバージョンは

ものはついでですので,Windows API を使用したコードです.
JEDI の Windows API のユニットを使用しています.

うまくいったと思ったら,検出できないバージョンがあります.
WMI を使用したのも,このサンプルも MSI でインストールしたアプリです.
そのあたりが誓うのかも...
WMI とこのサンプルの動作確認は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.


implementation

uses
  JwaMsi,
  StrUtils;

{$R *.dfm}

//-----------------------------------------------------------------------------
//  MSIでインストールしたアプリのプロパティの取得
//  AProduct  : インストールしたアプリのプロダクト名(GUID)
//  AProperty : 取得したいプロパティの識別子
//              識別子の名前はMSDNのMsiGetProductInfo関数の説明を参照
//-----------------------------------------------------------------------------
function GetMsiPropertyValueStr(AProduct: PChar; AProperty: PChar): string;
var
  LValue : PChar;
  LLen   : DWORD;
begin
  //取得に必要なバッファサイズを取得(第3引数をnilにする)
  LLen := 0;
  MsiGetProductInfo(AProduct, AProperty, nil, @LLen);

  //取得したバッファサイズにnul終端文字分が含まれないとのことなで追加
  LLen   := LLen + 1;
  LValue := StrAlloc(LLen);
  try
    MsiGetProductInfo(AProduct, AProperty, LValue, @LLen);
    Result := LValue;
  finally
    StrDispose(LValue);
  end;
end;

//=============================================================================
//  MSIでインストールしたアプリをリスト
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LIndex   : Integer;
  LProduct : PChar;
  LText    : string;
begin
  Memo1.Lines.Clear;
  Memo1.Lines.BeginUpdate;
 
  LIndex := 0;
  LProduct := StrAlloc(MAX_PATH);
  try
    while MsiEnumProducts(LIndex, LProduct) = ERROR_SUCCESS do begin
      LText := GetMsiPropertyValueStr(LProduct, INSTALLPROPERTY_PRODUCTNAME);

      if StrUtils.ContainsText(LText, 'NET Framework') then begin
        Memo1.Lines.Add(string(LProduct));
        Memo1.Lines.Add(IntToStr(LIndex) + '    '+ LText);

        LText := GetMsiPropertyValueStr(LProduct, INSTALLPROPERTY_VERSIONSTRING);
        Memo1.Lines.Add(IntToStr(LIndex) + '    '+ LText);
        Memo1.Lines.Add('');
      end;

      inc(LIndex);
    end;
  finally
    StrDispose(LProduct);
  end;

  Memo1.Lines.EndUpdate;
end;



[11570] Re2:インストール済み.NET Framework返信 削除
2017/11/19 (日) 13:48:01 Nov
▼ Mr.XRAYさん
> うまくいったと思ったら,検出できないバージョンがあります.

OSプレインストールバージョンは列挙できない気がします。
だとしたら、OSバージョンさえ押さえておけば、この方法で充分ですね。

[11578] Re3:インストール済み.NET Framework返信 削除
2017/11/20 (月) 21:42:34 Mr.XRAY
▼ Novさん

> OSプレインストールバージョンは列挙できない気がします。
> だとしたら、OSバージョンさえ押さえておけば、この方法で充分ですね。


結局 Nov さんが掲載したように,レジストリから情報を取得しないと
ダメなようですね.
ということで記事を追加しておきました.

[ インストールされている .NET Framework のバージョン]
http://mrxray.on.coocan.jp/Delphi/Others/dotNETFrameworkDelphi.htm#03


[11579] Re4:インストール済み.NET Framework返信 削除
2017/11/21 (火) 18:33:20 Mr.XRAY
> [ インストールされている .NET Framework のバージョン]
> http://mrxray.on.coocan.jp/Delphi/Others/dotNETFrameworkDelphi.htm#03


あまり気が乗らなかったのですが,気になるので Delphi のコード追加しました.


[11581] Re5:インストール済み.NET Framework返信 削除
2017/11/22 (水) 19:56:11 Mr.XRAY
> > [ インストールされている .NET Framework のバージョン]
> > http://mrxray.on.coocan.jp/Delphi/Others/dotNETFrameworkDelphi.htm#03


(1) v1.1 の検出コードを追加
(2) v4.x の SP が取得できないコードだったので修正
(3) バージョン順に表示するよにした
(4) v4.x の依存関係を表示するようにした


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82