有日子没有都有动Delphi了,安装了Delphi2007 For Win32 做了一个安装程序的东东。主要部分就是检测系统环境的变量。
1. 操作系统的检测
2. WindowsInstaller版本的检测 (要求最低配置3.1)
3. .Net FrameWork 版本的检测 (最低配置2.0)
4. Office ACE Oledb驱动程序的检测。
代码共享如下:
1.操作系统检测。
function GetOSVersion: string;
var
OSVer : TOSVersionInfo;
begin
Result := '无法检测系统版本';
OSVer.dwOSVersionInfoSize := SizeOf(OSVer);
GetVersionEx(OSVer);
case OSVer.dwMajorVersion of
6: Result := 'Windows Vista';
5: begin
case OSVer.dwMinorVersion of
0 : Result := 'Windows2000';
1 : Result := 'WindowsXP';
2 : Result := 'Windows2003';
end;
end;
4: begin
if OSVer.dwPlatformId=VER_PLATFORM_WIN32_NT then
begin
Result := 'Window NT';
end
else
begin
case OSVer.dwMinorVersion of
0 : Result := 'Windows95';
10: Result := 'Windows98';
90: Result := 'WindowsMe';
end;
end;
end;
end;
end;
2. WindowsInstaller版本的检测
偷个懒,方法就是检测 System32 下的 msiexec.exe的版本号,是3.1就ok了。
附赠: 获取文件版本的方法。
function GetVersion(sFile: string;
bIncludeBuild: boolean): string;
var
dwfvw, dwZero, dwvsf: DWORD;
Major, Minor, Release, Build: DWORD;
pfvw: PChar;
pvsf: PVSFixedFileInfo;
s: string;
begin
Result:='';
dwfvw:=GetFileVersionInfoSize(PChar(sFile), dwZero);
if dwfvw<>0 then
begin
GetMem(pfvw, dwfvw);
try
if(GetFileVersionInfo(PChar(sFile), dwZero, dwfvw, pfvw))then
begin
if(VerQueryValue(pfvw, '\', Pointer(pvsf), dwvsf))then
begin
if((pvsf^.dwFileFlags and VS_FF_PRERELEASE)>0)then
begin
s:='beta';
end
else begin
s:='';
end;
Major:=HIWORD(pvsf^.dwFileVersionMS);
Minor:=LOWORD(pvsf^.dwFileVersionMS);
Release:=HIWORD(pvsf^.dwFileVersionLS);
Build:=LOWORD(pvsf^.dwFileVersionLS);
Result:=Format('%d.%d.%d.%d', [Major, Minor, Release, Build]);
if bIncludeBuild then
begin
if Release>0 then
begin
Result:=Format('%d.%d.%d.%d', [Major, Minor, Release, Build])
end
else begin
Result:=Format('%d.%d.%d', [Major, Minor, Build])
end;
end
else begin
if Release>0 then begin
Result:=Format('%d.%d.%d', [Major, Minor, Release])
end
else begin
Result:=Format('%d.%d', [Major, Minor])
end;
end;
end;
end;
finally
FreeMem(pfvw);
end;
end;
end;
3. .Net Framework 版本的检测。
这个是根据注册表信息判断的,有待验证。
function CheckNetFramework: string;
var
Reg : TRegistry;
ValueList : TStringList;
begin
Reg := TRegistry.Create ;
ValueList := TStringList.Create ;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if not Reg.KeyExists('SOFTWARE\Microsoft\.NETFramework') then
Result := '需要安装.Net FrameWork'
else
begin
if Reg.OpenKey('SOFTWARE\Microsoft\NET Framework Setup\NDP',true) then
begin
Reg.GetKeyNames(ValueList);
if ValueList.IndexOf('v2.0.50727')<0 then
Result := '最低配置版本:2.0.50727,当前版本:'+ StringReplace( ValueList.Strings[ValueList.Count-1],'v','',[rfReplaceAll,rfIgnoreCase])
else
Result := '当前版本:'+ StringReplace( ValueList.Strings[ValueList.Count-1],'v','',[rfReplaceAll,rfIgnoreCase]);
end;
end;
ValueList.Free ;
Reg.Free;
end;
4. Office ACE OLe DB 驱动判断
同样是注册表。
function CheckACE: Boolean;
var
Reg : TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey :=HKEY_CLASSES_ROOT;
if Reg.KeyExists('Microsoft.ACE.OLEDB.12.0') then
Result := true
else
Result := false;
isPass := Result;
Reg.Free;
end;
其他的如判断IIS是否安装,MDAC的版本等等,以后再说吧!
1. 操作系统的检测
2. WindowsInstaller版本的检测 (要求最低配置3.1)
3. .Net FrameWork 版本的检测 (最低配置2.0)
4. Office ACE Oledb驱动程序的检测。
代码共享如下:
1.操作系统检测。
function GetOSVersion: string;
var
OSVer : TOSVersionInfo;
begin
Result := '无法检测系统版本';
OSVer.dwOSVersionInfoSize := SizeOf(OSVer);
GetVersionEx(OSVer);
case OSVer.dwMajorVersion of
6: Result := 'Windows Vista';
5: begin
case OSVer.dwMinorVersion of
0 : Result := 'Windows2000';
1 : Result := 'WindowsXP';
2 : Result := 'Windows2003';
end;
end;
4: begin
if OSVer.dwPlatformId=VER_PLATFORM_WIN32_NT then
begin
Result := 'Window NT';
end
else
begin
case OSVer.dwMinorVersion of
0 : Result := 'Windows95';
10: Result := 'Windows98';
90: Result := 'WindowsMe';
end;
end;
end;
end;
end;
2. WindowsInstaller版本的检测
偷个懒,方法就是检测 System32 下的 msiexec.exe的版本号,是3.1就ok了。
附赠: 获取文件版本的方法。
function GetVersion(sFile: string;
bIncludeBuild: boolean): string;
var
dwfvw, dwZero, dwvsf: DWORD;
Major, Minor, Release, Build: DWORD;
pfvw: PChar;
pvsf: PVSFixedFileInfo;
s: string;
begin
Result:='';
dwfvw:=GetFileVersionInfoSize(PChar(sFile), dwZero);
if dwfvw<>0 then
begin
GetMem(pfvw, dwfvw);
try
if(GetFileVersionInfo(PChar(sFile), dwZero, dwfvw, pfvw))then
begin
if(VerQueryValue(pfvw, '\', Pointer(pvsf), dwvsf))then
begin
if((pvsf^.dwFileFlags and VS_FF_PRERELEASE)>0)then
begin
s:='beta';
end
else begin
s:='';
end;
Major:=HIWORD(pvsf^.dwFileVersionMS);
Minor:=LOWORD(pvsf^.dwFileVersionMS);
Release:=HIWORD(pvsf^.dwFileVersionLS);
Build:=LOWORD(pvsf^.dwFileVersionLS);
Result:=Format('%d.%d.%d.%d', [Major, Minor, Release, Build]);
if bIncludeBuild then
begin
if Release>0 then
begin
Result:=Format('%d.%d.%d.%d', [Major, Minor, Release, Build])
end
else begin
Result:=Format('%d.%d.%d', [Major, Minor, Build])
end;
end
else begin
if Release>0 then begin
Result:=Format('%d.%d.%d', [Major, Minor, Release])
end
else begin
Result:=Format('%d.%d', [Major, Minor])
end;
end;
end;
end;
finally
FreeMem(pfvw);
end;
end;
end;
3. .Net Framework 版本的检测。
这个是根据注册表信息判断的,有待验证。
function CheckNetFramework: string;
var
Reg : TRegistry;
ValueList : TStringList;
begin
Reg := TRegistry.Create ;
ValueList := TStringList.Create ;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if not Reg.KeyExists('SOFTWARE\Microsoft\.NETFramework') then
Result := '需要安装.Net FrameWork'
else
begin
if Reg.OpenKey('SOFTWARE\Microsoft\NET Framework Setup\NDP',true) then
begin
Reg.GetKeyNames(ValueList);
if ValueList.IndexOf('v2.0.50727')<0 then
Result := '最低配置版本:2.0.50727,当前版本:'+ StringReplace( ValueList.Strings[ValueList.Count-1],'v','',[rfReplaceAll,rfIgnoreCase])
else
Result := '当前版本:'+ StringReplace( ValueList.Strings[ValueList.Count-1],'v','',[rfReplaceAll,rfIgnoreCase]);
end;
end;
ValueList.Free ;
Reg.Free;
end;
4. Office ACE OLe DB 驱动判断
同样是注册表。
function CheckACE: Boolean;
var
Reg : TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey :=HKEY_CLASSES_ROOT;
if Reg.KeyExists('Microsoft.ACE.OLEDB.12.0') then
Result := true
else
Result := false;
isPass := Result;
Reg.Free;
end;
其他的如判断IIS是否安装,MDAC的版本等等,以后再说吧!
