连接COM与.NET的桥梁(3)COM服务器的COM Interop方式

本节部分内容要求读者熟悉COM的消息调用原理,原理请参见杨老师的专栏文章。

前文内容:

COM 服务器 --> COM 客户端

...

COM 服务器 --> .net客户端

1、P/Invoke

2、COM Interop(本节内容)

上回介绍了COM服务器端未知或没有接口时的调用方法P/Invoke,这回我们来探讨一下已知接口的情况,COM Interop 方式。

一、普通的接口函数调用

这部分的示例代码叫做ComP6srcDNet中的ComP5工程,呵呵,有点眼熟吧,其实我的目的只是想介绍.net部分,所以COM和MFC部分引自杨老师的“COM 组件设计与应用(七)——编译、注册、调用” ,只有Use_Net的代码是我写的,我在这里多谢杨老师啦,没有您前面栽的树,咱也没法乘凉哈^_^

虽然.net本身就是COM凤凰涅磐后的产物,从很多.net结构的工作原理中都能看到 COM 的影子,但是从.net的COM调用中可以很明显的看出,.net在淡化(隐藏)接口的作用,这一点从下面的代码中可以看到。

对于COM服务器的调用,需要先做以下三个操作:

1>用regsvr32.exe注册COM。

2>用Tlbimp.exe导出类型库。被导出文件可以是dll文件,也可以是tlb文件;导出后生成的文件默认命名为原COM名称后加Lib。

3>"添加引用",详见下

然后就可以写调用代码了。

/*Simple2是杨老师写的COM服务器,带有Add(int,int)和Cat(BSTR,BSTR)两个函数
Use1、2、3、4、5是杨老师写的8种COM调用方法....不是我不会数数哦,不信你自己去看代码
Use_Net是我写的.net调用
在"解决方案"面版中选择"引用"项,鼠标右键"添加引用",将Tlbimp.exe生成的类型库文件添加进程序集。结果如图

也可以用[DllImport(...)]方法引用COM
*/
//写个引用,方便使用
using namespace Simple2Lib;
FunClass *m_pCom;  //FunClass有点像MFC中包装过的智能指针xxxPtr
//初始化
try
{
m_pCom=new FunClass;  //.net框架自动连接到COM服务器,不用我们动手^_^
}
catch(...)
{
MessageBox::Show("COM没有注册吧?");
Close();
}
//计算 or 连接。呵呵,这么写还真够简单的,两句话搞定,.net的异常机制会帮我们判断用户是想做加法,还是想做字符串连接
try
{
textBox3->Text=m_pCom->Add(
Convert::ToInt32(textBox1->Text),Convert::ToInt32(textBox2->Text)).ToString();
}
catch(...)
{
textBox3->Text=m_pCom->Cat(textBox1->Text,textBox2->Text);
}

这就完啦,是不是很容易呢?熟悉COM调用的读者可以发现,其中许多COM初始化及查找接口的工作都被.net隐藏了,一些常用的参数Marshal转换封送操作也自动处理了,这使得我们用.net客户端调用COM服务器比COM客户端调用COM服务器还要容易。

时间: 2024-10-27 10:53:02

连接COM与.NET的桥梁(3)COM服务器的COM Interop方式的相关文章

连接COM与.NET的桥梁(2)COM服务器的P/Invoke方式

一.COM 服务器 --> COM 客户端 这是传统的 COM 知识,如果对这部分内容不清楚,可以去看 杨老师 的个人专栏,那里有非常棒的教程,我就不在这里废话了^_^ 我不细说可并不代表这部分不重要,恰恰相反,如果读者对这部分很熟悉,就会发现后面所有的内容在形式上几乎都是模仿传统的COM调用. 二.COM 服务器 --> .net 客户端 嗯,这才是重点.下图是这部分的原理.每个COM对象都会有且只有一个运行库可调用包装(RCW)代理,而不管它有多少个引用. 在没有公开接口(或者根本就没有)

vpn 单向ping通-vpn连接好后,客户端可以ping通服务器,服务器无法ping通客户端。

问题描述 vpn连接好后,客户端可以ping通服务器,服务器无法ping通客户端. 下载的openvpn软件,连接校内机房局域网内的两台机器,vpn显示连接成功,可是客户端可以ping通服务器,服务器无法ping通客户端. 但是用机房自带的局域网172.29.137.*可以互相ping通,用vpn分配的ip无法互相ping通,服务器的ip是10.0.0.1,客户端的是10.0.0.10. 另一个问题是,客户端的ip好像是服务器随机分配的,我是申请了2个客户端,但是我试过几次,除了第一次外,服务器

