繁体   English   中英

64位应用程序的COM注册

[英]COM registration for a 64-bit application

我正在为使用第三方SDK的64位应用程序创建安装程序。 这个SDK需要COM注册,似乎有一些相互矛盾的说明,所以我想找出有关以下内容的最佳实践:

要实现无注册表激活(对于支持它们的COM DLL),我只是将它们放在同样包含Interop包装器的应用程序文件夹中。 无论如何,这是他们的指示。

要使用剩余的COM DLL,它们具有以下说明:

LEADTOOLS Multimedia for .NET现在支持LEADTOOLS多媒体COM对象的无注册表激活(请注意,所有其他LEADTOOLS DirectShow过滤器和编解码器仍需要使用regsvr32进行注册)。 重新分发所需的新文件包括:ltmm.manifest和ltmm19.dll(32位)或ltmm19x.dll(64位),(取决于应用程序的处理器体系结构)。 为了使您的应用程序使用无注册表激活,请将文件安装到与Leadtools.Multimedia.dll相同的文件夹中。

该工具包还为DSKernel2.dll(32位)和DSKernel2x.dll(64位)COM对象提供可选的清单文件,以简化部署(几乎所有应用程序都需要DSKernel DLL。可以选择重新分配的新文件包括:DSKernel2.manifest(32位)或DSKernel2x.manifest(64位),(取决于应用程序的处理器体系结构)。将这些文件安装到与DSKernel2.dll / DSKernel2x.dll相同的文件夹中,以便应用程序使用无注册表激活。

***建议您在windir \\ SYSWOW64文件夹而不是windir \\ System32文件夹中安装x64运行时,因为某些开发环境(如VS8)不会导入放在windir \\ System32文件夹中的引用,因为这是一个32位应用程序。

所以,即使你忽略了上述背景,我的问题仍然存在:

regsvr32有两个版本,一个在Windows\\System32文件夹中,另一个在Windows\\SysWOW64文件夹中。 哪一个用于注册纯64位dll?

此外,在枚举系统,文件夹时, SpecialFolder枚举的以下值似乎是违反直觉的,并且MSDN描述对它们没有太多暗示。

Environment.SpecialFolder.System > Maps to Windows\System32
Environment.SpecialFolder.SystemX86 > Maps to Windows\SysWOW64

任何指导将不胜感激。 请注意,使用这些文件的应用程序的目标是x64 ,而不是AnyCPU并且支持的最低操作系统必须是Windows 7

如果要使用具有免注册COM的其他组件,则必须引用刚放置在应用程序文件夹中的程序集。 简单地将它们放在那里是必要的,但还不够,所以你需要更改应用程序的清单,或创建一个取决于隔离组件的清单。

例如:

<assembly manifestVersion="1.0"
          xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity type="win32"
                    name="MyApplication"
                    processorArchitecture="amd64"
                    version="1.0.0.0" />
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
      <!-- Windows 8 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
      <!-- Windows 8.1 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
    </application>
  </compatibility>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity … />
    </dependentAssembly>
  </dependency>
</assembly>

将依赖程序集的标识(在...中)替换为隔离的COM组件为目标体系结构标识自身的标识。

您的其余问题似乎是针对开发机器的环境。

对于64位Windows中的64位DLL,可以在C:\\ Windows \\ System32中进行部署。

对于64位Windows中的32位DLL,可以部署在C:\\ Windows \\ SysWOW64中。

它可能没什么意义,但这就是我们所拥有的 这样,您不必将所有VS项目或nmake文件更改为具有两组库引用,例如,您始终使用user32而不是user32user64具体取决于目标系统。 事后来看,大约20年前将架构位数添加到库名称可能是错误的。

特别是关于LEADTOOLS Multimedia,当您构建.NET应用程序时,有两种类型的DLL:

  • 核心工具包DLL,用于DirectShow的Leadtools.Multimedia.dll和用于Media Foundation的Leadtools.MediaFoundation.dll。 这些核心DLL包含主要控件(捕获,转换和回放)以及其他几个辅助对象,它们不需要注册(使用RegSvr32)。 这些是我们的本机COM库的.NET包装器/ interops(到LTMM ##。dll)。 请注意,DirectShow和MediaFoundation都是用COM实现的。 因此,LEADTOOLS还创建了COM DLL。 由于.NET本身不能与COM一起使用,因此我们创建了这些包装器,以便使用我们的工具更轻松地编写.NET应用程序。 如果您愿意,可以将这些注册到全局程序集缓存(GAC)中,但这不是必需的。

  • 其他编解码器和过滤器,如H.264和H.265。 每个(COM)编解码器或过滤器通常都有自己的DLL,这些需要使用RegSvr32进行注册。 对于这些编解码器和过滤器的64位和32位版本,我们建议您将这些DLL部署到SysWOW64文件夹,并使用SysWOW64文件夹中的RegSvr32.exe进行注册。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM