Reputation: 7390
I use this function to get IE version. But in some cases it cannot find this key and returns 0. Is there another way that does not rely on registry ?
function GetIEVersion: string;
var
Reg: TRegistry;
S: string;
i : integer;
begin
Reg := TRegistry.Create;
with Reg do
begin
RootKey := HKEY_LOCAL_MACHINE;
OpenKey('Software\Microsoft\Internet Explorer', False);
if ValueExists('Version') then
begin
S := ReadString('Version');
end
else
begin
S := '0';
CloseKey;
end;
Free;
end;
result := s;
end;
Upvotes: 3
Views: 2570
Reputation: 11
function TFuncoesSO.GetIEVersion(AOnlyMajorVersion: Boolean = False): string;
var
lVersao: string;
lReg: TRegistry;
begin
Result := '';
lReg := TRegistry.Create;
try
lReg.RootKey := HKEY_LOCAL_MACHINE;
if lReg.OpenKeyReadOnly('Software\Microsoft\Internet Explorer') then
begin
lVersao := '';
if lReg.ValueExists('svcVersion') then
begin
lVersao := lReg.ReadString('svcVersion');
end
else if lReg.ValueExists('Version') then
begin
lVersao := lReg.ReadString('Version');
end
else if lReg.ValueExists('IVer') then
begin
lVersao := lReg.ReadString('IVer');
end;
if (lVersao <> '') then
begin
if (AOnlyMajorVersion) then
begin
if (WordCount(lVersao, ['.']) > 0) then
begin
lVersao := ExtractWord(1, lVersao, ['.']);
end;
end;
end;
Result := lVersao;
lReg.CloseKey;
end;
finally
lReg.Free;
end;
end;
Upvotes: 0
Reputation: 4078
You can use the method of getting a file version information. First we'd get iexplore.exe
path.
function GetIEPath: string;
var
Reg: TRegistry;
Len: Integer;
begin
Result := '';
Reg := TRegistry.Create;
with Reg do
begin
try
RootKey := HKEY_CLASSES_ROOT;
OpenKeyReadOnly('CLSID\{0002DF01-0000-0000-C000-000000000046}\LocalServer32');
try
Result := ReadString('');
finally
CloseKey;
Len := Length(Result);
if Len >= 2 then
begin
if(Result[Len] = '"') then
Delete(Result, Len, 1);
if(Result[1] = '"') then
Delete(Result, 1, 1);
end
else
begin
Result := '';
end;
end;
finally
Free;
end;
end;
end;
{0002DF01-0000-0000-C000-000000000046}
is the CLSID for Internet Explorer.
The default key value for LocalServer32
is iexplore.exe
path.
Then, we use some API calls, as demonstrated by Simon Grossenbacher, on this link, to get a file version info. Modifying his function, we get to this:
function GetIEVersion: string;
var
IEPath: string;
VerInfoSize: DWORD;
VerInfo: Pointer;
VerValueSize: DWORD;
VerValue: PVSFixedFileInfo;
Dummy: DWORD;
begin
Result := '0';
IEPath := GetIEPath;
if IEPath = '' then
Exit;
VerInfoSize := GetFileVersionInfoSize(PChar(IEPath), Dummy);
if VerInfoSize = 0 then
Exit;
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(IEPath), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
with VerValue^ do
begin
Result := IntToStr(dwFileVersionMS shr 16);
Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
Result := Result + '.' + IntToStr(dwFileVersionLS and $FFFF);
end;
FreeMem(VerInfo, VerInfoSize);
end;
Then, you just use, for example, this:
ShowMessage(GetIEVersion);
Upvotes: 5
Reputation: 596031
TRegistry.OpenKey()
uses the TRegistry.Access
property to know what permissions to request when opening the key. By default, TRegistry.Access
is set to KEY_ALL_ACCESS
, which is restricted to adminstrators only. Use TRegistry.OpenKeyReadOnly()
instead. Also, for good measure, you can get rid of the ValueExists()
check, as ReadString()
returns a blank string if the value does not exist.
Try this:
function GetIEVersion: string;
var
Reg: TRegistry;
begin
Result := '';
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKeyReadOnly('Software\Microsoft\Internet Explorer') then
try
Result := Reg.ReadString('Version');
finally
Reg.CloseKey;
end;
finally
Reg.Free;
end;
if Result = '' then
Result := '0';
end;
Upvotes: 7