前提条件

  1、掌握C++基础语法

  2、平台安装 vs2019

  3、本地平台为 windows 10 1909 X64

  4、了解vbs基础语法

本次目标

  1、掌握Com组件的概念及原理

  2、编写一个简单的以DLL形式展现的Com组件

  3、通过 VBS 实现跨语言调用COM

1、Com组件概念及原理

  什么是COM:

    引用百度百科:COM component(COM组件)是微软公司为了计算机工业软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。

    (个人理解:com组件就是一种标准,遵循此标准开发出来的组件则为COM组件,同样任何语言只要遵循此标准,就可以调用该组件。而com组件本质上就是二进制可执行文件,com以 DLL 或 EXE 形式发布的)

  什么是ATL:

    引用百度百科:ATL是ActiveX Template Library 的缩写,它是一套C++模板库。使用ATL能够快速地开发出高效、简洁的代码(Effective and Slim code),同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。为了方便使用,从MicrosoftVisual C++5.0版本开始,Microsoft把ATL集成到Visual C++开发环境中。1998年9月推出的Visual Studio 6.0 集成了ATL 3.0版本。ATL已经成为Microsoft标准开发工具中的一个重要成员,日益受到C++开发人员的重视。

    (个人理解:ATL 就是微软发布的一个C++模板目的是为了简化COM编程)

  什么是ActiveX:

    引用百度百科:ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在有目录和其它支持的网络中,COM变成了分布式COM(DCOM)。ActiveX 控件是用于互联网的很小的程序,有时称为插件程序它们会允许播放动画,或帮助执行任务,如在 Microsoft Update 安装安全更新,因此可以增强您的浏览体验。  在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(Windows,Mac,Linux)中任意运行的程序。这个组件就是ActiveX控件。ActiveX是Microsoft为抗衡Sun Microsystems的JAVA技术而提出的,此控件的功能和java applet功能类似。

    (个人理解:ActiveX就是Com组件集合的名字,并且主要用在web方面,本质上就是COM)这里引用 360百科 的词条 [ 大白话容易理解 ]

2、编写一个简单的Com组件

  VS2019 新建基于ATL模板的项目 下一步

  

  设置项目名 (注意:项目名一定要记住) 然后创建

   

  设置ATL项目属性 (这里设置基于.dll 方式)

  

  这里说一下“支持组件注册”指的是 编译结束后会自动进行组件注册

  选择后点击确定,并等待创建完成

  

  完成后会出现ComTest和ComTestPs,不用管*PS

  

  

  我们点开ComTest并且可以看到系统自动生成的头文件和源文件

   

  右键ComTest 新建项->添加->新建项

  

  对 ComTest 新建 “ATL简单对象”并点击添加

  

  

  设置短名称为Temp 其他的会自动填充 

  ProgID 设置为 项目名+“.”+短名称 (ComTest.Temp )

  文件类型以及其他默认就好点击完成

  这里需要注意两个值

  ProgID 是之后 vbs 及其他语言 调用组件所需要提供的名称

  接口 ITemp 为之后配置 idl 所需要找到的接口名

  

  完成后会在ComTest 下添加 Temp.h 以及 Temp.cpp

  

  现在就可以创建我们自己的方法

  Temp.h头文件中给CTemp添加声明

  

  在 Temp.cpp 文件中实现此方法

  

   值得一提的是

  __result 必须为指针用来进行返回

  return 默认为 S_OK表示执行成功 

  

  定义好方法后打开 ComTest.idl

  还记得我们在创建ATL简单对象时候设置的“短名称”吗 (ITemp 自动命名规则为 I+短名称)

  找到这一段 interface ITemp : IDispatch

  

  在interface ITemp : IDispatch 里面写入

  

  [in]  表示 输入 [out] 表示输出 [retval] 表示作为返回值给外界

  值得一提的是 retval 必须只能有一个 而且必须跟在out 后面

 

以上就写好了ComTest组件的全部内容

  选择生成的位数 x64并 Ctrl + b 生成 dll

  

  

  报错 不用管他 打开我们的项目目录

  

  可以看到第一个为生成的ComTest.dll 接下来 注册Com组件

  这里注意两个文件

  ComTest.dll 为Com组件

  ComTest.tlb 为 C++ 调用Com所需要包含的文件

  

  管理员权限打开 cmd 或者 powershell  

  并进入到dll存在的目录

  输入命令注册我们的DLL 

  

  注册成功

  

3、通过 VBS 实现跨语言调用COM

  

  编写vbs代码  ComTest.Temp为ATL简单对象设置的ProgID而Number为类中的方法

  

  保存并运行 执行成功

  

注意事项:

  vbs调用的com必须为IDispatch 接口

  vs2019 ATL 默认为 继承 IDispatch 接口

  Com组件必须注册后VBS才可以调用

  

  

  

