在 "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 的资源。

题目:

说明:

这个问题有许多独特之处,使其有别于问题“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 封送处理)。如果碰巧原始接口与自动化不兼容,那么请尝试引入一个与自动化兼容的新接口,然后您的包装器将作为适配器提供服务。您可能无法为您的任务设计一个新的自动化兼容界面,但请尝试一下,因为这是您最好的选择。

每当任何事情失败时 - 有些事情没有编组,找不到一些依赖文件 - 使用进程监视器来查看失败的原因。