创建最简单的exe形式COM组件并在MFC程序调用
来新公司学习接手新项目,拿到代码打开解决方案看到里面竟然有40几个工程,有点吃惊。具体看代码也有很多之前没见过的写法,上了几天火。
有件事就没太搞明白,按照文档的说法上层很多软件都要调用IO服务器,但看程序安装目录,IO服务器其实是一个exe程序,按照我之前的印象,能被别的程序调用的也得是动态库、静态库或者服务。实在想不通exe程序怎么作为接口被别的程序调用的。
结果昨天研究了一天,想通了,这个IO服务器其实就是COM组件。
按照网上的说法:COM component(COM组件)是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。
COM组件可以是dll或者exe或者服务的形式。
按照这个思路,代码就看懂了不少,之所以解决方案里有那么多工程,也不过是因为划分了很多动态库和COM组件。
又花了些时间,写了个小程序来实现最简单的exe形式COM组件的生成与调用,如下:
首先建立一个ALT工程:



在类视图里,为工程添加ALT的类,和接口:

这里定义了类,和对应的接口(Interface),注意ProgID要写,待会程序调用com接口时,要通过ProgID找com组件

之后项目目录如下,在.idl文件里有com接口(interface),里面还定义了com组件的id等等不赘述了,实现类在ATLTest.cpp里,其对应关系都是vs自动搭建的。

接下来还是在类视图里具体添加方法(接口和实现):

方法内部写程序,逻辑是两数求和:
STDMETHODIMP CCATLTest::ATLTestFunc0(SHORT num1, SHORT num2, SCODE* pRetNum)
{
*pRetNum = num1 + num2;
return S_OK;
}
然后编译会出错,那是因为执行com组件注册命令时候,缺乏管理员权限,
重新启动vs,以管理员权限运行即可。
接下来建一个mfc项目,这不是今天主题就不赘述了,
在界面上简单填个按钮和输入框,写个两数求和的图形界面demo,
具体的求和的方法要调用com组件。
mfc项目里添加com接口,在类向导里选择添加类,选atl,选TypeLib中的MFC类:

之后可以选取前面定义的Lib:

加入COM接口文件后,就可以调用了,注意我下面的写法:
void CATLMfcClientDlg::OnBnClickedGetRetButton()
{
CoInitialize(NULL);
CATLTest myCom;
if (!myCom.CreateDispatch(_T("ATLTest.math.1")))
{
MessageBox(L"组件注册失败");
return;
}
CString strNum1,strNum2;
// 获取用户输入的数字
this->numInput1.GetWindowTextW(strNum1);
this->numInput2.GetWindowTextW(strNum2);
// 调用COM接口,两数求和
short ret = myCom.ATLTestFunc0(_wtoi(strNum1),_wtoi(strNum2));
WCHAR buf[];
_itow(ret,buf,);
// 显示结果
this->numRet.SetWindowTextW(buf);
CoUninitialize();
return;
}
运行效果:

