带你玩转Visual Studio
带你玩转Visual Studio
带你新建一个工程
工程目录下各文件的含义
解决方案与工程
在这之前先了解一个概念:解决方案与工程。
解决方案(Solution):一个大型项目的整体的工作环境;
工程 (Project):一个解决方案下的一个子工程;
在VS中,一个Solution可以有一个或多个Project。在我们创建一个工程时,如果没有指定Solution,VS会帮我们创建一个与工程名相同的Solution,这时一个Solution里只有一个Project。所有在我们的TestProject的文件目录结构中TestProject文件夹下还有一个TestProject文件夹(如图4),第一个就是整个Solution的目录,第二个才是Project的目录。
解决方案相关的文件:
TestProject.sln:
整个解决方案(Solution)的配制文件,组织多个工程和相关的元素到一个解决方案中。用鼠标双击它就能用VS打开整个工程项目。
TestProject.sdf:
浏览相关的数据库文件,它支持浏览和导航的特性。如跳转到方法、变量的声明,查找所有对象的所有被引用的地方,类视图等等。
TestProject.suo:
(solution user opertion) 解决方案用户选项,记录所有将与解决方案建立关联的选项, 以便在每次打开时,它都包含您所做的自定义设置.
TestProject.opensdf:
打开解决方案(Solution)时的临时文件,这个文件只有你的解决方案在VS打开的状态才会有,工程一关闭文件就被删除了。
工程相关的文件
TestProject.vcxproj:
记录工程(Project)相关的属性配制。
TestProject.vcxproj.filters:
文件过虑器,上图3“工程结构”中各个文件的组织和编排都是定义在这个文件中的。如果由于某种特殊的原因(如系统或VS突然崩溃)导致你打开工程时文件的组织结构是乱的,100%就是这个文件的原因。
TestProject.vcxproj.user:
用户相关的一些配制。
上面这些文件中有几个比较重要的一定不能删的文件是:
TestProject.sln、TestProject.vcxproj、TestProject.vcxproj.filters
不要问我是怎样知道这些文件的作用的,请看官方文档:
VS2010定义:https://msdn.microsoft.com/en-us/library/3awe4781.aspx.
VS2015定义:https://msdn.microsoft.com/en-us/library/vstudio/hx0cxhaw(v=vs.110).aspx
带你了解VC++各种类型的工程
理解几个概念
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技术可从以下两方面理解:
- ATL可以说是把COM封装了一下,象MFC一样做成一个库,并有一个向导,使COM应用开发尽可能地自动化、可视化,这就决定了ATL只面向COM开发提供支持。
- 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既包含服务器端技术,也包含客户端技术。其主要内容是:
- ActiveX控制(ActiveX Control);用于向WEB页面、Microsoft Word等支持ActiveX的容器(Container)中插入COM对象。
- ActiveX文档(ActiveX Document);用于在WEB Browser或者其它支持ActiveX的容器中浏览复合文档(非HTML文档),例如Microsoft Word文档,Microsoft Excel文档或者用户自定义的文档等。
- ActiveX脚本描述(ActiveX Scripting);用于从客户端或者服务器端操纵ActiveX控制和Java程序,传递数据,协调它们之间的操作。
- ActiveX服务器框架(ActiveX Server Framework);提供了一系列针对WEB服务器应用程序设计各个方面的函数及其封装类,诸如服务器过滤器、HTML数据流控制等。
- 在Internet Explorer中内置Java虚拟机(Java Virtual Machine),从而使Java Applet能够在Internet Explorer上运行,并可以与ActiveX控制通过脚本描述语言进行通信。
带你高效开发
使用Visual Assist X
Visual Assist X Snippets 宏
带你高效管理代码
目前主流的版本控制系统有:
- CVS:是一个用于代码版本控制的自由软件,它是一个比较早出现的工具,由于它有很多自身的缺陷,现在几乎被SVN所取代了。
- SVN:SVN是Subversion的简称,它是集中式的版本控制系统。SVN继承了CVS的基本思想,包含了CVS的几乎所有功能。你可以认为SVN是CVS的升级版(但实际上它们完全是两个软件)。
- GIT:GIT是分布式的版本控制系统。相信玩过开源代码的都知道github吧,它就是一个基于git的代码托管平台
C++工程上传服务器要忽视的文件
C++工程上传服务器要忽视的文件
h: 头文件
cpp: 源文件
txt: 说明文件,如readme
rc: 资源文件
rc2: 资源文件
ico: 图标,如logo等
sln: 解决方案工程文件
vcxproj: 工程文件
filters: 文件过虑器
不要上传的文件类型
Debug、Release等编译结构目录
ipch目录
aps: last resource editor state
exe: build result
idb: build state
ipch: build helper
lastbuildstate: build helper
lib: build result. Can be 3rd party
log: build log
manifest: build helper. Can be written yourself.
obj: build helper
pch: build helper
pdb: build result
res: build helper
sdf: intellisense dbase
suo: solution user options
tlog: build log
user: debug settings. Do preserve if just one dev or custom debug settings
如果用TortoiseSVN进行管理,需要手动添加ignore属性将不需要上传的文件忽略掉。在你工程目录里,右键->TortoiseSVN->Properties->New->Other,弹出的对话框中Property name中选择svn:ignore,Property value中填入要忽略的内容(这里可以使用能配符)。可以设置全局忽略样式。
带你跳出坑爹的Runtime Library坑
Multi-threaded /MT Release版的多线程静态库 libcmt.lib
Multi-threaded Debug /MTd Debug版的多线程静态库 libcmtd.lib
Multi-threaded DLL /MD Release版的多线程动态库 msvcrt.lib+msvcrtxx.dll
Multi-threaded DLL Debug MDd Debug版的多线程动态库 msvcrtd.lib+msvcrtxxd.dll
结论:/MD和/MDd将是潮流所趋,/ML和/MLd方式请及时放弃,/MT和/MTd在非必要时最好也不要采用了。
带你理解多字节编码与Unicode码
- 当设置为Use Unicode Character Set时,会有预编译宏:_UNICODE、UNICODE
- 当设置为Use Unicode Character Set时,会有预编译宏:_UNICODE、UNICODE
incremental linking(增量链接)的作用
VS中的路径宏 vc++中OutDir、ProjectDir、SolutionDir各种路径
命令行编译C/C++程序
打开安装目录下的VSDIR\VC\bin可以看到一系列的可执行程序.exe和批处理文件,这些就是VS2010构建、编译、链接时要用到的工具。看一下几个主要的工具:
cl.exe:编译程序
link.exe:链接程序
lib.exe:加载lib库的程序
nmake.exe:用makefile进行构建、编译的工具
性能分析与优化##
使用VS的性能分析工具
性能分析工具的选择
打开一个“性能分析”的会话:Debug->Start Diagnotic Tools Without Debugging(或按Alt+F2),VS2013在Analysis菜单中。
CPU Usage
检测CPU的性能,主要用于发现影响CPU瓶颈(消耗大量CPU资源)的代码。
GPU Usage
检测GPU的性能,常用于图形引擎的应用(如DirectX程序),主要用于判断是CPU还是GPU的瓶颈。
Memory Usage
检测应用程序的内存,发现内存。
Performance Wizard
性能(监测)向导,综合检测程序的性能瓶颈。这个比较常用,下面再逐一说明。
性能(监测)向导
CPU Sampling(CPU采样):
进行采样统计,以低开销水平监视占用大量CPU的应用程序。这个对于计算量大的程序可大大节省监控时间。
Instrumentation(检测):
完全统计,测量函数调用计数和用时
.NET memory allocation(.NET 内存分配):
跟踪托管内存分配。这个好像只有托管代码(如C#)才可用,一般以C++代码好像不行。
Resource contention data(并发):
检测等待其他线程的线程,多用于多线程的并发。
性能分析报告
视图类型
有几个不同的视图可供我们切换,下面加粗的部分是个人觉得比较方便和常用的视图。
- Summary(概要):整个报告概要说明
- Call Tree(调用树):以树形表格的方式展开函数之间的关系。
- Module(模块):分析调用的不同的程序模块,如不同的DLL、lib模块的耗时
- Caller/Callee(调用与被调用):以数值显示的调用与被调用的关系
- Functions(函数统计):以数值显示的各个函数的执行时间和执行次数统计值
- Marks(标记):
- Processers(进程):
- Function Detials(函数详情):以图表的方式形象地显示:调用函数-当前函数-被调用子函数之间的关系和时间比例。
专用术语
- Num of Calls:(函数)调用次数
- Elapsed Inclusive Time:已用非独占时间
- Elapsed Exclusive Time:已用独占时间
- Avg Elapsed Inclusive Time:平均已用非独占时间
- Avg Elapsed Exclusive Time:平均已用独占时间
- Module Name:模块名称,一般为可执行文件(.exe)、动态库(.dll)、静态库(.lib)的名称。
调用约定__cdecl、__stdcall和__fastcall
什么是调用约定
函数的调用约定,顾名思义就是对函数调用的一个约束和规定(规范),描述了函数参数是怎么传递和由谁清除堆栈的。它决定以下内容:(1)函数参数的压栈顺序,(2)由调用者还是被调用者把参数弹出栈,(3)以及产生函数修饰名的方法。
常见的调用约定有__cdecl、__stdcall、fastcall,应用最广泛的是__cdecl和__stdcall,下面我们会详细进行讲述。。还有一些不常见的,如 __pascal、__thiscall、__vectorcall。
__cdecl的特点
__cdecl 是 C Declaration 的缩写,表示 C 和 C++ 默认的函数调用约定。是C/C++和MFCX的默认调用约定。
- 按从右至左的顺序压参数入栈、。
- 由调用者把参数弹出栈。切记:对于传送参数的内存栈是由调用者来维护的,返回值在EAX中。因此对于像printf这样可变参数的函数必须用这种约定。
- 编译器在编译的时候对这种调用规则的函数生成修饰名的时候,在输出函数名前加上一个下划线前缀,格式为_function。如函数int add(int a, int b)的修饰名是_add。
__stdcall的特点
__stdcall是Standard Call的缩写,是C++的标准调用方式,当然这是微软定义的标准,__stdcall通常用于Win32 API中(可查看WINAPI的定义)。
- 按从右至左的顺序压参数入栈。
- 由被调用者把参数弹出栈。切记:函数自己在退出时清空堆栈,返回值在EAX中。
- __stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式为_function@number。如函数int sub(int a, int b)的修饰名是_sub@8。
__fastcall的特点
__fastcall调用的主要特点就是快,因为它是通过寄存器来传送参数的。
- 实际上__fastcall用ECX和EDX传送前两个DWORD或更小的参数,剩下的参数仍自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈。
- __fastcall调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,格式为@function@number,如double multi(double a, double b)的修饰名是@multi@16。
- __fastcall和__stdcall很象,唯一差别就是头两个参数通过寄存器传送。注意通过寄存器传送的两个参数是从左向右的,即第1个参数进ECX,第2个进EDX,其他参数是从右向左的入栈,返回仍然通过EAX。
__thiscall
__thiscall是C++类成员函数缺省的调用约定,但它没有显示的声明形式。因为在C++类中,成员函数调用还有一个this指针参数,因此必须特殊处理,thiscall调用约定的特点:
- 参数入栈:参数从右向左入栈
- this指针入栈:如果参数个数确定,this指针通过ecx传递给被调用者;如果参数个数不确定,this指针在所有参数压栈后被压入栈。
- 栈恢复:对参数个数不定的,调用者清理栈,否则函数自己清理栈。
调用约定与(动态)库
参考:
带你玩转Visual Studio的更多相关文章
- 转: 带你玩转Visual Studio——带你理解多字节编码与Unicode码
上一篇文章带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑帮我们理解了Windows中的各种类型C/C++运行时库及它的来龙去脉,这是C++开发中特别容易误入歧途的 ...
- 带你玩转Visual Studio——带你了解VC++各种类型的工程
原文地址:http://blog.csdn.net/luoweifu/article/details/48816605 上一篇文章带你玩转Visual Studio——带你新建一个工程一文中提到新建一 ...
- 带你玩转Visual Studio——带你理解微软的预编译头技术
原文地址:http://blog.csdn.net/luoweifu/article/details/49010627 不陌生的stdafx.h 还记得带你玩转Visual Studio——带你新建一 ...
- 带你玩转Visual Studio——带你理解多字节编码与Unicode码
目录(?)[-] 多字节字符与宽字节字符 char与wchar_t string与wstring string 与 wstring的相关转换 字符集Charcater Set与字符编码Encoding ...
- 带你玩转Visual Studio——带你高效开发
VassistX的简单介绍与下载安装 简单介绍 VassistX的全称是Visual Assist X,是whole tomato开发的一个非常好用的插件,可用于VC6.0及Visual Studio ...
- 带你玩转Visual Studio——性能分析与优化
找到性能瓶颈 二八法则适合很多事物:最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的.在程序代码中也是一样,决定应用性能的就那20%的代码(甚至更少).因此优化实践中,我们将精力 ...
- 玩转visual studio系列之类设计图
类设计图 vs 类设计图 微软 安装好vs2017后,在打开的IDE中,随便选择一个文件夹创建[类图],却发现没有该选项 类图辅助器 解决方案 1.点击[工具]选项卡,在下拉的菜单中选择第一项 获取 ...
- C# Note31: 如何使用Visual Studio做单元测试
待更! 使用Visual Studio 2013进行单元测试--初级篇 带你玩转Visual Studio——单元测试(C++例)
- 【转】Visual Studio——多字节编码与Unicode码
多字节字符与宽字节字符 1) char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t. char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为 ...
随机推荐
- 学习ASP.NET Core,怎能不了解请求处理管道[1]: 中间件究竟是个什么东西?
ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 "通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流 ...
- Win.ini和注册表的读取写入
最近在做打包的工作,应用程序的配置信息可以放在注册表文件中,但是在以前的16位操作系统下,配置信息放在Win.ini文件中.下面介绍一下Win.ini文件的读写方法和注册表的编程. 先介绍下Win.i ...
- OSGi规范的C#实现开源
这是大约在3-4年前完成的一个C#实现的OSGi框架,实现的过程参照了OSGi规范与与一些实现思路(感谢当时的那些资料与项目),此框架虽然仅在几个小型项目有过实际的应用,但OSGi的规范实现还是相对比 ...
- const let,console.log('a',a)跟console.log('a'+a)的区别
const 创建一个只读的常量 let块级作用域 const let重复赋值都会报错 console.log('a',a) a console.log('a'+a) a2 逗号的值会有空格:用加号的值 ...
- android Notification介绍
如果要添加一个Notification,可以按照以下几个步骤 1:获取NotificationManager: NotificationManager m_NotificationManager=(N ...
- 开始mono开发
使用mono框架开发android程序,第一步当然是构建开发环境,严格意义上说是使用 mono for android开发android程序. 参考Mono for Android安装配置破解 mo ...
- Javascript实践技巧
最近辞职了,准备北上.期待有个好结果~ 本文以<Javascript高级程序设计>为基础,结合自身经验来总结下Javascript实际工作方面的知识. 一.可维护性 1.代码约定 ...
- .NET基础拾遗(1)类型语法基础和内存管理基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
- ASP.NET Web API Model-ModelBinder
ASP.NET Web API Model-ModelBinder 前言 本篇中会为大家介绍在ASP.NET Web API中ModelBinder的绑定原理以及涉及到的一些对象模型,还有简单的Mod ...
- [译]ZOOKEEPER RECIPES-Locks
锁 全局式分布式锁要求任何时刻没有两个客户端会获得同一个锁对象,这可以通过使用ZooKeeper实现.像优先级队列一样,首先需要定义一个锁节点. 在ZooKepeer的发布中src/recipes/l ...