分享
 
 
 

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

王朝vc·作者佚名  2006-05-23
窄屏简体版  字體: |||超大  

连接 COM 与 .NET 的桥梁(一)

预备知识

作者:caeser2

本文代码使用ISO C++和.net v1.1框架(VS 2003)编写,但其原理适合所有支持.net框架的语言

一、前言

由于传统的COM技术使用静态的非托管编程,而.net使用动态的托管编程,所以这个题目本质上讨论的是托管与非托管代码之间的互操作中的一个特例。目前的 .net v2.0 提供以下

三种互操作:

模块级别的P/Invoke方法

这种操作方法适合调用在动态链接库 (DLL)(如 Win32 API 中的

DLL)中实现的非托管函数。将在下一节讨论;

组件级别的COM Interop方法

这是本文的重头戏,它分两个部分:

1、导出类型库的方法:本文的主角;

2、使用封装类的方法

:该方法为CLI C++所独有,由框架自动生成包装类(在COM客户端中为非托管头文件代码),原理同第三种互操作相同;

代码级别的C++ Interop方法

这种操作方法是 CLI C++ 所独有的,即只能用在VS 2005及以上版本中。其实现非常简单,对外部 DLL 的包装全部都由向导生成,不用写一行代码,所以本文不再描述。(另一个原因是我暂时没有条件使用 VS 2005 ^_^!)

二、类型转换与封送处理

既然是两个平台、两个世界之间的互操作,它们之间的信息传递就必须转换为对方能看懂的类型,这种转换叫做“Marshal”,或者叫做“封送”。数据的封送处理是个异常复杂的过程,感兴趣的读者可以在 MSDN 中搜索描述其原理的文档“Marshaling

Details”。下图是 COM Interop 的封送原理。

好在 .net 平台的 Interop 程序集机制可以帮助我们进行一些简单的数据封装工作,把复杂的 Marshal 细节给隐藏了。这样使得我们在 .net 客户端中调用 COM 服务器时传递一些简单的数据会非常方便,但如果传送的数据是自定义的,则仍需手动 Marshal。该机制的原理描述在 MSDN 中的“COM

包装”。

下图摘自 MSDN 2003 版,描述了.net v1.1 将把我们的数据从一个平台的类型转换为另一个平台的何种类型,表中没有没有显式标识的任何类型都将被转换为 Int32 系统类型。

嗯...看上去还真不少,不过别高兴的太早了,在实际的使用中只有如int等较为简单的类型才能保证各种灵活的传递方式而不出问题...@_*。需要注意的是,COM一方的VARIANT类型(这也是编写COM时的推荐类型)将按照其vt的值来转换为具体的类型并封装,所以COM一方设置vt时一定要设对了,别乱设!另外对于表中没有给出的具体类型,最好不要使用或作为自定义类型进行封装。

有关数据类型转换的详细介绍,请参见MSDN中的"COM 数据类型",自定义类型的描述文档是"自定义标准包装"。如果想让.net组件也像COM组件那样实现回调接口或者连接点,则需要托管接口与该接口的非托管实现之间的通信,这时需要自定义Marshal封送处理,实现这个功能的文档是"自定义封送处理"。

三、错误处理

.net客户端没有 HRESULT 类型,.net 服务器中定义方法函数时也可以没有返回值,那么如何处理错误呢?其实这个工作也由 .net 平台的封送机制帮我们做了。

1、COM 服务器-.net客户端

客户端直接用try()...catch()方式即可得到翻译过的HRESULT信息,系统定义的错误信息在 .net 类库中一般都有定义好的现成类,处理起来很方便。

2、.net服务器-COM客户端

客户端可以像通常那样 HRESULT hr=...; 的方式得到错误信息。

当服务器端不支持丰富错误信息接口 IErrorInfo 时,错误信息将按照下表所示进行双向的翻译。

当服务器端实现了丰富错误信息接口 IErrorInfo 时,错误信息将按照下表所示进行双向的翻译,由于表的内容太多,这里只列出其中的一部分。

这部分内容和上表在 MSDN 中的描述文档是“HRESULT” 和异常,有关.net的异常处理,参见 MSDN 文档“处理和引发异常”。

四、总结

第一篇主要介绍了一些概念,给大家一个思考问题的思路,具体细节没有进行详细讨论,而是给出MSDN中的位置,大家需要的可以去参考参考,建议使用至少MSDN2003以上版本的中文版(翻译的还不错^_^)。这些知识在实践中大多都被编译器隐藏起来了,所以作用并不大,了解一下即可。该篇没有示例代码,下一篇我们就要开始进行实战啦^_^

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有