COM

进入公司以来第一个正式的任务 - 把一个C/C++的设备操作程序(.H + LIB/DLL)改写成COM接口,供C#调用。

对于COM和ActiveX,我只是稍微有一点了解,所以一开始我想,用COM包装一下,然后把相关的数据转换一下给内部的接口就可以了。当然让C#直接调用C/C++的DLL也应该是可以的,但是既然说了先改成COM那就先动手学习下COM吧。

在看了一点教程之后我发现用VC6的ATL进行COM的快速开发还是比较简单的。COM的底层结构甚至都不用了解,那些必须的函数都已经被IDE创建好了,相关的链接IDE也考虑的面面俱到。

好了,开始改吧。

然后我发现,这个程序里面有很多自定义的结构体,这个也不是问题,把所有的结构体拆开传参数就可以了。

在我基本上写好了之后,我开始试图把他给的MFC的控制程序改成C#的。

这时候,问题来了。

原来结构体不止是为了向函数里传递参数,有些函数接收结构体指针,然后写入数据,用来向外部传递数据。

这下悲剧了。

我半天改的代码全都废掉了,这个是小事,关键是,这个思路,断掉了。

于是我在网上找了在COM中使用结构体的方法。

就是在 idl 中包含头文件,这时候需要注意,VC6的ATL项目中 struct 需要定义成

typedef struct

{}structName;

这样的形式才可以,不然结构体识别不出来。

然后虽然最后结构体可以使用了,但是在编译的时候又出现了问题:

头文件中定义的结构体全部报错:redefinition; different basic types

头文件中的函数声明也全部报错:redefinition; different type modifiers

我想是因为引入这个头文件之后,系统把里面的类型全部转换成了COM类型,而 Lib 中已经编译的函数还是原来的C类型。所以报错了。

不过由于我刚刚接触COM,不排除有其他的操作导致错误的可能,不过这个想法成立的话,那么这条思路肯定是不行的了。

现在的想法就是将结构体分开成两套,一套COM的,一套原来的,原来的就不动了,然后在COM接口中把输入的COM类型的结构体转换成C类型,然后调用C库,然后C库返回值再转换成COM类型传出。

未完待续。

原文地址:https://www.cnblogs.com/willin/p/2178898.html