原文地址:http://blog.csdn.net/luoweifu/article/details/48816605

上一篇文章带你玩转Visual Studio——带你新建一个工程一文中提到新建一个工程时会有很多的工程类型(图1),现在将简单介绍各种类型工程的含义和主要用途。由于这里包含的工程类型太多,有很多本人也没有接触过,有些可能理解的不太对的地方还请谅解。

首先说明一下,如果你的初学者或者C++开发的时间不长,本篇文章的很多内容理解不了是正常的(我当初也不理解)。你可先有大概的概念,等工作(或有实际的项目开发经验)一两年后再回来看看也许就明白了。


图 1:New Project


理解几个概念

在开讲之前先大概理解几个概念,这是理解后面各种工程含义的基础。

COM

COM(Component Object Model)组件对象模型是microsoft制定的一个组件软件标准,跟unix上的CORBA一样。凡是遵循COM标准开发出来的组件称为COM组件。目地是实现二进制方式的软件重用 。在windows平台上,COM的实现形式有DLL(进程内组件)和EXE(进程外组件)2种。

OLE

OLE(Object Linking and Embedding)对象连接与嵌入是微软的复合文档技术,可方便实现应用程序之间的通信。在后来的OLE2中才导入了 COM,提供了对COM的支持,利用这种技术可开发可重复使用的软件组件COM。OLE是软件比较早提出的一种技术。

ATL

ATL(Active Template Library)活动模板库是一套C++模板库,常用于开发COM程序和ActiveX程序。要理解ATL技术可从以下两方面理解:
1.ATL可以说是把COM封装了一下,象MFC一样做成一个库,并有一个向导,使COM应用开发尽可能地自动化、可视化,这就决定了ATL只面向COM开发提供支持。
2.ATL因其采用了特定的基本实现技术,摆脱了大量冗余代码,使用ATL开发出来的COM应用的代码简练高效。
在ATL产生以前,开发COM组件的方法主要有两种:一是使用COM SDK(COM软件开发包)直接开发COM组件,另一种方式是通过MFC提供的COM支持来实现。而现在 ATL已经成为Microsoft支持COM应用开发的主要开发工具。

MFC

MFC(Microsoft Foundation Classes)微软基础类是微软提供的一个用于Windows程序开发的基础类库。MFC以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

ActiveX

ActiveX是微软提出的一组使用COM技术使得软件组件在网络环境中进行交互的技术集,它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序,此外ActiveX一般具有界面。

ActiveX既包含服务器端技术,也包含客户端技术。其主要内容是:
1. ActiveX控制(ActiveX Control);用于向WEB页面、Microsoft Word等支持ActiveX的容器(Container)中插入COM对象。
2. ActiveX文档(ActiveX Document);用于在WEB Browser或者其它支持ActiveX的容器中浏览复合文档(非HTML文档),例如Microsoft Word文档,Microsoft Excel文档或者用户自定义的文档等。
3. ActiveX脚本描述(ActiveX Scripting);用于从客户端或者服务器端操纵ActiveX控制和Java程序,传递数据,协调它们之间的操作。
4. ActiveX服务器框架(ActiveX Server Framework);提供了一系列针对WEB服务器应用程序设计各个方面的函数及其封装类,诸如服务器过滤器、HTML数据流控制等。
5. 在Internet Explorer中内置Java虚拟机(Java Virtual Machine),从而使Java Applet能够在Internet Explorer上运行,并可以与ActiveX控制通过脚本描述语言进行通信。

OLE、ActiveX、COM之间的区别

从时间的角度讲,OLE是最早出现的,然后是COM和ActiveX;从体系结构角度讲,OLE和ActiveX是建立在 COM之上的,所以COM是基础;单从名称角度讲,OLE、ActiveX是两个商标名称,而COM则是一个纯技术名词,这也是大家更多的听说ActiveX和OLE的原因。既然OLE是最早出现的,那么就从OLE说起,自从Windows操作系统流行以来,“剪贴板”(Clipboard)首先解决了不同程序间的通信问题(由剪贴板作为数据交换中心,进行、粘贴的操作),但是剪贴板传递的都是“死”数据,应用程序开发者得自行编写、解析数据格式的代码,于是动态数据交换(Dynamic Data Exchange,DDE)的通信协定应运而生,它可以让应用程序之间自动获取彼此的最新数据,但是,解决彼此之间的“数据格式”转换仍然是程序员沉重的负担。对象的链接与嵌入(Object Linking and Embedded,OLE)的诞生把原来应用程序的数据交换提高到“对象交换”,这样程序间不但获得数据也同样获得彼此的应用程序对象,并且可以直接使用彼此的数据内容,其实OLE是Microsoft的复合文档技术,它的最初版本只是瞄准复合文档,但在后续版本OLE2中,导入了COM。由此可见,COM是应OLE的需求而诞生的,所以虽然COM是OLE的基础,但OLE的产生却在COM之前。 COM的基本出发点是,让某个软件通过一个通用的机构为另一个软件提供服务。COM是应OLE 的需求而诞生,但它的第一个使用者却是OLE2,所以COM与复合文档间并没有多大的关系,实际上,后来COM就作为与复合文档完全无关的技术,开始被广泛应用。这样一来, Microsoft就开始“染指”通用平台技术。但是COM并不是产品,它需要一个商标名称。而那时Microsoft的市场专家们已经选用了OLE作为商标名称,所以使用COM技术的都开始贴上了 OLE的标签,虽然这些技术中的绝大多数与复合文档没有关系。
====本段内容转载自《OLE、ActiveX、COM、ATL联系与区别》====