上面有说的简略的地方,具体可以看我上传git的源码:
https://github.com/SonnAdolf/MyAtlExeComDemo
额外内容:
动态链接库和COM组件的区别
1动态链接库的表现形式只能是dll[变态该名的除外], COM组件的表现形式可以是dll也可以是exe。
注:其实字体、驱动等也算是动态链接库的一种,这里略去...
2 动态链接库的生成和编译器及系统相关,在Windows/Linux下系统,需要分别编译才能使用。
COM组件是二进制编码,在Windows和Linux下可以直接使用,不需要重新编译。
3 COM组件是按照COM规范实现的dll或者exe;动态链接库是一个可以导出函数的函数集合。
4 动态链接库只能在本机被调用,COM组件支持分布式使用。
创建最简单的exe形式COM组件并在MFC程序调用的更多相关文章
- IOS开发之小实例--创建一个简单的用于视频录制和回放的应用程序
前言:还是看了一下国外的入门IOS文章:<Create a Simple App for Video Recording and Playback>,主要涉及视频录制和回放的功能的基本实现 ...
- C#调用Exe文件的方法及如何判断程序调用的exe已结束
很简单的代码就可以实现C#调用EXE文件,如下: 引入using System.Diagnostics; 调用代码: Process.Start(exe文件名); 或直接 System.Diagnos ...
- WCF服务二:创建一个简单的WCF服务程序
在本例中,我们将实现一个简单的计算服务,提供基本的加.减.乘.除运算,通过客户端和服务端运行在同一台机器上的不同进程实现. 一.新建WCF服务 1.新建一个空白解决方案,解决方案名称为"WC ...
- IntelliJ IDEA 15 部署Tomcat及创建一个简单的Web工程
一.部署Tomcat 二.创建一个简单的Web工程 2.1创建一个新工程 创建一个新工程 设置JDK及选择Web Application (创建的是Web工程) 点击Next,选择工作空间,起个工程名 ...
- 如何创建一个简单的struts2程序
如何创建一个简单的Struts2程序 “计应134(实验班) 凌豪” 1.创建一个新的Web项目test(File->new->Web Project) 2.Struts2框架的核心配置文 ...
- WCF入门, 到创建一个简单的WCF应用程序
什么是WCF? WCF, 英文全称(windows Communication Foundation) , 即为windows通讯平台. windows想到这里大家都知道了 , WCF也正是由微软公 ...
- Java多线程的创建与简单使用
一.线程的基本概念 什么是线程:Thread 进程内部的一个执行单元,它是程序中一个单一的顺序控制流程. 线程又被称为轻量级进程(lightweight process) 如果在一个进程中同时运行了多 ...
- Python框架学习之用Flask创建一个简单项目
在前面一篇讲了如何创建一个虚拟环境,今天这一篇就来说说如何创建一个简单的Flask项目.关于Flask的具体介绍就不详细叙述了,我们只要知道它非常简洁.灵活和扩展性强就够了.它不像Django那样集成 ...
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二)(代码篇)
这篇是上一篇的延续: 用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 源代码在github上可以下载,地址:https://github.com/guoxia ...
随机推荐
- WebSocket的实现与应用
WebSocket的实现与应用 前言 说到websocket,就不得不提http协议的连接特点特点与交互模型. 首先,http协议的特点是无状态连接.即http的前一次连接与后一次连接是相互独立的. ...
- 准时制生产(Just in Time,JIT)
准时制生产(Just in Time,JIT)称为及时生产,出自日本丰田. 1.JIT生产方式的管理理念 JIT的基本概念事指在所需要的精确时间内,按所需要的质量和数量,生产所 ...
- 如何成为PHP程序员?
当今,互联网的蓬勃发展,移动互联网的火热,以及国家提出的“互联网+”.这些趋势可以让我们明显的感觉到互联网的重要,不可替代.网站也是大家最早接触,最早认识的一种新事物.谈到网站,无非最长脸的莫过于PH ...
- Spark安装与部署
1.首先安装scala(找到合适版本的具体地址下载) 在/usr/local/目录下 wget https://www.scala-lang.org/download/**** 2.安装spark ( ...
- 用原生JS实现AJAX和JSONP
前端开发在需要与后端进行数据交互时,为了方便快捷,都会选择JQuery中封装的AJAX方法,但是有些时候,我们只需要JQuery的AJAX请求方法,而其他的功能用到的很少,这显然是没必要的.其实,原生 ...
- 神盘GCCX,2019必撸大毛!
自从今年5月转型投资以来,已经很少薅羊毛了! 不是不撸,是因为一般的羊毛我真看不上! 撸羊毛能不能发财,能不能日入几百几千! 答案是,可以! 干羊毛,像趣步,云钱包,云比特,环保币,很多人都发财了!前 ...
- Flask框架(二)—— 反向解析、配置信息、路由系统、模板、请求响应、闪现、session
Flask框架(二)—— 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 目录 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 一.反向解析 1.什么是反向解析 ...
- restapi(5)- rest-mongo 应用实例:分布式图片管理系统之一,rest 服务
最近有同事提起想把网页上的图片存在MongoDB里,我十分赞同.比起把图片以文件形式存放在硬盘子目录的方式,MongoDB有太多的优势.首先,MongoDB是分布式数据库,图片可以跨服务器存储.在一个 ...
- Windows 10“数字权利激活”永久性激活!!!
直接运行软件即可自动激活,等出现"激活成功"即可关闭软件. 注意事项: 激活软件不会帮你打开Windows update服务,如关闭系统自动更细服务的需要先启动服务. 可以在小娜搜 ...
- 实战SpringCloud响应式微服务系列教程(第四章)
接上一篇: 实战SpringCloud响应式微服务系列教程(第一章) 实战SpringCloud响应式微服务系列教程(第二章) 实战SpringCloud响应式微服务系列教程(第三章) 1.1.4 引 ...