2013-03-10 33 views
1

我uing模块化Inno Setup的Inno Setup的努力创造了模块化InnoSetup依赖新安装DirectX模板产品安装

http://www.codeproject.com/Articles/20868/NET-Framework-1-1-2-0-3-5-Installer-for-InnoSetup#xx3672600xx

我修改现有的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?

+0

您想要何时下载并执行DirectX设置?在哪个阶段?考虑一下,用户可能没有连接到互联网...... – TLama 2013-03-10 00:43:50

+0

1.这是一个依赖。 2.在directx_Jun2010_redist.exe完成提取所有必需的文件后。如果用户没有连接到互联网,那么安装程序会失败,因为它自己需要互联网的程序。 – 2013-03-10 01:11:49

回答

2

好吧,我想我终于它得到正常工作。我不得不搬到了一下周围的东西..似乎有些东西被调用在启动时,但实际上不火他们直到QUED后面。考虑到这一点,我能够解决这个问题。这是代码。

在你的主setupfile.iss添加以下下[RUN]

Filename: "{tmp}\DirectX\DXSETUP.exe"; WorkingDir: "{tmp}\DirectX"; Parameters: "/silent"; Check: checkDirectX; Flags: waituntilterminated; 


#include "scripts\products\custom\detectDirectX.iss" 

而且在主setupfile。ISS添加在以下[代码]

directX(); 

这里是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 CompareDirectXVersion(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; 


function checkDirectX(): boolean; 
begin 
    // in this case program needs at least directx 9.0 
    if CompareDirectXVersion(GetDirectXVersion(), '4.9.0') < 0 then 
    begin 
     Result := true; 
    end 
    else 
    begin 
    Result := false; 
    end; 

end; 



procedure directX(); 
begin 
    // in this case program needs at least directx 9.0 
    if CompareDirectXVersion(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); 

    end; 
end; 

我希望这可以帮助别人的代码..整个观念是,我可以出货我的软件并且不用担心DirectX,至少我的软件需要DirectX 9一些XP用户可能没有更新他们的机器。或者有些人可能已经在vista或7上删除了它,Windows 8开箱即用较新的版本,所以不用担心那里。

+0

我在找这样的东西。过了一段时间,你有没有很好的经验? (想知道从长期来看,安装程序依赖于来自MS的URL是一个好主意) – Joan 2016-02-18 10:44:07