簡體   English   中英

在64位組件中注冊32位COM類

[英]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看起來已經找到了解決方案:

http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/64-bit-and-32-bit-Registry-Keys-in-same-MSI-td4439679.html

謝謝所有回復的人。 我按照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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM