VC++部分名词解析

 

Visual C++ 的常见用途是设计 Windows 程序。Windows 编程有其自身需要考虑的问题。面向 Windows 编写代码时需要注意很多重要方面。例如,托管代码和本机代码之间有区别。计算机处理器直接执行本机代码,而 CLR 负责运行托管代码。

面向 Windows 进行编程时,必须考虑窗口句柄、消息和异常。窗口消息和异常的处理是多个不同窗口之间如何相互通信的问题。MFC 提供了非常方便的包装使处理窗口通信变得轻松。

很多 C++ 程序员都关注以下几个方面:

· Windows 编程

· 公共对象模型 (COM)

· 库,如活动模板库 (ATL) 或 Microsoft 基础类 (MFC)

· 托管代码和 .NET 编程

1托管代码和本机代码的区别:

计算机处理器直接执行本机代码,而CLR负责运行托管代码。

2.、DLL

动态链接库 (DLL) 是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。

动态链接与静态链接的不同之处在于:动态链接允许可执行模块(.dll 文件或 .exe 文件)仅包含在运行时定位 DLL 函数的可执行代码所需的信息。在静态链接中,链接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。

使用动态链接代替静态链接有若干优点。DLL 节省内存,减少交换操作,节省磁盘空间,更易于升级,提供售后支持,提供扩展 MFC 库类的机制,支持多语言程序,并使国际版本的创建轻松完成。

3、EXE与DLL的区别

尽管 DLL 和应用程序都是可执行的程序模块,但它们之间有若干不同之处。对于最终用户来说,最明显的差异在于 DLL 不是可直接执行的程序。从系统角度讲,应用程序和 DLL 之间有两个基本差异:

· 应用程序可有多个同时在系统上运行的实例,而 DLL 只能有一个实例。

· 应用程序可以拥有堆栈、共用内存、文件句柄、消息队列这样的事物,而 DLL 不能。

.DLL 文件的布局与 .exe 文件非常相似,但有一个重要的差异:DLL 文件包含导出表。导出表包含 DLL 导出到其他可执行文件的每个函数的名称。这些函数是 DLL 中的入口点;只有导出表中的函数可由其他可执行文件访问。DLL 中的任何其他函数都是 DLL 私有的。通过使用带 /EXPORTS 选项的 Dumpbin 工具,可以查看 DLL 的导出表。

有两种从 DLL 导出函数的方法:

· 在生成 DLL 时,创建一个模块定义 (.def) 文件并使用该 .def 文件。如果希望按序号而不是按名称从 DLL 导出函数,则请使用此方法。

· 在函数的定义中使用 __declspec(dllexport) 关键字。

用上述任何方法导出函数时,确保使用 __stdcall 调用约定。

4、多线程编程

Microsoft Visual C++ 支持在 Microsoft Windows(Windows XP、Windows 2000、Windows NT、Windows Me 和 Windows 98)下创建多线程应用程序。如果您的应用程序需要管理多个活动(如同时进行键盘和鼠标输入),则您应当考虑使用多线程。一个线程可以处理键盘输入,而另一个线程可以筛选鼠标活动。第三个线程可以根据鼠标和键盘线程的数据更新显示屏幕。同时,其他线程可以访问磁盘文件或从通信端口获取数据。

使用 Visual C++ 的多线程编程有两种方式:使用 Microsoft 基础类库 (MFC),或使用 C 运行库和 Win32 API。有关使用 MFC 创建多线程应用程序的信息,请先阅读以下使用 C 进行多线程处理的主题,再参见使用 C++ 和 MFC 进行多线程处理

线程实质上是程序中的执行路径。也是 Win32 安排的最小执行单元。线程包括堆栈、CPU 寄存器的状态和系统计划程序执行列表中的项。每个线程共享所有进程的资源。

进程包括一个或多个线程和代码、数据和内存中的其他程序资源。典型的程序资源是打开的文件、信号灯和动态分配的内存。当系统计划程序给予其中的一个线程执行控制时,即执行程序。计划程序确定应当运行哪些线程以及它们应当何时运行。较低优先级的线程可能必须等到较高优先级的线程完成任务后才能运行。在多处理器计算机上,计划程序可以将单个线程移到不同的处理器以平衡 CPU 负荷。

进程中的每个线程都独立运行。除非使这些线程相互可见,否则线程分别执行,对进程中的其他线程一无所知。线程共享公共资源,但是,必须使用信号灯或其他进程间的通信方法协调它们的工作。有关同步线程的更多信息,请参见编写多线程 Win32 程序

Microsoft 基础类 (MFC) 库提供多线程应用程序支持。本主题描述进程、线程和 MFC 多线程处理方法。

