32bit程序调用64bit dll 的解决办法

32bit程序调用64bit dll 的解决办法

32bit程序不能直接调用64bit的dll,我们采用COM进程外组件的方式来实现间接调用。

简单来说就是编写COM进程外组件,封装64位dll的功能,编译COM组件为64bit版本。

然后32bit的应用程序去调用该COM组件,经过测试成功。具体代码见附件。附件中并没有封装一个64bit的dll,只是写了一个简单的com对象。

COM组件是用vs2010写的,COM组件测试程序用vc6编写。

测试步骤:

我的环境是win7 x64,

首先以管理员身份运行vs2010,打开procout工程,编译配置选x64,release 编译工程,得到2个文件:ProcOut.exe,ProcOutPS.dll

2.打开vc6,编译procouttest工程,并调试运行,在如下的CreateInstance下断点,可看到该调用是成功的,也就是说成功实例化了COM组件;

BOOL CProcOutTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
HRESULT hr = m_IObject.CreateInstance(__uuidof(Modu));
if(FAILED(hr))

...

}

进一步可查看系统中运行的进程,可看到如下2个进程。


在测试这个事情过程中,遇到2个问题,记录一下:

1.vs2010 编写atl com组件遇到编译PS工程失败的问题,具体解决办法参考:https://connect.microsoft.com/VisualStudio/feedback/details/578130/vs2010-bug-unresolved-external-symbol-proxyfileinfo

也就是说打开COM组件的第一个工程属性找到MIDL -> Target Environment" and set it to "Microsoft Windows 64-bit on x64 (/env x64)".

2.进程外组件注册方式:

要注册组件,请键入下列命令:

<path>\<mycomponent> /regserver

其中,<path> 是组件的路径,<mycomponent> 是组件的名称。

要注销组件,请键入下列命令:

<path>\<mycomponent> /unregserver

其中,<path> 是组件的路径,<mycomponent> 是组件的名称。

代码请到这里下载:

http://download.csdn.net/detail/shakesky/7166405

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页