版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liubing8609/article/details/86098305
64位进程调用32位DLL的解决方法
最近做在Windows XP X64,VS2005环境下,32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的遇到了64位进程需要调用32位DLL的问题。由于有一些32位DLL没有源代码,无法重新编译为64位DLL,所以只能想办法解决64位进程调用32位DLL问题,这个问题让我很是挠头了几天。
微软公司的官方网站针对这个问题描述如下:
在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。
工作流程:
- 创建一个进程外COM服务器(EXE)。
- 将32位DLL的接口函数封装为COM服务器的相关接口。
- 注册COM服务器*.exe /regserver (注销 *.exe /unregserver)。
- 64位进程调用32位COM服务器接口,成功。从而曲线实现了64位进程调用32位DLL。
具体步骤:
首先创建了一个简单的DLL工程,只输出一个函数
int c = add(int a,int b);
生成lib和dll;
然后创建一个进程外COM(EXE类型),内部链接dll,添加方法
Method: Add(long *c)
{ *c = add(1,2);}
编译生成。
然后注册COM,*.exe /regserver;
最创建一个64位WIN32工程验证64位环境下方法调用是否正确,经验证正确!
结论:以上方法可以解决64位进程调用32位DLL的问题。