在 "thin" 64 位 DLL 包装器中包装 32 位 COM shell 扩展
Wrapping a 32-bit COM shell extension within a "thin" 64-bit DLL wrapper
前提:
我有一个旧的 32 位 COM shell 扩展(用 C++ 编写)。在与较新的 64 位系统多年不兼容之后,我们现在正在更新它以在 64 位 Windows 环境中工作。
诀窍:
32 位 COM DLL 包含对第三方库的依赖,没有可用的 64 位版本。因此,我们不能简单地 'recompile in 64-bit.' 鉴于此限制,我们决定最简单的方法是创建一个 'thin' 64 位 DLL;本质上是一个仅定义所需接口的空 DLL,并将所有调用重定向到底层 32 位 COM DLL。
我相信通过使用 COM 代理,64 位 COM DLL 和 32 位 COM DLL 之间的通信是可能的。不幸的是,这似乎是一个非常 specific/niche 的话题,我一直无法找到很多关于如何从 64 位 COM DLL 调用 32 位 COM API 的资源。
题目:
- 对于启用 32 位 COM DLL 的 64 位功能,这种 'thin COM wrapper' 是一种合理的方法吗?
- 为什么这种方法不适用于 Windows Shell 扩展?
- 64 位接口定义是否会使用与 32 位接口定义相同的 GUID?
- 这是过去记录的策略吗?
- 是否有从 64 位 COM DLL 中调用 32 位 COM API 的好资源?
说明:
这个问题有许多独特之处,使其有别于问题“Using 32-bit shell extensions in Windows 7 64-bit”。
我不是在问是否可以在 64 位资源管理器进程中加载 32 位 shell 扩展,正如所引用的问题那样。相反,我想问是否有可能创建 DLL 的 thin 64 位实现,它充当 64 位资源管理器进程和 32 位实现之间的桥梁。
明确地说,这是不可能的。
但也许这是?
我们有 64 位应用程序成功地使用了仅 32 位的 COM 应用程序(例如 VB6 应用程序)。这看起来很复杂,但实际上您只需为您尝试使用的 COM 组件添加一些注册表项,然后您就可以使用它了。您可以在此处查看详细信息:
http://www.gfi.com/blog/32bit-object-64bit-environment/
http://www.codeproject.com/Tips/267554/Using-bit-COM-Object-from-bit-Application
所以是的,它会起作用,但当然这里有额外的复杂性,简单的解决方案通常是最好的。
或者,您始终可以将 32 位功能包装为服务或类似的东西,然后以这种方式访问它。或者作为可执行文件并使用文本文件或其他东西进行通信。
是的,使用 DCOM 是可行的,最糟糕的问题是为 DCOM "component" 设置权限并进行数据编组工作。
Is this 'thin COM wrapper' a reasonable approach, for enabling 64-bit functionality of a 32-bit COM DLL?
是的,当我们必须提供具有 32 位和 64 位实现的进程内 COM 服务器时,我们已经这样做过一次。我们基本上有这样的瘦服务器,可以在 32 位和 64 位中实现(消费者将加载适当的)并将调用重定向到托管在 DCOM 中的 32 位 outproc 服务器。
Is there any reason this approach would not work specifically for Windows Shell Extensions?
您可能无法正确设置 outproc 服务器的权限。这很可能会奏效。无法想象任何其他原因。
Would the 64-bit interface definitions use identical GUIDs as their 32-bit counterparts?
是的。 COM 接口是一个合同。您可以根据需要实现任意数量的合约。
Are there any good resources for calling a 32-bit COM API from within a 64-bit COM DLL?
没有特别要求。只需用 CLSCTX_ALL
调用 CoCreateInstance()
即可。
您主要关心的是编组。您必须在客户端和服务器之间编组数据,这些数据现在将处于不同的进程中。最好的选择是使用自动化封送处理(又名 typelib 封送处理)。如果碰巧原始接口与自动化不兼容,那么请尝试引入一个与自动化兼容的新接口,然后您的包装器将作为适配器提供服务。您可能无法为您的任务设计一个新的自动化兼容界面,但请尝试一下,因为这是您最好的选择。
每当任何事情失败时 - 有些事情没有编组,找不到一些依赖文件 - 使用进程监视器来查看失败的原因。
前提:
我有一个旧的 32 位 COM shell 扩展(用 C++ 编写)。在与较新的 64 位系统多年不兼容之后,我们现在正在更新它以在 64 位 Windows 环境中工作。
诀窍:
32 位 COM DLL 包含对第三方库的依赖,没有可用的 64 位版本。因此,我们不能简单地 'recompile in 64-bit.' 鉴于此限制,我们决定最简单的方法是创建一个 'thin' 64 位 DLL;本质上是一个仅定义所需接口的空 DLL,并将所有调用重定向到底层 32 位 COM DLL。
我相信通过使用 COM 代理,64 位 COM DLL 和 32 位 COM DLL 之间的通信是可能的。不幸的是,这似乎是一个非常 specific/niche 的话题,我一直无法找到很多关于如何从 64 位 COM DLL 调用 32 位 COM API 的资源。
题目:
- 对于启用 32 位 COM DLL 的 64 位功能,这种 'thin COM wrapper' 是一种合理的方法吗?
- 为什么这种方法不适用于 Windows Shell 扩展?
- 64 位接口定义是否会使用与 32 位接口定义相同的 GUID?
- 这是过去记录的策略吗?
- 是否有从 64 位 COM DLL 中调用 32 位 COM API 的好资源?
说明:
这个问题有许多独特之处,使其有别于问题“Using 32-bit shell extensions in Windows 7 64-bit”。
我不是在问是否可以在 64 位资源管理器进程中加载 32 位 shell 扩展,正如所引用的问题那样。相反,我想问是否有可能创建 DLL 的 thin 64 位实现,它充当 64 位资源管理器进程和 32 位实现之间的桥梁。
明确地说,这是不可能的。
但也许这是?
我们有 64 位应用程序成功地使用了仅 32 位的 COM 应用程序(例如 VB6 应用程序)。这看起来很复杂,但实际上您只需为您尝试使用的 COM 组件添加一些注册表项,然后您就可以使用它了。您可以在此处查看详细信息:
http://www.gfi.com/blog/32bit-object-64bit-environment/ http://www.codeproject.com/Tips/267554/Using-bit-COM-Object-from-bit-Application
所以是的,它会起作用,但当然这里有额外的复杂性,简单的解决方案通常是最好的。
或者,您始终可以将 32 位功能包装为服务或类似的东西,然后以这种方式访问它。或者作为可执行文件并使用文本文件或其他东西进行通信。
是的,使用 DCOM 是可行的,最糟糕的问题是为 DCOM "component" 设置权限并进行数据编组工作。
Is this 'thin COM wrapper' a reasonable approach, for enabling 64-bit functionality of a 32-bit COM DLL?
是的,当我们必须提供具有 32 位和 64 位实现的进程内 COM 服务器时,我们已经这样做过一次。我们基本上有这样的瘦服务器,可以在 32 位和 64 位中实现(消费者将加载适当的)并将调用重定向到托管在 DCOM 中的 32 位 outproc 服务器。
Is there any reason this approach would not work specifically for Windows Shell Extensions?
您可能无法正确设置 outproc 服务器的权限。这很可能会奏效。无法想象任何其他原因。
Would the 64-bit interface definitions use identical GUIDs as their 32-bit counterparts?
是的。 COM 接口是一个合同。您可以根据需要实现任意数量的合约。
Are there any good resources for calling a 32-bit COM API from within a 64-bit COM DLL?
没有特别要求。只需用 CLSCTX_ALL
调用 CoCreateInstance()
即可。
您主要关心的是编组。您必须在客户端和服务器之间编组数据,这些数据现在将处于不同的进程中。最好的选择是使用自动化封送处理(又名 typelib 封送处理)。如果碰巧原始接口与自动化不兼容,那么请尝试引入一个与自动化兼容的新接口,然后您的包装器将作为适配器提供服务。您可能无法为您的任务设计一个新的自动化兼容界面,但请尝试一下,因为这是您最好的选择。
每当任何事情失败时 - 有些事情没有编组,找不到一些依赖文件 - 使用进程监视器来查看失败的原因。