我uing模块化Inno Setup的Inno Setup的努力创造了模块化InnoSetup依赖新安装DirectX模板产品安装
我修改现有的DirectX检测方法
http://www.vincenzo.net/isxkb/index.php?title=DirectX_-_How_to_detect_DirectX_version
我想创建一个新的产品安装DirectX 9
以下是I H到目前为止。
//========================================
//detectDirectX.iss
//=======================================
[CustomMessages]
directx_title=DirectX End-User Runtimes (June 2010)
en.directx_size=95.6 MB
de.directx_size=95.6 MB
[Code]
const
directx_url = 'http://download.microsoft.com/download/8/4/A/84A35BF1-DAFE-4AE8-82AF-AD2AE20B6B14/directx_Jun2010_redist.exe';
procedure DecodeVersion(verstr: String; var verint: array of Integer);
var
i,p: Integer; s: string;
begin
// initialize array
verint := [0,0,0,0];
i := 0;
while ((Length(verstr) > 0) and (i < 4)) do
begin
p := pos('.', verstr);
if p > 0 then
begin
if p = 1 then s:= '0' else s:= Copy(verstr, 1, p - 1);
verint[i] := StrToInt(s);
i := i + 1;
verstr := Copy(verstr, p+1, Length(verstr));
end
else
begin
verint[i] := StrToInt(verstr);
verstr := '';
end;
end;
end;
// This function compares version string
// return -1 if ver1 < ver2
// return 0 if ver1 = ver2
// return 1 if ver1 > ver2
function CompareVersion2(ver1, ver2: String) : Integer;
var
verint1, verint2: array of Integer;
i: integer;
begin
SetArrayLength(verint1, 4);
DecodeVersion(ver1, verint1);
SetArrayLength(verint2, 4);
DecodeVersion(ver2, verint2);
Result := 0; i := 0;
while ((Result = 0) and (i < 4)) do
begin
if verint1[i] > verint2[i] then
Result := 1
else
if verint1[i] < verint2[i] then
Result := -1
else
Result := 0;
i := i + 1;
end;
end;
// DirectX version is stored in registry as 4.majorversion.minorversion
// DirectX 8.0 is 4.8.0
// DirectX 8.1 is 4.8.1
// DirectX 9.0 is 4.9.0
function GetDirectXVersion(): String;
var
sVersion: String;
begin
sVersion := '';
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\DirectX', 'Version', sVersion);
Result := sVersion;
end;
procedure directX();
var ErrorCode: Integer;
begin
// in this case program needs at least directx 9.0
if CompareVersion2(GetDirectXVersion(), '4.9.0') < 0 then
begin
AddProduct('directx_Jun2010_redist.exe',
'/t:' + ExpandConstant('{tmp}\DirectX') + ' /q /c',
CustomMessage('directx_title'),
CustomMessage('directx_size'),
directx_url,
false, false);
//Is there any way to wait until directx_Jun2010_redist.exe has extracted it self before calling the next line?
ShellExec('open', ExpandConstant('{tmp}\DirectX\DXSETUP.exe'), '/silent', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode)
end;
end;
在根据[RUN]
主设置文件whatever.iss我包括在该文件中。
#include "scripts\products\custom\detectDirectX.iss"
在[CODE]
下的主安装文件whatever.iss我包括这个方法
directX();
我遇到的问题是,它的下载像它应该并把它放在Temp文件夹。
AddProduct('directx_Jun2010_redist.exe',
'/t:' + ExpandConstant('{tmp}\DirectX') + ' /q /c',
CustomMessage('directx_title'),
CustomMessage('directx_size'),
directx_url,
false, false);
,因为我使用额外的收杆
'/吨:' + ExpandConstant( '{TMP} \的DirectX')+ '/ Q/C'
一旦它的下载它创造一个名为DirectX的文件夹并将所有内容都提取出来。这需要一点。
似乎同时directx_Jun2010_redist.exe被提取..
ShellExec('open', ExpandConstant('{tmp}\DirectX\DXSETUP.exe'), '/silent', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode)
获取调用早期和文件{TMP} \的DirectX \ DXSETUP.exe还不存在..所以它不会被调用。
一旦提取完成后,用户点击完成对安装并删除临时文件夹。
有没有办法解决这个问题,使directx_Jun2010_redist.exe已提取后的文件,它可以安装完成之前运行DXSETUP.exe?
您想要何时下载并执行DirectX设置?在哪个阶段?考虑一下,用户可能没有连接到互联网...... – TLama 2013-03-10 00:43:50
1.这是一个依赖。 2.在directx_Jun2010_redist.exe完成提取所有必需的文件后。如果用户没有连接到互联网,那么安装程序会失败,因为它自己需要互联网的程序。 – 2013-03-10 01:11:49