> インストール済みの .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;
|