COM调用成功,DCOM调用失败,请大虾指点迷津
小弟最近在学习COM,费九牛二虎之力知道了点老虎皮毛。昨天在做DCOM时又遇到拦路虎,请各位大虾帮忙。
工程类型Service (Exe)类型,我在其中加了一个接口IGetHost,为改接口添加了一个方法GetComputerName(BSTR* bs)。我用CoCreateInstance能调用成功,显示了"soft5"---我的计算机名,COM调用成功。用CreateInstanceEx调用则每次都不能成功创建实例(我已经注册了代理存根,在DCOMCNFG中设置了身份验证为“无”,设置了“在此计算机上运行”和“在以下计算机上运行192.168.0.5”),DCOM调用失败。
COM调用的代码省略了,以下是DCOM客户端调用的代码:
我在stdafx.h文件中定义了 _WIN32_DCOM
#define _WIN32_DCOM
COM服务器接口是这样的:
接口:IGetHost
方法:GetComputerName(BSTR* bs);//得到主机名称
调用DCOM的代码是这样的:
HRESULT hr;
hr=CoInitializeEx(NULL,COINIT_MULTITHREADED);
if(FAILED(hr))
{
MessageBox(_T("CoInitializeEx Failed"));
return ;
}
// hr=CoInitializeSecurity(NULL,- 1,NULL,NULL,RPC_C_AUTHN_LEVEL_NONE,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
COAUTHINFO info;
COSERVERINFO cs;
memset(&info,0,sizeof(info));
memset(&cs,0,sizeof(cs));
cs.dwReserved1=0;
cs.dwReserved2=0;
cs.pAuthInfo=&info;
cs.pwszName=LPWSTR("192.168.0.5");//远程计算机
MULTI_QI qi[1];
memset(&(qi[0]),0,sizeof(qi[0]));
qi[0].pIID=&IID_IGetHost;
CoCreateInstanceEx(CLSID_GetHost,NULL,CLSCTX_SERVER,&cs,1,qi);
hr=qi[0].hr;
if(FAILED(hr))
{
MessageBox(_T("CoCreateInstanceEx Failed"));//每次都执行到这里,也就是失败了
CoUninitialize();
return ;
}
IGetHost *pI=NULL;
pI=(IGetHost*)qi[0].pItf;
BSTR bs;
hr=pI->GetComputerName(&bs);
if(FAILED(hr))
{
pI->Release();
CoUninitialize();
return;
}
_bstr_t str(bs);
MessageBox((LPCTSTR)str);
pI->Release();
CoUninitialize();
return;
另外,那位大虾有时间发给小弟一个简单的DCOM程序供小弟学习之用,不胜感激!邮箱:entaoyang@163.com
问题点数:100、回复次数:14Top
1 楼nelsonc(软件兔)回复于 2005-04-12 17:36:10 得分 10
两台电脑在同一个域(domain)或信任的域里才会成功,具体原因不清楚。Top
2 楼sinall()回复于 2005-04-12 18:02:06 得分 20
^_^,前两天刚化大力气搞定了DCOM配置。
收集资料如下:
http://community.csdn.net/Expert/topic/3659/3659650.xml?temp=.5582392
http://www.livejournal.com/users/hanson2010/103257.html
http://program.tommsoft.com/bbs/reannounce.asp?boardid=3&rootid=15709&id=15710&reply=true
http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=1156
http://www.cnblogs.com/77543/archive/2005/01/12/90915.html
http://www.sou3w.com/database13/database225554.htm
http://community.csdn.net/Expert/topic/3659/3659650.xml?temp=.5582392
此外,把错误返回的值到MSDN里查查,到底是什么问题引起的。Top
3 楼ExtUSA(兵者)回复于 2005-04-12 18:52:10 得分 0
还学dcom啊,早被淘汰的技术了呀Top
4 楼entaoyang(entaoyang)回复于 2005-04-13 12:22:20 得分 0
我手里的项目需要一个管理磁盘阵列的服务器程序,该程序要读取未经过格式化的含有MPEG1格式的磁盘(我用系统API函数CreateFile来读取的),每一个磁盘阵列服务器有12个磁盘,共有4个服务器。每一个客户端都被要求能读取任意一个服务器的任意盘上的信息。因此我想写个NT下的服务组件来解决,想到了DCOM。---用SOCKET很费劲的,Java我不熟悉,不知道java是否能完成类似的功能。Top
5 楼adamx(爱吃苹果的小草莓)回复于 2005-04-13 13:47:46 得分 20
http://www.codeproject.com/com/clientserverwithdcom.asp
这个因该对你有帮助。Top
6 楼alaisalaix(天上人间)回复于 2005-04-13 14:00:14 得分 20
谁说DCOM要被淘汰了,当前的技术发展眼花缭乱,不要被冲昏了头。今天出了个.net框架,立马就转向.net,明天出了个G#,又改用G#。对于我们从事技术工作的IT人来说,没有什么过时的技术。我现在回过头还在搞8086和80386保护模式编程呢。COM/DCOM是windows的核心,如果掌握好了,对于你理解操作系统业务流程非常有帮助的。.net框架其实还是搭建在windows的COM/DCOM之上的,他现在摆脱不了COM/DCOM,除非出新的操作系统;COM是一种中间件技术,采用了CORBAR中的很多思想,很值得学习。这并不是说我们不要去学习最新的技术,而是在学习新技术的同时,要知道为什么会有这种技术出现,他跟以前技术之间的关系以及它们之间的过渡等等。说得太多了,脱离了搂主的话题,只是想借此批判那些过于浮躁的人。Top
7 楼alaisalaix(天上人间)回复于 2005-04-13 14:05:33 得分 10
关于com的讨论,我建了一个群9461821,欢迎加入Top
8 楼a123a123()回复于 2005-04-13 14:12:07 得分 0
高 薪 诚 聘 V C + + 精 英
软 媒 ( 深 圳 ) 成 立 于 二 零 零 二 年 五 月 。由 新 加 坡 私人 投 资 基 金 注 资 。
软 媒 的 业 务 ,专 注 于 软 件 的“现 场 开 发 工 具”,持 续 的 挖 掘 用 户 使 用 软 件 的 核 心 利 益 。
软 媒 堪 称 深 圳 第 一 大 软 件 军 团,集 结 了 一 大 批 专 兼 职V C + + 软 件 业 界 精 英 。
软 媒 对 于 核 心 技 术 人 员 ,采 取 “ 四 高 ” 的 管 理 政 策 。
( 一 ) 高 薪
“ 永 远 让 薪 水 跑 在 能 力 前 面 ” 是 软 媒 的 座 右 铭 。
( 二 ) 高 技 术
软 媒 公 司 内 部 针 工 具 型 软 件 研 发 ,形 成 自 主 产 权 的 系列 软 件 架 构 。
( 三 ) 高 手 军 团
软 媒 的 每 个 高 级 工 程 师 , 都 是 身 手 不 凡 的 业 界 精 英 , 形 成 了 浓 厚 的 高 科 技 氛 围 。
( 四 ) 高 素 质 用 户 群
“ 一 个 软 件 离 开 了 它 的 用 户 就 是 垃 圾” 并 不 过 分 ,软 媒 提 供 了 7 * 2 4 小 时 的 在 线 用 户 群 引 导 软 件 的 需 求 。
产 品 介 绍
< 系 列 软 件 研 发 工 具 >
让 九 亿 农 民 兄 弟 都 能 开 发 出 自 己 喜 爱 的 软 件 。
提 示 : 凡 符 合 本 职 位 要 求 者 , 可 以 直 接 来 面 试 无 须 投 放 简 历 。
要 求 : 精 通 标 准 C \ C + + 结 构 化 程 序 设 计 。
1 、 要 求 有 V C + + 软 件 开 发 经 验 。
2 、 精 通 W i n d o w s 界 面 开 发 , 熟 练 使 用 C D C 绘 图 类 。
3 、 具 有 良 好 的 独 立 开 发 能 力 和 自 主 开 发 能 力 。
4 、 有 工 具 型 软 件 开 发 经 验 者 优 先 。
工 作 职 责 :
1 、 开 发 工 具 软 件 及 其 构 件 。
2 、 独 立 自 主 设 计 工 具 使 用 流 程 。
3 、 一 切 设 计 都 基 于 用 户 需 求 。
4 、 不 需 要 团 队 开 发 经 验 。
5 、 要 求 有 良 好 的 用 户 需 求 实 现 能 力 。
基 本 工 资 :
1 、 高 级 软 件 工 程 师 : 9 , 0 0 0 元 / 月
联 系 方 式 : R i c h m a i n @ d u o s o f t . c n
http://www.jobsdb.com.cn/main/jobseeker/JobTemplates/Default/CN/JobDetail.asp?CompanyID=109434&JobPostID=3178881&FromFlag=&Language=CN&Page=1 & T e m p l a t e I D = D e f a u l t
Top
9 楼leonheartlee(Leon)回复于 2005-04-14 05:09:17 得分 0
我也遇到和楼主一样的问题
非常的不解 在本机上就使用正常
只要在不同的计算机上就会无法连接
防火墙都已经关掉
而且所有的设置都按照资料上给的去做了
郁闷阿Top
10 楼leonheartlee(Leon)回复于 2005-04-14 05:19:14 得分 0
还有阿 建立DCOM程序的时候,类型EXE可执行文件和SERVICE有什么区别阿?
能不能请哪位高手讲一下Top
11 楼ExtUSA(兵者)回复于 2005-04-14 09:59:22 得分 0
你的服务器是跑都是的都是Windows 2000吗?
Top
12 楼entaoyang(entaoyang)回复于 2005-04-14 18:35:45 得分 0
我的服务器是Win2003ServerTop
13 楼sursure(答案)回复于 2005-04-14 22:28:40 得分 0
支持一下~~~Top
14 楼adamx(爱吃苹果的小草莓)回复于 2005-04-15 09:52:44 得分 20
void CServiceModule::Run()
{
_Module.dwThreadID = GetCurrentThreadId();
//This means that calls come in on a random RPC thread
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
// This provides a NULL DACL which will allow access to everyone.
hr = CoInitializeSecurity( 0, -1, 0, 0,
RPC_C_AUTHN_LEVEL_NONE,
RPC_C_IMP_LEVEL_IDENTIFY, 0, 0, 0 );
hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER |
CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE);
Top