各种工程结构

ATL

ATL Project

创建一个基于ATL的工程,用ATL的方式进行COM组件的开发,ATL提供了大量可重用的模板。ATL可用于COM组件的开发,也可用于ActiveX的开发。


CLR

Class Library

CLR Console Application

CLR Empty Project

Windows Forms Application

Windows Forms Control Library

CLR(Common Language Runtime)是公共语言运行库,和Java虚拟机一样也是一个运行时环境。CLR的核心功能包括:内存管理、程序集加载、安全性、异常处理和线程同步,可由面向CLR的所有语言使用。并保证应用和底层操作系统之间必要的分离。CLR/C++是托管的C++程序,数据和代码是由CLR管理的,调用方不用管内存的分配和释放,CLR好像常用于.net。

这一块我还真不了解,就不说了,怕误人子弟!!!


General

Empty Project

就是创建一个空的工程,不给你添加任何.cpp或.h文件,不进行任何特殊的设置。

Custom Wizard

就是用户自定义向导,什么意思呢?比如你每次建一个新的工程时都期望这个工程中有main.cpp、projectDescription.txt这两个文件,并且main.cpp中有一个默认的main函数。那么你可以建一个Custom Wizard工程,并配制好main.cpp、projectDescription.txt文件及所在目录结构;然后你每次创建一个新的工程时选择都基于这个已有的Custom Wizard工程,新建的工程就有自动添加main.cpp、projectDescription.txt文件了。说白了Custom Wizard就是一个模型,定义工程的默认文件和默认的配制。

Makefile Project

makefile就是对.cpp和.h等文件的组织、构建、编译规则。这个在跨平台开发中会用到,如你开发的程序既要在Windows下编译也要在Linux、Mac下编译,一般就会使用makefile的编译规则。说明:Windows下有一个微软自己的NMake构建器,因为在VS下makefile文件中的内容要符合NMake的规则才能够编译成功。


MFC

MFC ActiveX Control

就是以支持MFC的方式创建ActiveX程序,可快速地开发带有界面的ActiveX程序。
拓展阅读《使用VS2010创建MFC ActiveX工程项目

MFC Application

这个就是你平常开发MFC程序时会用到的工程, MFC(Microsoft Foundation Classes)是微软提供的一个用于Windows程序开发的基础类库,也是快速开发Windows上的桌面程序一般会选择的方式。

MFC DLL

它也是创建一个MFC的程序,与MFC Application的不同之处是:MFC Application工程生成的是一个.exe的可执行文件,而MFC DLL工程生成的是一个.dll的动态库文件。


Test

Test

顾名思义,这就是一个测试工程,可用来进行单元测试、顺序测试、压力测试等。


Win32

Win32 Console Application

这个就是你最熟悉的控制台应用程序了,编译成功,运行时会出现一个黑色的命令行窗口。上篇文章带你玩转Visual Studio——带你新建一个工程的样例也就是创建的这个类型的工程。

Win32 Project

MFC其实是对Windows API进行的一种封闭,使其具有面向对象的特性。而这个Win32 Project工程就是以直接调用Windows API的方式,使用Windows SDK开发带有窗口界面的程序。


说明

其实,像一般的开发常用的工程类型也就几种:
Win32 Console Application: 控制台应用程序,也是常见的那个黑色命令窗口。
Win32 Project: 直接用Windows API进行Windows桌面应用程序的开发。
MFC Application: MFC工程,用微软提供的类库进行界面程序的快速开发。