我做了一个消息推送系统,客户端与服务器建立长连接,但是由于客户端越来越多,服务器怎样做集群呢

问题描述 我做了一个消息推送系统,客户端与服务器建立长连接,但是由于客户端越来越多,服务器怎样做集群呢 我做了一个消息推送系统,客户端与服务器建立长连接,但是由于客户端越来越多,服务器怎样做集群呢 解决方案 这个有很多方案.首先你要说你用的是什么语言做的消息推送系统. 例如Java,还是C++,还是其他的. 另外 把连接接入与业务处理分开,那么做分布式自然很简单.内部可以使用 RPC进行通信.等级每个用户的实时地址. 解决方案二: 用java语言做的,使用的androidpn

NAS网关连接NAS与SAN的桥梁

  由于费用低廉以及部署便捷等好处,NAS设备受到IT经理的青睐,迅速在企业中得到广泛的应用.但是这种灵活性是要付出代价的:出现的存储孤岛越多,存储管理任务就变得越复杂.因此,许多公司部署了存储区域网来整合存储环境. NAS网关通过将IP网络连接到基于光纤通道的存储上,架起一座连接NAS与SAN世界的桥梁.这种高度优化的文件服务器帮助企业更好地保护了存储投资. NAS网关不仅提供了一种高性价比的整合方法,而且降低了向SAN基础设施添加新NAS应用的费用. 部署连接SAN存储的NAS网关使管理人员

关键字是连接网站—搜索引擎—用户的桥梁

大家好!我们又见面了,波小斯在上一篇<如何提高网站搜索引擎排名秘笈之内功心法第一篇--网站的内涵>中和大家分享了如何从1)站内内容质量.2)网站访问速度.3)网站深度.4)网站分类组织结构.5)网站辅助阅读系统.6)网站合理布局及细节把握.7)广告干扰程度,七大方面来建设对用户更加友好.更加利于搜索引擎收录的好网站.这是我们需要在内部建设方面做得第一件大事,下一步我们应该考虑如何让更多需要我们网站服务或者产品的用户发现我们.毋庸置疑,关键字是我们开启"通过搜索引擎桥链用户"

连接COM与.NET的桥梁(1)预备知识

本文代码使用ISO C++和.net v1.1框架(VS 2003)编写,但其原理适合所有支持.net框架的语言 一.前言 由于传统的COM技术使用静态的非托管编程,而.net使用动态的托管编程,所以这个题目本质上讨论的是托管与非托管代码之间的互操作中的一个特例.目前的 .net v2.0 提供以下 三种互操作: 模块级别的P/Invoke方法 这种操作方法适合调用在动态链接库 (DLL)(如 Win32 API 中的 DLL)中实现的非托管函数.将在下一节讨论: 组件级别的COM Intero

云通信—连接产品与用户的桥梁

本文整理自2017云栖大会-成都峰会上云通信产品专家断木的分享讲义.讲义主要分享了用户运营对产品的重要性,运营过程中可能遇到的问题,以及云通信对这些问题的解决方法.

使用 Java 连接处于proxy(or 防火墙)之外的HTTP服务器

防火墙|服务器 我到sun站点上,发现他们的java Applet聊天室能够突破proxy,我在公司的局域网可以使用的,而一般的java程序是不能够的.大家可以去分析一下他们的程序 本技巧将向您讲述如何编写可通过代理访问因特网上的 Web 服务器的 Java 应用程序.在 Java 应用程序中加入代理支持只需额外编写几行代码,且不依赖任何安全性"漏洞". 几乎所有的公司都十分关注保护自己的内部网络,以防黑客及入窃者.一种常见的安全措施是完全断开与因特网的连接.如果黑客们不能连接到您的任

vb6.0与sae服务器连接-VB6.0与新浪云sae服务器连接

问题描述 VB6.0与新浪云sae服务器连接 我们在新浪云sae上面建立了数据库.我想本地用vb6.0读取数据库上面的文本文件,然后本地计算,计算完毕后将结果上传到新浪云sae服务器上. 解决方案 就是调用API就行,socket或者wininet