进程是应用程序的执行实例。例如,双击“记事本”图标时,将启动运行“记事本”的进程。

线程是进程内的执行路径。启动“记事本”时,操作系统创建进程并开始执行该进程的主线程。此线程终止时,进程也终止。启动代码以函数地址的形式将此主线程提供给操作系统。通常是所提供的 main 函数或 WinMain 函数的地址。

如果愿意,可以在应用程序中创建其他线程。如果在处理后台任务或维护任务时不希望用户等待这些任务完成,则可能需要创建其他线程。MFC 应用程序中的所有线程都由 CWinThread 对象表示。大多数情况下,甚至不必显式创建这些对象,而只需调用框架 Helper 函数 AfxBeginThread,该函数将为您创建 CWinThread 对象。

MFC 区分两种类型的线程:用户界面线程和辅助线程。用户界面线程通常用于处理用户输入及响应用户生成的事件和消息。辅助线程通常用于完成不需要用户输入的任务(如重新计算)。Win32 API 不区分线程类型;它只需要了解线程的起始地址以开始执行线程。MFC 为用户界面中的事件提供消息泵,从而对用户界面线程进行专门处理。CWinApp 是用户界面线程对象的一个示例,因为它从 CWinThread 派生并对用户生成的事件和消息进行处理。

应特别注意以下情况:可能有不止一个线程需要访问同一对象。多线程处理:编程提示 介绍了一些可以避免在这些情况下可能发生的问题的技术。多线程处理:如何使用同步类说明如何使用可用的类从多个线程同步访问一个对象。

编写和调试多线程处理本身是一项复杂棘手的任务,因为您必须确保一次只能有一个线程访问对象。多线程处理主题没有讲述多线程处理的基础知识,而只是说明了如何在多线程程序中使用 MFC。Visual C++ 中包含的多线程 MFC 示例阐释了几种多线程“添加功能”和 MFC 中未包含的 Win32 API,但只是一些入门知识。

有关操作系统如何处理进程和线程的更多信息,请参见 Windows SDK 中的进程和线程

有关 MFC 多线程支持的更多信息,请参见以下主题:

· 多线程处理:创建用户界面线程

· 多线程处理:创建辅助线程

· 多线程处理:如何使用同步类

· 多线程处理:终止线程

· 多线程处理:编程提示

· 多线程处理:何时使用同步类

5、本机和 .NET 的互操作性

Visual C++ 支持互操作性功能,允许托管和非托管构造在同一程序集内甚至同一文件中共存和交互操作。其他 .NET 语言也支持此功能的一个小的子集(如 P/Invoke),但是由 Visual C++ 提供的大多数互操作性支持在其他语言中是不可用的。

混合程序集能够同时包含非托管计算机指令和 MSIL 指令。这使它们可以调用 .NET 组件或被其调用,同时保留与完全非托管组件的兼容性。使用混合程序集,开发人员可以混合使用托管和非托管功能创作应用程序。这使得混合程序集成为将现有 Visual C++ 应用程序迁移到 .NET 平台的理想选择。

例如,通过使用 /clr 编译器开关仅重新编译一个模块,就可将完全由非托管函数组成的现有应用程序迁移到 .NET 平台。然后,此模块就可以使用 .NET 功能,但是仍保留与应用程序的其余部分的兼容性。通过此种方式,应用程序可以按渐近、逐个部分的方式转换到 .NET 平台。甚至可以决定在同一文件内每个函数的基础上进行托管或非托管编译(请参见 managed, unmanaged)。

Visual C++ 2005 支持生成三种不同类型的托管程序集:混合程序集、纯程序集和可验证程序集。后两者在纯代码和可验证代码中讨论。

公共语言运行时提供平台调用服务(Platform Invocation Services,简称 PInvoke),使托管代码能够调用本机动态链接库 (DLL) 中的 C 样式函数。相同的数据封送处理被用于 COM 与运行时的互操作,以及“它就是能工作”(It Just Works,简称 IJW)机制。

平台调用

平台调用依赖于元数据在运行时查找导出的函数并封送其参数。下图显示了这一过程。

对非托管 DLL 函数的“平台调用”调用

clip_image001

当“平台调用”调用非托管函数时,它将依次执行以下操作:

  1. 查找包含该函数的 DLL。
  2. 将该 DLL 加载到内存中。
  3. 查找函数在内存中的地址并将其参数推到堆栈上,以封送所需的数据。

clip_image002说明

只在第一次调用函数时,才会查找和加载 DLL 并查找函数在内存中的地址。

  1. 将控制权转移给非托管函数。

平台调用会向托管调用方引发由非托管函数生成的异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值