ATL 活动模板库 支持创建三种模式的 COM 组件。
dll,exe,service
微软公司的官方网站针对这个问题描述如下:
在64位的windows系统中,一个64位进程不能加载一个32位dll,同理一个32位进程也不能加载一个64位dll。但是,64位windows支持64位和32位进程(包括本机或跨机)间进程间通信(RPC)。在64位windows中,一个进程外32位COM服务器能够与64位客户端进行通信,同样一个进程外64位COM服务器也能与32位客户端进行通信。因此,如果你有一个32位COM无法识别的DLL,你可以将它封装到一个进程外COM服务器中并在一个64位进程中用COM配置调用DLL。
验证:
工作流程:
1.创建一个进程外COM服务器(EXE)。
2.将32位dll的接口函数封装为COM服务器的相关接口。
3.注册COM服务器*.exe /regserver (注销 *.exe /unregserver)。
4.64位进程调用32位COM服务器接口,成功。从而曲线实现了64位进程调用32位dll。
其中 进程外 支持 32bit 和 64.bit 相互调用。
例如我有一个 64位 动态库,我需要调用里面的函数,但我这个程序必须编译成 32 位程序,很显然 32 位程序是无法调用 64位 程序的,首先地址宽度都不一样,寄存器的大小也不一样。
那么有没有一种方法可以实现上述问题呢?那就是 进程外 COM 服务,通过 COM 包装 64 位动态库,然后注册该服务,在 32 位程序上寻找该服务,然后进行调用。内部实现是通过 rpc socket 进行调用。
注意以下命令需要管理员权限运行。
//[1]
regsvr32.exe YourDll.dll
regsvr32.exe /u YourDll.dll
//[2]
YourEXE.exe /regserver
YourEXE.exe /unregserver
//[3]
YourEXE.exe /Service
YourEXE.exe /UnregServer
代理进程(dllhost.exe)