我最近完成了我的第一个Wix Intaller,但是我遇到了问题,我的MSI文件仅适用于我的计算机,我正在生成一个嵌入式CAB文件。我正在安装程序中注册DLL。我收到错误:“此Windows Installer程序包存在问题。作为安装程序的一部分运行的程序没有按预期完成。”这就是为什么我认为DLL是问题的一部分。我在下面有一些代码片段,如果你需要看到更多让我知道,谢谢!
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 :(得分:4)
这种注册失败通常是因为Dll不会加载,因为它缺少依赖关系(假设其他一切都是正确的)。其他问题可能包括运行regsvr32的错误位(例如64位版本)并尝试注册32位Dll。
无论如何,没有必要这样做。最佳实践和推荐的方法是使用Heat.exe将注册数据收集到wxs文件中,因此安装时只需在安装时创建正确的注册表项。
答案 1 :(得分: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
打开日志文件并搜索“ value 3 ”,如下所示:http://robmensching.com/blog/posts/2010/8/2/the-first-thing-i-do-with-an-msi-log/
来源链接:
编辑:再次查看您的代码我很确定问题是:
我要离开之前我写过的更长的答案:
除了Phil的答案之外:不建议将英特尔SDK设置安装为自定义操作。 MSI禁止运行两个并发的InstallExecuteSequence会话,这很可能是您看到错误的原因。
尝试删除当前用于安装MSI的自定义操作,然后首先运行SDK设置,作为两个MSI文件的链式安装的一部分,以查看是否可以解决问题。
不应使用自行注册注册COM文件,原因有很多:
除此之外,如果您坚持使用自行注册,在编译MSI文件时不应使用任何硬编码路径。忽略您应该使用正确的COM提取注册COM文件的事实,应该删除regsvr32.exe的路径以支持AppSearch / FileSearch条目,该条目将在系统上找到regsvr32.exe正在安装到。 DLL应该安装到%ProgramFiles%\ Your Company Name \ Your Project Name \或类似的本地路径下,然后注册从那里运行。生成的WIX代码类似于:
ExeCommand='[PATHTOREGSVR32]regsvr32.exe /s "[INSTALLDIR]FP7000-Camera.dll"'>
也许也读过这些文章:
答案 2 :(得分: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数据)。如果您正确执行此操作,则无需自行注册该文件,您可以删除自定义操作。