2016-08-23 88 views
1

我最近完成了我的第一个Wix Intaller,但是我有一个问题,我的MSI文件只适用于我的电脑,我正在生成嵌入式CAB文件。我正在注册安装程序中的DLL。我收到错误信息:“这个Windows安装程序包存在问题,作为安装程序运行的程序未按预期完成。”这就是为什么我相信DLL是问题的一部分。我在下面有一些代码片段,如果您需要查看更多,请告诉我,谢谢!Wix MSI只适用于一台计算机

自定义操作DLL安装:

<Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111" 
      Name="FP7000 Camera App" Version="1.0" Manufacturer="Stryker Corp" Language="1033"> 
    <Package InstallerVersion="200" Compressed="yes" Comments="Windows Installer Package"/> 
    <Media Id="1" Cabinet="product.cab" EmbedCab="no"/> 

<!--Installing/Uninstalling Supporting Programs and DLLs--> 
<CustomAction Id="RegisterFP7000" 
       Directory="dirCF50D58BC65CC93005501980AACC3EDD" 
       ExeCommand='C:\Windows\system32\regsvr32.exe /s "C:\Projects\Stryker\Install Files\DLLs\FP7000-Camera.dll"'> 
</CustomAction> 

<CustomAction Id="UnregisterFP7000" 
       Directory="dirCF50D58BC65CC93005501980AACC3EDD" 
       ExeCommand='C:\Windows\system32\regsvr32.exe /s /u "C:\Projects\Stryker\Install Files\DLLs\FP7000-Camera.dll"'> 
</CustomAction> 

<CustomAction Id="InstallSDK" 
      Directory="dirCF50D58BC65CC93005501980AACC3EDD" 
      ExeCommand='C:\Windows\system32\msiexec /i "C:\Projects\Stryker\Install Files\Included Apps\Intel_Media_SDK_2016_R2.msi" /quiet' 
      Execute='deferred' 
      Impersonate='no' 
      Return='asyncNoWait'> 
</CustomAction> 

<CustomAction Id="UninstallSDK" 
       Directory="dirCF50D58BC65CC93005501980AACC3EDD" 
       ExeCommand='MsiExec.exe /X{C39967EA-A3DB-4B49-9BCA-74E4D0007533}' 
       Execute='deferred' 
       Impersonate='no' 
       Return='asyncNoWait'> 
</CustomAction> 

安装顺序:

<InstallExecuteSequence> 
     <Custom Action="RegisterFP7000" After="InstallFinalize">NOT Installed</Custom> 
     <Custom Action="UnregisterFP7000" Before="InstallFinalize">REMOVE="ALL"</Custom> 
     <Custom Action="InstallSDK" After="InstallFiles">NOT Installed</Custom> 
     <Custom Action="UninstallSDK" Before="InstallFinalize">REMOVE="ALL"</Custom> 
</InstallExecuteSequence> 
+0

一般而言,您可以通过查找引用错误的详细MSI日志中的部分来提出有关Windows Installer错误的更好的问题。然后你就会知道什么是失败的,并且可能会提出更多尖锐的问题。 –

+0

生病请记住! –

回答

4

这种注册失败通常是因为DLL将不会加载,因为它缺少的依赖关系(假设其他一切都是正确的)。其他问题可能包括运行regsvr32的错误位(例如64位版本)并尝试注册32位Dll。

无论如何,没有必要这样做。实施此操作的最佳做​​法和推荐方法是使用Heat.exe将注册数据收集到wxs文件中,以便安装时只需创建正确的注册表项。

How do you register a Win32 COM DLL file in WiX 3?

1

首先,创建一个详细的日志文件您的设置,所以你可以找到MSIEXEC记录的错误消息:

msiexec.exe /i c:\setup.msi /QN /L*V "C:\Temp\msilog.log" 

快速的解释:

/L*V "C:\Temp\msilog.log"= verbose logging 
/QN = run completely silently 
/i = run install sequence 

打开日志文件并搜索“值3”作为ex plained这里:http://robmensching.com/blog/posts/2010/8/2/the-first-thing-i-do-with-an-msi-log/

来源链接:


编辑:纵观你的代码,我再次非常肯定的问题是:

  1. 您可以通过自定义操作安装嵌入式运行时设置。这不应该通过自定义操作运行,而是作为先决条件在您自己的MSI文件之前运行。
  2. 指定硬编码路径到dll而不是将dll安装到主安装目录并在那里注册它。这意味着该设置只能在您的系统上运行,因为这是该特定位置中唯一具有dll的机器。

我留下,我写第一以前,不再回答:


只是除了菲尔的回答是:安装英特尔SDK设置为自定义操作是不可取的。 MSI禁止运行两个并发的InstallExecuteSequence会话,这很可能是您看到的错误的原因。

尝试删除当前用于安装MSI的自定义操作,而是首先作为两个MSI文件的链接安装的一部分运行SDK安装程序,以查看这是否可以解决问题。

COM文件不得使用自行注册的原因是多方面的注册方式:How do you register a Win32 COM DLL file in WiX 3?

除此之外,如果你:正确注册的

0

添加一个较短的答案有一个代码示例,现在留在我的其他答案:

  • 您需要将FP7000-Camera.dll文件安装到Program Files下的目录中并在其中注册。下面是在CodeProject上发现了一个样品的快速模拟式:http://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with

    <?xml version="1.0"?> 
        <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
        <Product Id="*" UpgradeCode="put-guid-here" 
          Name="Example Product Name" Version="0.0.1" 
          Manufacturer="Example Company Name" Language="1033"> 
        <Package InstallerVersion="200" Compressed="yes" 
          Comments="Windows Installer Package"/> 
    
        <Media Id="1" Cabinet="product.cab" EmbedCab="yes"/> 
        <Directory Id="TARGETDIR" Name="SourceDir"> 
        <Directory Id="ProgramFilesFolder"> 
         <Directory Id="INSTALLDIR" Name="Example"> 
          <Component Id="FP7000-Camera.dll" Guid="*"> 
           <File Id="FP7000-Camera.dll" Source="replace with path to FP7000-Camera.dll"/> 
          </Component> 
         </Directory> 
        </Directory> 
        </Directory> 
    
        <Feature Id="DefaultFeature" Level="1"> 
         <ComponentRef Id="FP7000-Camera.dll"/> 
        </Feature> 
    
        </Product> 
        </Wix> 
    
  • 你也应该删除DLL的自注册,取而代之的是COM注册加入到安装文件保存到磁盘组件。在这里看到一个示例:How do you register a Win32 COM DLL file in WiX 3?(运行Wix工具heat.exe以生成要包含在组件中的COM数据)。如果正确执行此操作,则不需要自行注册该文件,并可以删除自定义操作。

  • 最后,你应该安装SDK运行MSI作为自定义操作,但首先运行它作为一个先决条件的MSI。
相关问题