有关64位进程调用32位进程外组件(com)的问题!急!

架构师的人生旅途 2011-04-22 07:13:02
各位大侠,
我有这样一个问题,
我在windows7 64位系统上创建了一个进程外的com,由于我必须调用的一个底层lib是32位的,64位程序无法调用,所以我不得不将其进行com封装,但是com必须做成32位的,做com时我将idl设置中target environment设为x64,然后进行idl编译,同时代理存根文件做的是64位编译。完事后我用我的64位程序调用这个com,但是在com初始化时,老是返回E_NOINTERFACE,请给我有过相同经验的朋友,给解决一下,或者是有个替代方案也行。下面是我的idl接口定义,这是个测试程序:
[
object,
uuid(695A5649-E6B1-4226-A648-5B698A4F2893),
pointer_default(unique)
]
interface ICoMyCom : IUnknown{
[] HRESULT GetData([out] BSTR* Val);
};

测试程序如下:
int _tmain(int argc, _TCHAR* argv[])
{
CoInitializeEx(NULL, COINIT_MULTITHREADED);
CComPtr<ICoMyCom> P;
HRESULT hr = P.CoCreateInstance(__uuidof(CoMyCom));
if (SUCCEEDED(hr))
{
BSTR val;
P->GetData(&val);

MessageBox(NULL, val, NULL, MB_OK);
P.Release();
}
return 0;;
}
...全文
1576 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanguixing 2011-12-29
  • 打赏
  • 举报
回复
支持8楼!
lxl843 2011-12-28
  • 打赏
  • 举报
回复
1、创建的进程外服务器是用MFC下的还是使用ATL创建?
使用ATL创建
2、这里的“内部链接dll”是什么意思?怎么样连接呢?
把DLL编译成lib静态库调用
3、注册完COM服务器,是不是就可以在64位下直接调用32的dll而不用调用COM服务器的相关接口呢?
64位程序不能直接调用32位dll
123_321_1234567 2011-12-27
  • 打赏
  • 举报
回复
支持8楼!
wxcllb20100 2011-12-27
  • 打赏
  • 举报
回复
您好!我最近也在在64bit调用32bitdll的问题
在博客园上看到一篇文章:
64位进程调用32位dll的解决方法
http://www.cnblogs.com/mazhenyu/archive/2007/06/28/798710.html
验证:
工作流程:
1.创建一个进程外COM服务器(EXE)。
2.将32位dll的接口函数封装为COM服务器的相关接口。
3.注册COM服务器*.exe /regserver (注销 *.exe /unregserver)。
4.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位环境下方法调用是否正确,经验证正确!!!

本人有三个问题:
1、创建的进程外服务器是用MFC下的还是使用ATL创建?
2、这里的“内部链接dll”是什么意思?怎么样连接呢?
3、注册完COM服务器,是不是就可以在64位下直接调用32的dll而不用调用COM服务器的相关接口呢?感谢大家的指教和浏览!!!如果您能够实现上面的具体步骤麻烦我我说一声哈,我的QQ:542739787,Email:wxcllb@163.com,不甚感激!
wxcllb20100 2011-12-27
  • 打赏
  • 举报
回复
您好!我最近也在在64bit调用32bitdll的问题
在博客园上看到一篇文章:
64位进程调用32位dll的解决方法
http://www.cnblogs.com/mazhenyu/archive/2007/06/28/798710.html
验证:
工作流程:
1.创建一个进程外COM服务器(EXE)。
2.将32位dll的接口函数封装为COM服务器的相关接口。
3.注册COM服务器*.exe /regserver (注销 *.exe /unregserver)。
4.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位环境下方法调用是否正确,经验证正确!!!

本人有三个问题:
1、创建的进程外服务器是用MFC下的还是使用ATL创建?
2、这里的“内部链接dll”是什么意思?怎么样连接呢?
3、注册完COM服务器,是不是就可以在64位下直接调用32的dll而不用调用COM服务器的相关接口呢?感谢大家的指教和浏览!!!如果您能够实现上面的具体步骤麻烦我我说一声哈,我的QQ:542739787,Email:wxcllb@163.com,不甚感激!
wxcllb20100 2011-12-27
  • 打赏
  • 举报
回复
您好!我最近也在在64bit调用32bitdll的问题
在博客园上看到一篇文章:
64位进程调用32位dll的解决方法
http://www.cnblogs.com/mazhenyu/archive/2007/06/28/798710.html
验证:
工作流程:
1.创建一个进程外COM服务器(EXE)。
2.将32位dll的接口函数封装为COM服务器的相关接口。
3.注册COM服务器*.exe /regserver (注销 *.exe /unregserver)。
4.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位环境下方法调用是否正确,经验证正确!!!

本人有三个问题:
1、创建的进程外服务器是用MFC下的还是使用ATL创建?
2、这里的“内部链接dll”是什么意思?怎么样连接呢?
3、注册完COM服务器,是不是就可以在64位下直接调用32的dll而不用调用COM服务器的相关接口呢?感谢大家的指教和浏览!!!如果您能够实现上面的具体步骤麻烦我我说一声哈,我的QQ:542739787,Email:wxcllb@163.com,不甚感激!
broo 2011-11-30
  • 打赏
  • 举报
回复
32位的com要做成进程外的,而不是进程内的。这样才能被64位的应用程序或者64位com调用。
不知道对不?
tanghyes 2011-11-23
  • 打赏
  • 举报
回复
64位应用程序调用32位进程外组件 微软支持继承自IDispatch的接口
hztj2005 2011-04-23
  • 打赏
  • 举报
回复
我没有做过com,我在64位下调用32位的DLL,不能用。
不得已,只好让32位在后台运行,然后与之交换数据。
gw_net 2011-04-23
  • 打赏
  • 举报
回复
IDL也用32bit编译,我做过可以的,你有什么具体问题再问我把
客户端
The 64 bit COM objects use HKEY_CLASSES_ROOT\CLSID
The 32 bit COM objects use HKEY_CLASSES_ROOT\Wow6432Node\CLSID
  • 打赏
  • 举报
回复
但是接口查询总是返回E_NOINTERFACE错误
oyljerry 2011-04-22
  • 打赏
  • 举报
回复
既然是32位的,那么com跟代理等都做成32位版本,而且进程外组件可以在64位上直接运行。

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