我知道如何设置文件夹的权限:
<DirectoryRef Id="ProgramFilesFolder">
<Directory Id="PHPFolder" Name="PHP">
<Component Id="PHP_comp" DiskId="1" Guid="*">
<CreateFolder>
<Permission User="Everyone" GenericAll="yes" />
</CreateFolder>
Run Code Online (Sandbox Code Playgroud)
但是,我还需要将权限应用于所有子文件夹.是否可以列出所有文件夹?
我的机器上安装了一个应用程序.我也有它的源代码,但不知何故,此应用程序的ProductCode和UpgradeCode已更改.
现在我想获得这个已安装应用程序的UpgradeCode和ProductCode.我觉得必须有一些工具.
谁能告诉我如何获得已安装应用程序的UpgradeCode和ProductCode?
我没有在WiX文档(或Google)中找到这个问题的明确答案.当然我可以在HKCR中编写相应的注册表项,但这让我觉得很脏,我希望这是一个标准的任务,应该有一个很好的默认解决方案.
对于奖励积分,我想知道如何使其"安全",即不要覆盖文件类型的现有注册,并且只有在安装期间注册并且未更改时才删除卸载时的注册.
曾几何时,一位年轻,天真的工程师认为将他的应用程序的一些功能分成一个用C#编写的COM组件是个好主意.Visual Studio拥有所有这些工具,对吧?.NET实际上是为此做的,对吗?哈!他说,这很容易.我将对组件进行适当的分离,使业务逻辑远离前端,而使用COM,我将能够在任何地方使用它!他愉快地检查了register for COM interop项目属性中的复选框,暴露了他想要的分类,然后继续前进.
哦,试验这样的选择.这位年轻的工程师现在更有经验,现在不希望任何人这样做.但是,肩负重担,负担仍然沉重.他希望减轻负担.
随之而来的是WiX,一种用于从XML生成Windows Installer文件的工具.这引起了他的兴趣 - 它可以简单地从一些配置文件复制一个正确的Windows安装程序文件所需的大部分代码.他的目光正在抬头.
使用WiX 2.0,他可以很容易地生成注册C#COM对象所需的文件.这涉及使用工具牛油.他会做以下事情:
tallow -c -nologo MyComExposedLibrary.dll > MyComExposedLibrary.wxs
Run Code Online (Sandbox Code Playgroud)
然后将其修复(首先这是手动完成的,但最终我将步骤记录到一个小工具集中,最终目录引用ID,组件ID,文件ID,GUID和代码库).
然后,随后的安装程序将安装,如果应用程序工作,将有欢乐的庆祝活动.
它没有.
几天来,年轻的工程师倾注了他的开发PC和测试安装PC的差异."所有的注册表键都是一样的!" 他会惊呼."对于MyComExposedLibrary的所有内容都已注册,我发誓!"
除此之外,事实并非如此.
在第三天的黎明之后,经过许多山露,他意识到Visual Studio正在注册的另一个对象是他的安装程序不是:MyComExposedLibrary.tlb文件.
显然,Visual Studio一直在注册此文件,在HKLM\Software\Classes\Interface注册表项中创建其他子项,并在其中注册typelib HKLM\SOFTWARE\Classes\TypeLib.
Tallow没有给出任何帮助,抱怨说.tlb不是一个文件.也不是WiX 3.0测试版 - 这似乎有更多的问题让事情发挥作用.
我也尝试了热火.这生成了注册表元素和类元素.我清理了热量的输出,然后去编译它,但得到了一个不同的错误:error LGHT0130 : The primary key <uuid here> is duplicated in table 'Registry'.问题是,据我所知,uuid实际上并不存在于我的任何wxs源文件中.如果我在我的feature元素中改变组件引用顺序,则另一个dll组件会给出该错误.由于我没有成功完成项目的WiX 3.0版本的编译,我无法确认热量是否能提供正确的输出.
我从安装程序中删除了所有内容,除了导致出现此错误的程序集之一并再次尝试编译.我得到了同样的错误.Arrugh!
所以,我的好伙伴,Windows爱好者和WiX用户都有两个问题:
此外,我想作为另一部分,Visual Studio如何确定如何注册typelib?(编辑:看起来关于typelib注册的MSDN库文章有所需的密钥的名称,但我仍然需要弄清楚如何获取uuid的.(这是关于typelib的博客文章和Larry Osterman的COM注册.))再读一点,手动注册这些位可能会让我失望,但我希望不是......
我评估了输出regasm /regfile:MyDll.dll MyDll.dll.看起来这些是wix为dll生成的密钥.Regasm的另一种模式,regasm /tlb:<filename>生成并注册程序集的类型库,但是,
/ regfile [:FileName]生成具有指定名称的reg文件,而不是注册类型.此选项不能与/ u或/ tlb选项一起使用 …
在完成WIX教程后,我仍然不知道如何将installdir添加到Windows系统变量的PATH中.
我试着用
Environment Id='UpdatePath' Action='create' Name='PATH' System='yes' Value='[INSTALLDIR]'
Run Code Online (Sandbox Code Playgroud)
但是我安装程序后路径没有变化.我几乎找不到任何WIX的示例代码.请帮帮我,非常感谢!
我找到了一个关于注册DLL的示例,使用Windows Installer XML工具集在MSI文件中注册COM Interop的程序集.,和WiX抱怨"AssemblyRegisterComInterop"属性.
我删除了它并将"Assembly"属性更改为win32,它说我需要指定AssemblyManifest属性,但是我应该放在那里?
当我创建一个WiX项目并尝试使用平台设置为'x64'来构建它时,我的构建输出中出现错误,如下所示:
------ Build started: Project: MyProject, Configuration: Release x64 ------
C:\Program Files (x86)\MSBuild\Microsoft\WiX\v3.x\wix2010.targets(444,7): error : The OutputPath property is not set for this project. Please check to make sure that you have specified a valid Configuration/Platform combination. Configuration='Release' Platform='x64'
Done building project "MyProject.wixproj" -- FAILED.
------ Build started: Project: MyProject, Configuration: Debug x64 ------
C:\Program Files (x86)\MSBuild\Microsoft\WiX\v3.x\wix2010.targets(444,7): error : The OutputPath property is not set for this project. Please check to make sure that you have specified a …Run Code Online (Sandbox Code Playgroud) 我正在使用Wix 3.6来制作一个内部使用的简单MSI.我想知道是否有一种简单的方法来删除许可协议对话框.
谢谢你的任何建议
我无法理解在快捷方式属性中使用属性Advertise的确切后果.差异是什么?
wix ×10
installer ×3
wix3 ×3
com ×2
.net ×1
64-bit ×1
automation ×1
build ×1
dll ×1
environment ×1
installation ×1
msiexec ×1
path ×1
permissions ×1
typelib ×1
windows ×1
wix3.5 ×1
wix3.6 ×1