2014-04-30 300 views
1

我希望能够从注册表中读取一个值,并在显示对话框之前使用它来设置WIXUI_INSTALLDIR,但是如果注册表中的值为空白,我想使用默认文件夹。将WIXUI_INSTALLDIR设置为注册表值或默认值(如果为空)?

我是wix新手。 我一直在阅读教程,文档和问题/答案,我的脑袋正在旋转。我觉得我很接近,但我没有把所有的东西放在一起。

代码编译和链接很好,但是当我运行msi时,我在显示浏览文件夹对话框之前收到错误,错误代码为2819“对话框[2]上的控件[3]需要链接到它的属性“。

总之,我想要做的是:
从注册表中读取以前的安装路径到名为“PREVIOUSINSTALLFOLDER”的属性中。
如果“PREVIOUSINSTALLFOLDER”为空,请将WIXUI_INSTALLDIR设置为“目录”部分中定义的“INSTALLFOLDER”。
如果“PREVIOUSSTALLFOLDER”不为空,请将WIXUI_INSTALLDIR设置为“PREVIOUSINSTALLFOLDER”。

我在做什么错?

感谢, 埃里克

这里是我当前的代码:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
<Product Id="EB907F6C-B193-4A40-BA3C-ADF8C069AF34" Name="LaserVault DMS" Language="1033" Version="10.0.0" Manufacturer="Electronic Storage Corp." UpgradeCode="43291cbc-3f74-44ba-ba14-31181bb654bf"> 
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Keywords="LaserVault DMS Server" Description="LaserVault DMS Server" /> 
    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 
    <MediaTemplate EmbedCab="yes" /> 
<UIRef Id="WixUI_InstallDir"/> 

<Property Id="PREVIOUSINSTALLFOLDER"> 
    <RegistrySearch Id="PreviousInstallDir" Root="HKLM" Key="Software\ESC" Name="LVDMSPath" Type="raw"></RegistrySearch> 
</Property> 

<CustomAction Id="SetToDefault" Property="WIXUI_INSTALLDIR" Value="[INSTALLFOLDER]" Execute="immediate" /> 
<CustomAction Id="SetToPrevious" Property="WIXUI_INSTALLDIR" Value="[PREVIOUSINSTALLFOLDER]" Execute="immediate" /> 

<InstallExecuteSequence> 
    <Custom Action="SetToDefault" After="AppSearch">PREVIOUSINSTALLDIR=""</Custom> 
    <Custom Action="SetToPrevious" After="AppSearch"><![CDATA[PREVIOUSINSTALLDIR <> ""]]></Custom> 
</InstallExecuteSequence> 

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="LaserVault" Name="LaserVault"> 
    <Directory Id="INSTALLFOLDER" Name="LVDMS" /> 
    </Directory> 
    <Directory Id="ProgramMenuFolder" Name="Programs"> 
    <Directory Id="ProgramMenuDir" Name="LaserVault DMS" /> 
    </Directory> 
    <Directory Id="DesktopFolder" Name="Desktop" /> 
</Directory> 

<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 
    <Component Id="LVDMSServerConfig" Guid="D9428A16-ECB1-4373-B876-8CF05E7CE37F"> 
    <File Id="LVDMSServerConfig" Source="C:\Projects\LVDMS10\LVDMSServerConfig\LVDMSServerConfig\bin\Debug\LVDMSServerConfig.exe" KeyPath="yes" /> 
    </Component> 
    <Component Id="LVDMSCore10" Guid="2E956300-78FC-4AFA-8D5D-A2D07B6CB8AE"> 
    <File Id="LVDMSCore10" Source="C:\Projects\LVDMS10\LVDMSServerConfig\LVDMSServerConfig\bin\Debug\LVDMSCore10.dll" KeyPath="yes" /> 
    </Component> 
    <Component Id="LVDMSInstallationGuide" Guid="ECA2B30A-54CB-4DE4-A659-B429458BDF3A"> 
    <File Id="LVDMSInstallationGuide" Source="\\192.168.0.211\development\HelpFiles\LaserVault_DMS_10\LaserVault_DMS_Installation_Guide\LaserVault_DMS_Installation_Guide.pdf" KeyPath="yes" /> 
    </Component> 
</ComponentGroup> 

<ComponentGroup Id="Shortcuts" Directory="ProgramMenuDir"> 
    <Component Id="LVDMSServerConfigShortCut"> 
    <Shortcut Id="LVDMSServerConfigShortCut" Name="LVDMS Server Config" Description="LaserVault DMS Server Configuration" Target="[#LVDMSServerConfig]" WorkingDirectory="INSTALLFOLDER" /> 
    <RemoveFolder Id="ProgramMenuDir" On="uninstall"/> 
    <RegistryValue Root="HKCU" Key="Software\LaserVault\LVDMS" Name="CurrentVersion" Type="string" Value="[ProductVersion]" KeyPath="yes" /> 
    </Component> 
</ComponentGroup> 

<ComponentGroup Id="RegistryEntries"> 
    <Component Id="RegistryLVDMSPath" Guid="9AE59D2B-EF16-4CAA-8A27-AA5BE00FAA07" Permanent="yes" Directory="TARGETDIR"> 
    <RegistryKey Root="HKLM" Key="Software\ESC"> 
     <RegistryValue Type="string" Name="LVDMSPath" Value="[INSTALLFOLDER]"/> 
    </RegistryKey> 
    </Component> 
</ComponentGroup> 

<Feature Id="Complete" Title="LaserVault DMS Server" Level="1"> 
     <ComponentGroupRef Id="ProductComponents" /> 
    <ComponentGroupRef Id="Shortcuts"/> 
    <ComponentGroupRef Id="RegistryEntries"/> 
    </Feature> 
</Product> 

+1

我会使用/ L * V [日志文件]执行您的微星,看看发生了什么事情,这将表明,当/如果您的自定义行动正在执行中。也许自定义操作需要在AppSearch之前的InstallUISequence中进行安排。 –

回答

0

,我认为你是在正确的道路上。我解决它通过以下方式使用以下步骤(基本相当,你想,就倒过来,即设置的默认值,并覆盖它只有当值在注册表中找到类似):

  • 设置WIXUI_INSTALLDIR为默认值通过目录结构的定义:

    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" /> 
    
  • 做一个RegistrySearch为以前的安装文件夹:

    <Property Id="PREVIOUSINSTALLFOLDER"> 
         <RegistrySearch Id="GetPreviousInstallFolder" Root="HKLM" Key="SOFTWARE\ESC" Name="LVDMSPath" Type="raw" /> 
        </Property> 
    
  • INSTALLDIR只有当这个值是发现:

    <CustomAction Id="SetINSTALLDIR" Property="INSTALLDIR" Value="[PREVIOUSINSTALLFOLDER]" Execute="firstSequence" /> 
        ... 
        <InstallExecuteSequence> 
           <Custom Action="SetINSTALLDIR" After="AppSearch">PREVIOUSINSTALLFOLDER</Custom> 
        </InstallExecuteSequence> 
        <InstallUISequence> 
           <Custom Action="SetINSTALLDIR" After="AppSearch">PREVIOUSINSTALLFOLDER</Custom> 
        </InstallUISequence> 
    
相关问题