com第六讲201708014:com设计用于脚本语言、ATL双接口工程生成com

一.兼容脚本语言的com的设计思想

脚本语言简单地说就是一条条的文字命令,可以用记事本打开查看、编辑,脚本程序在执行时,由系统将其一条条的翻译成机器可识别的指令,并按程序顺序执行。因为脚本在执行时多了一道翻译的过程,所以它比二进制程序执行效率要稍低一些。各种动态语言,如VBS、ASP、PHP、CGI、JSP等,都是脚本语言。
脚本语言的一大特点是它只能通过字符串给某编译器发指令并让编译器执行,却不能向其中添加代码,因此脚本语言是不用添加头文件的,既然如此,那么它该如何来使用com呢?有没有一种方式让编译器不用加头文件,就能调用函数呢?
在加载dll的时候,通过函数名称就能获得相应函数的函数指针,那么也可以用类似的方式来获得com中的函数指针,以及函数的参数(这个也是难点)。因为参数的个数和数据类型不同,所以是不定参,那可以用不定参吗?不行,因为不定参只是用于C调用约定。可以用变体做参数类型,再加上参数个数即可解决问题。

二.实现兼容脚本语言的com

1.变体

变体在学习C和C++的时候都学过,并且都是基于结构体或者说类和共用体来实现。共用体是指多个数据类型共用同一段内存,随用户指定具体类型。实现变体其实就是体力活,通过switch-case来考虑各种情形。C++中变体在C的基础上对运算符进行了重载,使用户少一个判别类型的过程,使用更方便,其中的一个强转数据类型的重载记载如下:
operator int (){return i;//相当于利用内存进行强转,是符//合平时强转习惯的}。

2.ADL实现兼容脚本语言的com

这是的操作,在原来用ADL生成com的基础上,就生成com属性由原来的自定义给为双接口即可,系统会默认为双接口。
ADL生成com时,将单线程非同步改成多线程同步的方法:1)重写ADL工程,2)将功能类的继承类中第一个的模板参数由CComSingleThreadModel改成CComMultiThreadModel即可,反之亦然。
ISuperMath : public IDispatch: public IUnknown
双接口主要是多了中间这个类,它继承自IUnknown,其中含有GetTypeInfoCount、GetTypeInfo、GetIDsOfNames、Invoke四个函数,用于完成通过字符串和变体及参数个数等来生成脚本语言可使用的com,主要使用GetIDsOfNames和Invoke两个函数。

三.在编译器语言和脚本语言中分别在不加头文件时使用com

1.C++中不加头文件时使用com

因为没加生成的头文件,因此不能使用用户自定义的接口类,而只能使用系统自带的接口类IDispatch,它的GUID是IID_IDispatch,系统自带。
在使用com组件的程序中都要用到CoInitialize(NULL)和CoUninitialize()函数,为了不手动添加,可以将二者写到某一个类的构造和析构中,再定义一个全局对象,这样以上两个函数就会在进入main函数之前和退出main函数之后分别调用,在MFC中使用也很合适。
API:CLSIDFromProgID(OLESTR(“CR26SuperMath.SuperMath.1”), &clsid)可通过注册表中ProgID获取相应的GUID,它里面也是查询获得,ProgID可在资源文件中查找。FAILED(hr)用于判别是否成功,OLESTR(“Add”)是定义宽字节字符串,其实就是加了“L”,#define OLESTR(str) L##str。调用GetIDsOfNames和Invoke的代码如下图(在下一页)。

2.在VBScript脚本语言中使用com

新建一个*.txt文件,改后缀为vbs,在其中添加代码如下:

Dim obj
Set obj = CreateObject("CR26SuperMath.SuperMath.1")
MsgBox "1+2=" & obj.Add(1, 2)

然后保存,运行即可。Vbs文件中的代码也可以加在VB编译器中使用,编译器作者将所有操作封装成了CreateObject类。相比C++中不加头文件时使用com,vbs中更方便,C++中使用com时加头文件更方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值