vs2019 Com组件初探-简单的COM编写以及实现跨语言调用的更多相关文章

  1. vs2019 Com组件初探-通过IDispatch接口调用Com

    vs2019 Com组件初探-简单的COM编写以及实现跨语言调用 上一篇实现了如何编写基于IDipatch接口的COM以及vbs如何调用编写的COM 本次主要是实现VBS的CreateObject函数 ...

  2. Thrift 简单实现C#通讯服务程序 (跨语言 MicroServices)

    Thrift是一种可伸缩的跨语言服务框架,它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与C++,C#,Java,Python和PHP和Ruby结合.thrift允许你定义一个 ...

  3. 在VS2015中用C++编写可被其它语言调用的动态库DLL

    转自:http://blog.csdn.net/songyi160/article/details/50754705 VS2015用C++创建动态库DLL步骤如下: (1)启动VS2015>文件 ...

  4. 转:ECharts图表组件之简单关系图:如何轻松实现另类站点地图且扩展节点属性实现点击节点页面跳转

    站点地图不外乎就是罗列一个网站的层次结构,提炼地讲就是一个关系结构图.那么我们如何巧用ECharts图表组件内的简单关系结构图来实现一个站点的地图结构呢?另外如何点击某个节点的时候实现页面跳转呢? 针 ...

  5. react-native-pg-style使用方法(以最简单的方式编写样式代码,抛弃react-native标准的样式创建方式.)

    react-native-pg-style 以最简单的方式编写样式代码,抛弃react-native标准的样式创建方式. 看大家写的源码中都是按照react-native标准的样式创建方式来写样式代码 ...

  6. 【分享】WeX5的正确打开方式(6)——数据组件初探

    本文是[WeX5的正确打开方式]系列的第6篇文章,简单介绍一下WeX5中数据组件的特性和结构形式. 数据组件的由来 上一篇 WeX5绑定机制我们实现了一个简单的记账本应用,当时所有数据都用 JSON ...

  7. 使用Topshelf组件构建简单的Windows服务

    很多时候都在讨论是否需要了解一个组件或者一个语言的底层原理这个问题,其实我个人觉得,对于这个问题,每个人都有自己的看法,个人情况不同,选择的方式也就会不同了.我个人觉得无论学习什么,都应该尝试着去了解 ...

  8. android Jni NDK开发环境搭建及其简单实例的编写

    android  Jni  NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中 ...

  9. Djang之ModelForm组件的简单使用

    ModelForm组件的简单使用 models.py from django.db import models class UserInfo(models.Model): username = mod ...

随机推荐

  1. Redis常用命令(4)——List

    BLPOP 格式:BLPOP key [key ...] timeout 作用:从列表左侧弹出元素,超时时间为timeout,单位为秒.如果timeout为0则一直阻塞直到列表中有元素.如果同时操作多 ...

  2. oracle truncate table recover(oracle 如何拯救误操作truncate的表)

     生产上肯定是容易脑袋发热,truncate一张表,立马的心跳加速,眼神也不迷糊了,搞错了,完了-- 那么,truncate表后,能不能进行恢复? truncate操作是比较危险的操作,不记录redo ...

  3. audioread.NoBackendError

    audioread.NoBackendError 起因 使用以下代码读取音频文件时: # !/usr/bin/python # -*- coding: utf-8 -*- ""&q ...

  4. 【轻松学编程】如何快速学会一门高级编程语言,以python为例

    python文章目录 关注公众号"轻松学编程"了解更多. 写在前面:如何快速(比如在一个月内)学会一门高级编程语言? 现在想学一门编程语言并不难,网上有很多资料,包括书籍.博客.视 ...

  5. vite + ts 快速搭建 vue3 项目 以及介绍相关特性

    博客地址:https://ainyi.com/98 Vue3.0,One Piece 接下来得抽空好好学习了 vite 尤大在 Vue 3.0 beta 直播中推荐了 vite 的工具,强调:针对Vu ...

  6. DP斜率优化学习笔记

    斜率优化 首先,可以进行斜率优化的DP方程式一般式为$dp[i]=\max_{j=1}^{i-1}/\min_{j=1}^{i-1}\{a(i)*x(j)+b(i)*y(j)\}$ 其中$a(j)$和 ...

  7. XJOI 夏令营501-511测试11 游戏

    Alice和Bob两个人正在玩一个游戏,游戏有很多种任务,难度为p的任务(p是正整数),有1/(2^p)的概率完成并得到2^(p-1)分,如果完成不了,得0分.一开始每人都是0分,从Alice开始轮流 ...

  8. .net 实现之短信验证码

    接口类型:互亿无线触发短信接口,支持发送验证码短信.订单通知短信等. 账户注册:请通过该地址开通账户http://sms.ihuyi.com/register.html 只能测试用: 实现注册页面 & ...

  9. 3、编程语言与Python介绍

    一 引子 基于上一章所学,有了计算机硬件,再在硬件之上安装好操作系统,我们就有了一个应用程序的运行平台,我们接下来的任务就是学习如何使用某款编程语言来开发应用程序. 本章的主题是先了解一下编程语言,然 ...

  10. layui表单提交

    关于layui表单提交  只是简单用一个文本框记录一下提交过程    其他的如下拉框选择框样式可以参考官网 下面直接开始.首 一:前台页面 <!DOCTYPE html><html& ...