带你玩转Visual Studio——带你了解VC++各种类型的工程的更多相关文章

  1. 转: 带你玩转Visual Studio——带你理解多字节编码与Unicode码

    上一篇文章带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑帮我们理解了Windows中的各种类型C/C++运行时库及它的来龙去脉,这是C++开发中特别容易误入歧途的 ...

  2. 带你玩转Visual Studio——带你理解微软的预编译头技术

    原文地址:http://blog.csdn.net/luoweifu/article/details/49010627 不陌生的stdafx.h 还记得带你玩转Visual Studio——带你新建一 ...

  3. 带你玩转Visual Studio——带你理解多字节编码与Unicode码

    目录(?)[-] 多字节字符与宽字节字符 char与wchar_t string与wstring string 与 wstring的相关转换 字符集Charcater Set与字符编码Encoding ...

  4. 带你玩转Visual Studio——带你高效开发

    VassistX的简单介绍与下载安装 简单介绍 VassistX的全称是Visual Assist X,是whole tomato开发的一个非常好用的插件,可用于VC6.0及Visual Studio ...

  5. 带你玩转Visual Studio

    带你玩转Visual Studio 带你新建一个工程 工程目录下各文件的含义 解决方案与工程 在这之前先了解一个概念:解决方案与工程. 解决方案(Solution):一个大型项目的整体的工作环境: 工 ...

  6. 带你玩转Visual Studio——性能分析与优化

    找到性能瓶颈 二八法则适合很多事物:最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的.在程序代码中也是一样,决定应用性能的就那20%的代码(甚至更少).因此优化实践中,我们将精力 ...

  7. 玩转visual studio系列之类设计图

    类设计图 vs 类设计图 微软  安装好vs2017后,在打开的IDE中,随便选择一个文件夹创建[类图],却发现没有该选项 类图辅助器 解决方案 1.点击[工具]选项卡,在下拉的菜单中选择第一项 获取 ...

  8. 用Visual Studio创建集成了gtest的命令行工程

    gtest代码库中的sample代码 在gtest的代码库中,包含了10个sample的代码,覆盖了gtest的常见用法,sample的代码位于以下文件夹: gtest\samples 由于gtest ...

  9. visual studio 2005提示脚本错误 /VC/VCWizards/2052/Common.js

    今天在做OCX添加接口的时候,莫名其妙的遇到visual studio 2005提示脚本错误,/VC/VCWizards/2052/Common.js. 网上找了很多资料,多数介绍修改注册表“vs20 ...

随机推荐

  1. linux备份用户权限

    1:切换root用户,进入home目录,执行以下命令: [root@localhost home]# ll /home/wangfajun 2: home目录下执行以下命令进行wangfajun用户的 ...

  2. jQuery使用(七):事件绑定与取消,及自定事件的实现原理

    实例方法: on() one() off() trigger() hover() 一.绑定事件与jQuery事件委托 $(selector).eventType(fn); $(selector).on ...

  3. jQuery使用(四):DOM操作之查找兄弟元素和父级元素

    查找兄弟元素 向下查找兄弟元素 next() nextAll() nextUntil() 向上查找兄弟元素 prev() prevAll() prevUntil() 查找所有兄弟元素 siblings ...

  4. c++进阶学习

    以后可能要做c++开发了..记录要看的书和可能用的技术,让自己有个学习的方向... 1. 语言基础 2. 算法与数据结构基础 3. 多线程开发基础  4. 数据库  5. 网络编程 6. 内存数据库技 ...

  5. vue-router 编程式路由

    $route -> 使用它的属性 $router-> 使用它的方法 编程式的导航,即js控制跳转 //声明式:<router-link :to="..."> ...

  6. 一个awk if 嵌套 if 的脚本

    [root@makeISO sjx]# cat sex.sh #!/bin/bash # 统计如下内容,并输出结果 # (男职工未婚数量/男员工整体数量)(女员工未婚数量/女员工整体数量) echo ...

  7. 添加Glide图片加载框架依赖

    1.添加依赖implementation 'com.github.bumptech.glide:glide:4.7.1' 2.放置一个ImageView.3.加载,ivGif是ImageView实例 ...

  8. 【Linux】排序命令sort

    很多时候,我们都会去计算一次数据里头的相同型态的数据总数,举例来说, 使用 last 可以查得这个月份有登陆主机者的身份.那么我可以针对每个使用者查出他们的总登陆次数吗? 此时就得要排序与计算之类的命 ...

  9. wordpress网站分类目录怎么排序

    1.插件实现分类目录排序.安装插件My Category Order 启用插件,在控制面板的文章菜单下就出现如下图所示的目录调整选项,可以用鼠标随意拖曳调整目录排列顺序. 2.修改代码完成wordpr ...

  10. ACM2作业

    文件读写知识点: 写入文件:freopen("文件名", "r", stdin); 写出文件:freopen("文件名", "w& ...