vs2019 Com组件初探之简单的COM编写及实现跨语言调用的方法

前提条件

  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并且可以看到系统自动生成的头文件和源文件

   

  现在添加一个新的ATL对象

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

  

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

  

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

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

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

  这里需要注意两个值

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

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

  

  完成后会在ComTest 下自动添加 Temp.h 以及 Temp.cpp以及生成一个CTemp类

  

  

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

  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才可以调用

Github源码地址

  3065190005/ComTest: ComTest Code (github.com)

到此这篇关于vs2019 Com组件初探之简单的COM编写及实现跨语言调用的方法的文章就介绍到这了,更多相关vs2019 Com组件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • VS2019添加引用出错:对COM组件的调用返回了错误HRESULT E_FAIL(未能完成操作未指定的错误)

    如图: 错误1: 错误2: 原因分析: 此系统是我在虚拟机里面跑的,全新系统,就安装了一个vs2019. 之前遇到COM组件无法被调用的情况.我猜可能是由于VS是用了.net框架开发的.调用Com组件也是刚好用的.net的sdk.所以现在网上说只安装使用c++开发环境的话是根本不行的.必须装一个.net SDK 随便那个版本都可以 如图: 装完之后需要更新一下缓存,不然也无法使用.如果是全新安装的时候就装了.就不用执行此步骤. 1.以管理员身份打开 Developer Command Promp

  • vs2019 Com组件初探之简单的COM编写及实现跨语言调用的方法

    前提条件 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构架下,人们可以开发出各种各样的功能专一

  • 比较简单的一个符合web标准的JS调用flash方法

    微软XP升级出现的bug,就是对于使用传统网页制作模式插入页面的flash无法正常浏览,页面打开的时候flash周围是一个虚线框,需要点击一下才能正常浏览,以下的办法就是解决这一缺点,并且让flash能符合WEB标准,此外最重要的是,整个网站的所有flash都可以调用这一段代码,让你的代码更加简洁! 1.先建立一个flash.js的JS文件,并写入 复制代码 代码如下: function flash(ur,w,h){  document.write('<object classid="cl

  • vs2019中使用MFC构建简单windows窗口程序

    微软基础类库(英语: Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量.其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类. vs 2019 最新版,在设计上又有了很大的变化,并且其所有的服务,模块都是自定义搭建的,所以在一开始安装的时候,没有勾选mfc模块的话,是无法快速构成mfc应用的. vs2019下MFC模块的安装 首

  • VueJs组件prop验证简单介绍

    组件 Vue.js引入的组件,让分解单一HTML到独立组件成为可能.组件可以自定义元素形式使用,或者使用原生元素但是以is特性做扩展. 今天看了vuejs的组件,看到了prop组件,主要作用是在传入数据的时候对传入的值做判断,写了个小例子. <div id="app"> <my-child :num="100" :msg="'sdf'" :object="{a:'a'}" :cust="100&qu

  • Vue组件BootPage实现简单的分页功能

    有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋可以移步我的上一篇文章<浅谈Vue.js>了解一下. BootPage组件简介  其实也不是啥高大上的组件了,相反确实一个简单的表格分页组件而已,主要是自己最近项目中需要一个表格分页组件,而Vue官方组件库里分页组件都功能太强大或者没有适合我的,所以就自己写了一个凑合着用,或许有人和我一样需要这样

  • Bootstrap树形组件jqTree的简单封装

    一.组件效果预览 其实效果和之前的那个差不多,博主只是在之前的基础上加了一个选中的背景色. 全部收起 展开 全部展开 二.代码示例 其实效果很简单,重点来看看代码是如何实现封装的.还是老规矩,将已经实现的代码贴出来,然后再来一步一步讲解. (function ($) { //使用js的严格模式 'use strict'; $.fn.jqtree = function (options) { //合并默认参数和用户传过来的参数 options = $.extend({}, $.fn.jqtree.

  • vue递归组件实战之简单树形控件实例代码

    1.递归组件-简单树形控件预览及问题 在编写树形组件时遇到的问题: 组件如何才能递归调用? 递归组件点击事件如何传递? 2.树形控件基本结构及样式 <template> <ul class="vue-tree"> <li class="tree-item"> <div class="tree-content"><!--节点内容--> <div class="expand-

  • 使用Vue组件实现一个简单弹窗效果

    最近在使用element-ui框架,用到了Dialog对话框组件,大致实现的效果,跟我之前自己在移动端项目里面弄的一个弹窗组件差不太多.然后就想着把这种弹窗组件的实现方式与大家分享一下,下面本文会带着大家手摸手实现一个弹窗组件. 本文主要内容会涉及到弹窗遮罩的实现, slot 插槽的使用方式, props . $emit 传参,具体组件代码也传上去了.如果喜欢的话可以点波赞/关注,支持一下,希望大家看完本文可以有所收获. 组件最后实现的效果 实现步骤 先搭建组件的html和css样式,遮罩层和内

  • Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法

    本文实例讲述了Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法.分享给大家供大家参考,具体如下: 每天打开电脑第一件事应该就是打开人人刷一下,然后登上QQ.每次都这样很麻烦,于是写了一个脚本,每次双击即可自动完成这两个工作. 注意:需要在人人登录时选择"下次自动登录",QQ也要选择自动登录.其实感觉这些设置都是没必要的,都可以用脚本完成,但是本人比较水,就偷了懒,没有去查资料. 代码如下: todo.pyw: import webbrowser import os web

  • Android应用程序四大组件之使用AIDL如何实现跨进程调用Service

    一.问题描述 Android应用程序的四大组件中Activity.BroadcastReceiver.ContentProvider.Service都可以进行跨进程.在上一篇我们通过ContentProvider实现了不同应用之间的跨进程调用,但ContentProvider主要是提供数据的共享(如sqlite数据库),那么我们希望跨进程调用服务(Service)呢?Android系统采用了远程过程调用(RPC)方式来实现.与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言

随机推荐