请教远程COM与本地COM的区别,如何创建和布署一个远程COM?

dragon_zqw 2003-11-13 12:04:06
请教远程COM与本地COM的区别,如何创建和布署一个远程COM?
...全文
85 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dragon_zqw 2003-11-19
  • 打赏
  • 举报
回复
问题总于解决了,在远程调用时,必须要通过代理桩子DLL,才不致于在传递参数时出现问题。
lop5712 2003-11-17
  • 打赏
  • 举报
回复
楼主的代理占位程序出错,请确保在idl文件中使用如下的类似声明

HRESULT Log2( [in, string] WCHAR funcname,
[in] param_count,
[in, size_is( param_count )] VARIANT *param );
当要传递字符串时,指明[string]属性,且必须使用UNICODE编码,即使用WCHAR,而不要使用unsigned char

如果上面无效,需要根据程序具体确定
dragon_zqw 2003-11-17
  • 打赏
  • 举报
回复
to lop5712(LOP):
  
  周末我查了资料,应该用你说的方法可以解决,但由于DCOM的配置要繁琐一些,我将我的COM组件配置成到COM+应用程序,现在已经远程连接成功,但是又出现问题,如下:
组件中有
STDMETHODIMP CLog::Log2(unsigned char *funcname, int param_count, VARIANT *param)
 一个接口,后两个参数想实现一个变长数组,在本机调用正确,但在远程调用时,组件中funcname只能接收到字符串中的第一个字符,后面的就没有了,而param的类型一直为VT_EMPTY,不知何故。


  本人水平尚浅,比如接口函数中的参数用const修饰,传递一个容器等,在COM中都好像都不能实现,不知能够与否,希望对COM熟悉的朋友能够帮我解释一下。
lop5712 2003-11-17
  • 打赏
  • 举报
回复
哈哈,真是抱歉,竟然写成WCHAR,字符串再怎么也都得是个指针啊,请改成WCHAR *funcname
dragon_zqw 2003-11-17
  • 打赏
  • 举报
回复

师兄在COM方面应该造诣很深了,还望多多指点。

我看的COM原理及应用一书中没有这些方面的讲解啊,是不是还得在ATL的书籍中查找相关知识,我还需要看哪些方面的书呢?
dragon_zqw 2003-11-17
  • 打赏
  • 举报
回复

师兄在COM方面应该造诣很深了,还望多多指点。

我看的COM原理及应用一书中没有这些方面的讲解啊,是不是还得在ATL的书籍中查找相关知识,我还需要看哪些方面的书呢?
dragon_zqw 2003-11-17
  • 打赏
  • 举报
回复
太感谢了,但是我在用你说的方法,出现下面的错误提示:

error MIDL2072 : inapplicable attribute : [string] [ Type 'wchar_t' ( Parameter 'funcname' ) ]

不知该怎么办?
dragon_zqw 2003-11-16
  • 打赏
  • 举报
回复

非常感谢!明天去测试一下,到时到付帐哈!
lop5712 2003-11-16
  • 打赏
  • 举报
回复
想必楼主使用CoCreateInstance来创建实例的,而不是使用CoCreateInstanceEx,即没有在程序中硬编码远程服务器地址,而使用注册表项来指定。

如果如上,请确保CoCreateInstance传递的是CLSCTX_REMOTE_SERVER或包含了CLSCTX_REMOTE_SERVER(可能有误,记不到了)的参数,如:CLSCTX_SERVER。
请确保注册表中<服务器的CLSID>注册表项下没有LocalServer32注册项,估计楼主使用CLSCTX_SERVER标志,此标志会先查看注册表项下有没有InProcServer32,再看有没有LocalServer32,最后才会查看<服务器的AppID>下有没有RemoteServer(也就是楼主用dcomcnfg.exe配置的远程计算机地址)。
所以请查看下<服务器的CLSID>注册表项下有没有LocalServer32注册表项,而它所指的EXE可能已经不在客户机上的相应位置,导致创建失败。
dragon_zqw 2003-11-14
  • 打赏
  • 举报
回复
我正在看<COM原理及应用>中的分布式DCOM,写了一个测试COM,但客户程序不能创建实例,客户机器安装XP,操作如下:
1)用ATL COM向导中选第3项生成一个SERVICE[EXE],实现一个接口和一个HELLO()。
2)将该COM组件安装到了局域网中一台WIN2000的机器,在客户程序机器的DCOMCNFG.EXE程序中对该组件进行了下列设置:
常规:身份验证级别为:连接
   应用程序类型显示为本地服务器
位置:选中“在以下计算机上运行程序”,并填入了安装COM组件的机器名
安全性:均使用默认值
终结点:“...默认系统协..."
标识:选中“下列用户”,并填入了本机登录的用户名和密码。

安装COM组件机器中组件的配置如下:

常规:身份验证级别为:连接
   应用程序类型显示为本地服务器(不知这是否正确)
位置:选中“在此计算机上运行程序”
安全性:均使用默认值
终结点:“...默认系统协..."
标识:选中“下列用户”,并填入了客户程序机器登录的用户名和密码。(两台机器的标识设置一样)

fangyan2003 2003-11-14
  • 打赏
  • 举报
回复
本地COM分为两种,一种是进程内组件即服务器组件与客户进程在同一进程空间,也就是进程内的通讯,这样通讯速度比较快,但是程序不稳定,另一种是进程外组件即客户程序与服务器组件在同一台机器上的不同进程空间,也就是客户程序与组件在不同的进程空间中,通讯方式为本地过程调用(LPC),涉及到进程间的通讯,程序运行比进程内组件稳定,但是,速度较慢
远程COM是指服务器程序与客户程序运行在不同的机器上,两者依靠远程过程调用(RPC)进行跨机器通讯,这样设计到网络,安全处理,伸缩性等一系列问题,远程COM就是DCOM,现在是COM+
不过好像Microsoft放弃了COM技术,取而代之的是.NET组件,Webservice
luohualiushui 2003-11-14
  • 打赏
  • 举报
回复
楼主应该先看看书,你的问题涉及列集、散集,dcom配置等等,不是三言两语能说清楚的
客户调用远程com应该和调用本地服务一样,这就是位置透明性
ablefirst 2003-11-14
  • 打赏
  • 举报
回复
帮你UP,
关注!
dragon_zqw 2003-11-14
  • 打赏
  • 举报
回复
ATL向导中如何生成一个远程COM,以及如何在客户端程序中调用该远程COM呢?
dragon_zqw 2003-11-14
  • 打赏
  • 举报
回复
麻烦顶一下啊!
dragon_zqw 2003-11-14
  • 打赏
  • 举报
回复
请COM高手指点
jEditor 2003-11-13
  • 打赏
  • 举报
回复
远程COM是一个分布式的COM,提供有网络连接功能.

3,245

社区成员

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

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