前提:
我有一个旧的32位COM shell扩展(用C ++编写)。经过多年与更新的64位系统的不兼容,我们现在正在更新它以在64位Windows环境中工作。
诀窍:
32位COM DLL包含对第三方库的依赖性,没有可用的64位版本。因此,我们不能简单地在64位中重新编译。'鉴于这种限制,我们认为最简单的方法是创造一个“瘦身”的方法。 64位DLL;本质上是一个空DLL,只定义所需的接口,并将所有调用重定向到底层的32位COM DLL。
我相信通过使用COM代理,可以在64位COM DLL和32位COM DLL之间进行通信。不幸的是,这似乎是一个非常具体/小众的主题,我一直无法找到很多关于如何从64位COM DLL调用32位COM API的资源。
问题:
澄清:
这个问题有很多方面使它与众不同,将其与问题区分开来Using 32-bit shell extensions in Windows 7 64-bit。"
我不是在询问是否可以在64位资源管理器进程中加载32位shell扩展,如引用的问题那样。相反,我问是否有可能创建一个精简的64位DLL实现,它充当64位资源管理器进程和32位实现之间的桥梁。
要明确,这是不可能的。
但也许这是?
答案 0 :(得分:1)
我们有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位功能作为服务或类似的东西包装并以这种方式访问它。或者作为可执行文件并使用文本文件或其他东西进行通信。
答案 1 :(得分:1)
是的,DCOM是可行的,你最糟糕的问题是设置DCOM"组件"并使数据编组工作。
这是一个很薄的COM包装器吗?一种合理的方法,用于启用32位COM DLL的64位功能吗?
是的,当我们必须提供具有32位和64位实现的进程内COM服务器时,我们已经完成了这一步。我们基本上有这样的瘦服务器,它将以32位和64位实现(消费者将加载适当的服务器)并将调用重定向到DCOM中托管的32位outproc服务器。
这种方法有什么理由不适用于Windows Shell Extensions吗?
您可能无法为outproc服务器正确设置权限。很可能这会奏效。无法想象任何其他原因。
64位接口定义是否使用与32位接口相同的GUID?
是。 COM接口是合同。您可以根据需要拥有尽可能多的合同实现。
在64位COM DLL中调用32位COM API有什么好的资源吗?
没有特别要求。只需使用CoCreateInstance()
与CLSCTX_ALL
打电话即可{.1}}。
你主要担心的是封送。您必须在客户端和服务器之间编组数据,这些数据现在将处于不同的进程中。您最好的选择是使用自动编组(也称为typelib编组)。如果原始接口不兼容自动化,那么尝试引入一个与Automation兼容的新接口,然后您的包装器将作为适配器服务器。可能会发生这种情况,您将无法为您的任务设计新的自动化兼容接口,但请尝试这样做,因为这是您最好的选择。
每当任何事情无法工作 - 某些事情没有编组,找不到某些相关文件时 - 使用进程监视器查看发生的事情是否失败。