使用COM#

---
创建日期: 2020-02-28
---
通过COM调用了imc数采软件库中的一些功能,获得的一些认识。

我一直都不清楚COM的架构是什么意思,以及后来 .NET 和 WinRT 相关的东西。 和其它知识一样,困惑一段时间,就也不在意了,反正平常也用不着。而过些年月,又再想起来。

对COM好奇的原因,可以在一个程序中复用另一个程序的组件,在有需要的时候可以进行二次开发或者自动化。 不过这也取决于程序本身的设计,像Office、MiniTab这种做得好的,就会特别好奇是怎么设计的。

多数情况下,说使用COM也只是先调用例如Excel.Application,就好像开了一个新的程序一样。 有时候也会想,是不是可以单独把某些部分拿出来使用。比如一些函数库工具,可以脱离应用程序使用。 看到引用列表里那么多注册的组件,是都能用吗?

常常看到说COM是有服务端和客户端的,那服务端是如何创建的呢?服务端会长期存在吗(现在看不是我理解的那种守护进程)?服务端会共享吗? 用Python如何编写服务端呢?如果被调用到,应该会启动Python的解释器吧?

在调用imc的时候,发现可以定义一些类型,却不能初始化以及后续使用它们。 这些类的成员函数像静态的,不知道为什么在类中(难道是命名空间),为什么要初始化,以及为什么不能初始化类(既然是个类)。

其后想来,有些类能直接初始化,比如打开一个应用程序,那就创建一个Application对象。 而有些对象需要在上下文中才能创建,比如一个轴不能脱离图表存在,那么这些对象的创建就在内部完成。 然而还是能够获得这些对象的,比如访问成员,并且进行相应的操作。 所以就能解释为什么有些类可以初始化,有些却只有定义。能否初始化应该是有相应的接口要实现。

其实也是自己对VBA的语法不熟悉,定义类型与初始化对象没有弄清楚。 定义类型并没有将其与对象链接,要么在定义的时候直接初始化,如dim o as new class。 要么在定义完后,将对象赋值给变量,如dim o as class; set o = new class;。 早年学习没注意,后来用的时候也就多是用set,很少自己创建对象。

感觉我还是没弄清楚VBA中“引用”和“COM”的关系,主要因为有些能用win32com.client.Dispatch,有些又不行(但是可以在VBA中使用)。 我很困惑,难道那只是VBA的库?那我要如何利用,或者从Python中访问? 我要如何才能知道COM的接口结构呢?除了官方提供帮助或者例子。VBE Object Library中的信息是一致的吗? (追注:可能是32/64位版本的问题 ╮(╯▽╰)╭)

看COM,至少组件是复用的。一个软件内部是不是各种COM组件信息传递飞来飞去?不知道。 可是到了 .NET 和 WinRT 怎么复用呢?完全是独立的应用啊,沙盒,像手机应用那样(当然也是因为我没有二次开发过)。 依赖性如何解决?或者只是把需要的组件都复制到自己的运行空间中(像node那样)?反正存储不值钱。 还是程序之间的沟通也越来越少了,除了微软官方的办公套件会频繁地被其它软件使用。

不过即使是有代码仓库(pip、gem、npm,WinRT可能也有,nuget?),代码复用也多是底层功能,很少调用界面的吧。 但有些情况不就是不想自己去解析,能复用就复用吧。嗯,还是主要在二次开发的时候。WinRT能这样使用吗? 还是说WinRT主要还是用在了内部的组件复用?(应该不会吧)

话说回来,如果是在同一个编程语言里,要组件复用,比如Python,那就可以直接import,反正都是基于Python的。 如果要其它的语言,或者平台(当然Python是跨平台的),就不能直接使用了,或许这就是COM解决的问题。

也常想过几年是不是又会又下一个平台,还真是乐此不疲,WinRT加入了应用商店的支持,这个该不是强制的吧?(我不喜欢必须依托什么的存在) 哪天 Ansys、Matlab 会加入到这种平台吗?还是win32永生?

咳,我关心这干啥,还是乖乖用Python。