[英]Register a 32-bit COM class for use in 64-bit Python without Administrator rights
[英]Register 32-Bit COM Class in 64-Bit Component
我使用SharpShell为Windows资源管理器shell构建了一个ContextMenuHandler。 该程序集是为AnyCPU构建的,即在MSIL中构建,因此可以作为32位和64位运行。
我打算只在64位窗口上运行它,但是,Windows 64上的32位应用程序仍然使用32位版本的shell进行打开对话框等。
我已经在两个体系结构(32和64)上使用regasm工具手动注册了此程序集,并且它在64位Windows资源管理器中工作正常。 它也适用于32位应用程序中的文件打开和其他shell提供的对话框。 这是预期的行为,太棒了!
我遇到的问题是编写安装脚本,我正在使用Wix 3.7,我不想使用regasm。
64位组件安装时: -
<Component Id="cmpMyAssembly64" Directory="INSTALL_TO_HERE"
Location="local" Win64="yes">
<File Id="filMyAssembly" KeyPath="yes" Source="mySource.dll"
Assembly=".net" AssemblyApplication="filMyAssembly"
ProcessorArchitecture="msil"/>
<Class Id="01201201-0000-0000-0000-012345670123" Description="My Handler"
Context="InprocServer32" ThreadingModel="both" ForeignServer="mscoree.dll">
<ProgId Id="A.ContextHandler" Description="Does something" />
</Class>
<RegistryKey Root="HKCR" Key="CLSID\{01201201-0000-0000-0000-012345670123}"
ForceCreateOnInstall="yes" ForceDeleteOnUninstall="yes">
<RegistryKey Key="Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}">
<RegistryValue Value="" Type="string" />
</RegistryKey>
<RegistryKey Key="InprocServer32">
<RegistryKey Key="1.0.0.0">
<RegistryValue Name="Class" Value="aNamespace.theClass" Type="string" />
<RegistryValue Name="Assembly" Value="!(bind.assemblyFullName.filMyAssembly)" Type="string" />
<RegistryValue Name="RuntimeVersion" Value="v4.0.30319" Type="string" />
<RegistryValue Name="CodeBase" Value="file:///[#filMyAssembly]" Type="string" />
</RegistryKey>
<RegistryValue Name="Class" Value="aNamespace.theClass" Type="string" />
<RegistryValue Name="Assembly" Value="!(bind.assemblyFullName.filMyAssembly)" Type="string" />
<RegistryValue Name="RuntimeVersion" Value="v4.0.30319" Type="string" />
<RegistryValue Name="CodeBase" Value="file:///[#filMyAssembly]" Type="string" />
</RegistryKey>
</RegistryKey>
<RegistryValue Root="HKCR" Key="Directory\Background\shellex\ContextMenuHandlers\MyHandler" Value="{guid}" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="Directory\shellex\ContextMenuHandlers\MyHandler" Value="{guid}" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="Drive\shellex\ContextMenuHandlers\MyHandler" Value="{guid}" Type="string" Action="write" />
</Component>
我遇到的问题是32位版本的注册。 因为它使用相同的程序集,所以我不想两次安装相同的文件。 我所做的就是创建另一个(32位)组件并进行必要的注册表更改。
<Component Id="cmp32BitVersion" Directory="INSTALL_TO_32"
Location="local" Win64="no">
<Class ... just like 64bit
<RegistryKey ... just like 64bit
</Component>
现在,我假设Win64是/否是Windows安装程序决定写入哪个部分的注册表。 对于64位组件,它写入HKCR ...,对于32位组件,它将写入HKLM \\ SOFTWARE \\ WOW6432Node \\ Classes。 我遇到的问题是,因为两个组件都使用文件引用[#filMyAssembly]我得到ICE69:不匹配的组件引用,警告。 代码仍然构建,但我不希望得到警告,不注意警告的人应该预料到麻烦。
无论如何,我的问题是:使用Wix / Windows Installer在64位和32位应用程序中为COM注册MSIL程序集的正确方法是什么?
来自wix用户的MikeR和nickheppleston看起来已经找到了解决方案:
谢谢所有回复的人。 我按照MikeR的评论提出了以下内容 - 我发现在功能部分中定义Component和ComponentRef时我必须引用x64 Architecture变量,如下所示:
<Component Id="x86LicencingRegistryKeys" Guid="D113AD25-9E80-44E9-80C0-D66828809DBF" Win64="no">
<RegistryKey Id="x86ValidationCodeRegKey" Root="HKLM" Key="SOFTWARE\Product\Licencing" Action="createAndRemoveOnUninstall">
<RegistryValue Id="x86ValidationCodeRegValue" Name="ValidationCode" Action="write" Value="BgIAAACkAABSU0ExgAEAAAEAAQD9iAIysvGIxaJcIiENpOVTZbQosafHa9yXlfG0kxSWKJ01Hlfl+I+4ul5LhxoZkLo=" Type="string" />
<Permission User="Administrators" ChangePermission="yes" GenericAll="yes" />
<Permission User="CREATOR OWNER" ChangePermission="yes" GenericAll="yes" />
<Permission User="Power Users" ChangePermission="yes" GenericAll="yes" />
<Permission User="SYSTEM" ChangePermission="yes" GenericAll="yes" />
<Permission User="Users" ChangePermission="yes" GenericAll="no" GenericRead="yes" />
</RegistryKey>
<RegistryKey Id="x86LicenceKeyRegKey" Root="HKLM" Key="SOFTWARE\Product\Licencing" Action="createAndRemoveOnUninstall">
<RegistryValue Id="x86LicenceKeyRegValue" Name="LicenceKey" Action="write" Value="" Type="string" />
<Permission User="Administrators" ChangePermission="yes" GenericAll="yes" />
<Permission User="CREATOR OWNER" ChangePermission="yes" GenericAll="yes" />
<Permission User="Power Users" ChangePermission="yes" GenericAll="yes" />
<Permission User="SYSTEM" ChangePermission="yes" GenericAll="yes" />
<Permission User="Users" ChangePermission="yes" GenericAll="no" GenericRead="yes" />
</RegistryKey>
</Component>
<?if $(var.Architecture)=x64 ?>
<Component Id="x64LicencingRegistryKeys" Guid="49A15EB4-2DF8-4FF9-83ED-D306F076E232" Win64="yes">
<RegistryKey Id="x64ValidationCodeRegKey" Root="HKLM" Key="SOFTWARE\Product\Licencing" Action="createAndRemoveOnUninstall">
<RegistryValue Id="x64ValidationCodeRegValue" Name="ValidationCode" Action="write" Value="BgIAAACkAABSU0ExgAEAAAEAAQD9iAIysvGIxaJcIiENpOVTZbQosafHa9yXlfG0kxSWKJ01Hlfl+I+4ul5LhxoZkLo=" Type="string" />
<Permission User="Administrators" ChangePermission="yes" GenericAll="yes" />
<Permission User="CREATOR OWNER" ChangePermission="yes" GenericAll="yes" />
<Permission User="Power Users" ChangePermission="yes" GenericAll="yes" />
<Permission User="SYSTEM" ChangePermission="yes" GenericAll="yes" />
<Permission User="Users" ChangePermission="yes" GenericAll="no" GenericRead="yes" />
</RegistryKey>
<RegistryKey Id="x64LicenceKeyRegKey" Root="HKLM" Key="SOFTWARE\Product\Licencing" Action="createAndRemoveOnUninstall">
<RegistryValue Id="x64LicenceKeyRegValue" Name="LicenceKey" Action="write" Value="" Type="string" />
<Permission User="Administrators" ChangePermission="yes" GenericAll="yes" />
<Permission User="CREATOR OWNER" ChangePermission="yes" GenericAll="yes" />
<Permission User="Power Users" ChangePermission="yes" GenericAll="yes" />
<Permission User="SYSTEM" ChangePermission="yes" GenericAll="yes" />
<Permission User="Users" ChangePermission="yes" GenericAll="no" GenericRead="yes" />
</RegistryKey>
</Component>
<?endif ?>
<Feature Id="Complete" Title="TITLE" Description="Complete Package" Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR">
<ComponentRef Id="x86LicencingRegistryKeys" />
<?if $(var.Architecture)=x64 ?><ComponentRef Id="x64LicencingRegistryKeys" /><?endif ?>
</Feature>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.