本节部分内容要求读者熟悉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服务器还要容易。