使用VS编程的,当我们使用MFC类、Windows API、c++标准库时,是怎么实现的?

昵称是神马 2013-07-19 10:03:18
使用VS编程的,当我们使用MFC类、Windows API、c++标准库时,是怎么实现的?

比如我的程序使用了MFC类,只需要包含相应的头文件就可以,vs是包含的这些类的cpp文件吗,然后再编译进来?如果这样的话,为什么需要选择是静态使用MFC库还是共享使用MFC库呢?


如果使用windows API的话,vs又是怎么编译链接的?

还有标准库也是包含一个头文件就可以,运行时库又是怎么编译链接进来的?
...全文
446 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称是神马 2013-07-24
  • 打赏
  • 举报
回复
引用 12 楼 adlay 的回复:
引用 11 楼 yujiefei0309 的回复:
[quote=引用 7 楼 adlay 的回复:] MFC 和 CRT 的源代码不只是说让你学习, 主要是程序崩溃在里面的函数中的时候, 你可以带源代码进行调试. 否则你就只有看汇编调试了.
生成exe的时候使用的是已经编译好的lib或者dll,没有使用这些源码,也可以使用这些源码进行调试吗?为什么可以这样?
有 pdb 文件就行了. 里面记录了哪行汇编对应源代码的哪个文件的第几行.[/quote]大神!膜拜!
www_adintr_com 2013-07-24
  • 打赏
  • 举报
回复
引用 11 楼 yujiefei0309 的回复:
引用 7 楼 adlay 的回复:
MFC 和 CRT 的源代码不只是说让你学习, 主要是程序崩溃在里面的函数中的时候, 你可以带源代码进行调试. 否则你就只有看汇编调试了.
生成exe的时候使用的是已经编译好的lib或者dll,没有使用这些源码,也可以使用这些源码进行调试吗?为什么可以这样?
有 pdb 文件就行了. 里面记录了哪行汇编对应源代码的哪个文件的第几行.
昵称是神马 2013-07-24
  • 打赏
  • 举报
回复
引用 7 楼 adlay 的回复:
MFC 和 CRT 的源代码不只是说让你学习, 主要是程序崩溃在里面的函数中的时候, 你可以带源代码进行调试. 否则你就只有看汇编调试了.
生成exe的时候使用的是已经编译好的lib或者dll,没有使用这些源码,也可以使用这些源码进行调试吗?为什么可以这样?
昵称是神马 2013-07-20
  • 打赏
  • 举报
回复
引用 7 楼 adlay 的回复:
MFC 和 CRT 的源代码不只是说让你学习, 主要是程序崩溃在里面的函数中的时候, 你可以带源代码进行调试. 否则你就只有看汇编调试了.
那就是如果选择共享MFC库的话,发布的时候就得连MFC的dll一起发布,如果运行时库选择MD的话,发布就得连运行时库的dll一起发布,而选MT则不用,是这样吗?
www_adintr_com 2013-07-20
  • 打赏
  • 举报
回复
是的
昵称是神马 2013-07-19
  • 打赏
  • 举报
回复
引用 7 楼 adlay 的回复:
MFC 和 CRT 的源代码不只是说让你学习, 主要是程序崩溃在里面的函数中的时候, 你可以带源代码进行调试. 否则你就只有看汇编调试了.
原来是这样啊,说起来程序崩溃的时候,确实会跳到一些.c的源码中去,平时没怎么注意。。。
www_adintr_com 2013-07-19
  • 打赏
  • 举报
回复
MFC 和 CRT 的源代码不只是说让你学习, 主要是程序崩溃在里面的函数中的时候, 你可以带源代码进行调试. 否则你就只有看汇编调试了.
昵称是神马 2013-07-19
  • 打赏
  • 举报
回复
引用 2 楼 akirya 的回复:
mfc是 静态库,ms预编译了几个版本的。 C++标准库是模板,直接源码编译。 api是动态库,lib只是链接时用,功能在dll中。
只有c++标准库是需要源码编译的吗?
www_adintr_com 2013-07-19
  • 打赏
  • 举报
回复
引用 3 楼 yujiefei0309 的回复:
[quote=引用 1 楼 adlay 的回复:] 都是使用的 .lib 文件. 没有使用 cpp 的说法. .lib 分两种, 一种是 .lib 文件里面包含了 cpp 编译出来的代码, 链接的时候把需要的代码拷贝到 exe 里面. mfc, crt 在选择静态的时候使用这种方式. 另外一种是 .lib 中不包含代码, 只是描述该到哪个 dll 里面怎么找对应的代码. 这种编译出来的 exe 就需要 dll 一起才能运行. mfc, crt 使用共享库的时候, 以及 Windows API 就是使用的这种方式.
windows API使用的是dll,为什么在发布程序的时候,不需要一起发布这些windows的dll呢?vs里面的这些dll在哪里?[/quote] API 的 dll 在 windows 系统的 system32 目录下, 每个系统都带着有, 当然不用和程序一起发布. 图形界面相关的 API 在 USER32.dll 里. 进程, 文件之类的操作在 kernel32.dll 里. 其余的具体看吧, MSDN 的每个函数都会说明它在哪个头文件, 哪个 lib, 哪个 dll 里的.
昵称是神马 2013-07-19
  • 打赏
  • 举报
回复
引用 2 楼 akirya 的回复:
mfc是 静态库,ms预编译了几个版本的。 C++标准库是模板,直接源码编译。 api是动态库,lib只是链接时用,功能在dll中。
也就是说,vs里面MFC的cpp文件只是提供学习研究的,在编译的时候,根据项目属性,使用的是对应的lib,而并不会编译这些源码,是这样吗?
昵称是神马 2013-07-19
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
都是使用的 .lib 文件. 没有使用 cpp 的说法. .lib 分两种, 一种是 .lib 文件里面包含了 cpp 编译出来的代码, 链接的时候把需要的代码拷贝到 exe 里面. mfc, crt 在选择静态的时候使用这种方式. 另外一种是 .lib 中不包含代码, 只是描述该到哪个 dll 里面怎么找对应的代码. 这种编译出来的 exe 就需要 dll 一起才能运行. mfc, crt 使用共享库的时候, 以及 Windows API 就是使用的这种方式.
windows API使用的是dll,为什么在发布程序的时候,不需要一起发布这些windows的dll呢?vs里面的这些dll在哪里?
  • 打赏
  • 举报
回复
mfc是 静态库,ms预编译了几个版本的。 C++标准库是模板,直接源码编译。 api是动态库,lib只是链接时用,功能在dll中。
www_adintr_com 2013-07-19
  • 打赏
  • 举报
回复
都是使用的 .lib 文件. 没有使用 cpp 的说法. .lib 分两种, 一种是 .lib 文件里面包含了 cpp 编译出来的代码, 链接的时候把需要的代码拷贝到 exe 里面. mfc, crt 在选择静态的时候使用这种方式. 另外一种是 .lib 中不包含代码, 只是描述该到哪个 dll 里面怎么找对应的代码. 这种编译出来的 exe 就需要 dll 一起才能运行. mfc, crt 使用共享库的时候, 以及 Windows API 就是使用的这种方式.
目 录 译者序 前言 第一部分 基础知识 第1章 窗口 2 1.1 窗口和API环境 2 1.1.1 三种型窗口 2 1.1.2 客户区和非客户区 3 1.2 窗口和MFC环境 4 1.3 怎样应用MFC创建一个窗口 5 1.4 怎样使用MFC销毁一个窗口 9 1.4.1 捆绑到一个已有的窗口 9 1.4.2 窗口 10 1.4.3 窗口进程 10 1.5 怎样使用MFC创建一个窗口 11 1.5.1 使用AfxRegisterWndClass () 函数注册一个窗口 11 1.5.2 使用AfxRegisterClass ()函数 创建一个窗口 12 1.6 怎样销毁一个MFC窗口 14 1.7 厂商安装的窗口 14 1.8 其他型窗口 15 1.9 桌面窗口 16 1.10 小结 16 第2章 18 2.1 基 18 2.1.1 CObject 18 2.1.2 CCmdTarget 19 2.1.3 CWnd 19 2.2 应用程序、框架、文档和视图 19 2.2.1 CWinApp(O/C/W) 20 2.2.2 CView (O/C/W) 21 2.3 其他用户界面 22 2.3.1 通用控件 23 2.3.2 菜单 23 2.3.3 对话框 24 2.3.4 控制条 24 2.3.5 属性 25 2.4 绘图 25 2.4.1 设备环境 25 2.4.2 图形对象 25 2.5 文件 26 2.6 数据库 26 2.6.1 ODBC 26 2.6.2 DAO 27 2.7 数据集 27 2.8 其他数据 27 2.9 通信 28 2.10 其他 29 2.11 小结 31 第3章 消息处理 32 3.1 发送或寄送一个消息 32 3.1.1 发送一个消息 32 3.1.2 寄送一个消息 32 3.1.3 发送一个消息与寄送一个消息 的比较 32 3.2 怎样使用MFC发送一个消息 33 3.3 怎样用MFC寄送一个消息 33 3.4 三种型的消息 34 3.4.1 窗口消息 34 3.4.2 命令消息 34 3.4.3 控件通知 34 3.5 MFC怎样接收一个寄送的消息 36 3.6 MFC怎样处理一个接收到的消息 36 3.7 处理用户界面的对象 44 3.8 创建自定义窗口消息 45 3.8.1 静态分配的窗口消息 45 3.8.2 动态分配的窗口消息 46 3.9 重定向消息 47 3.9.1 子分和超分 47 3.9.2 用MFC子分窗口 48 3.9.3 重载OnCmdMsg ( ) 49 3.9.4 使用SetWindowsHookEx ( ) 49 3.9.5 使用SetCapture ( ) 49 3.9.6 专有的消息泵 50 3.10 小结 50 第4章 绘图 51 4.1 设备环境 51 4.2 在MFC环境中创建一个设备环境 52 4.2.1 屏幕 52 4.2.2 打印机 53 4.2.3 内存 54 4.2.4 信息 54 4.3 绘图例程 55 4.3.1 画点 55 4.3.2 画线 55 4.3.3 画形状 55 4.3.4 形状填充和翻转 55 4.3.5 滚动 56 4.3.6 绘制文本 56 4.3.7 绘制位图和图标 56 4.4 绘图属性 56 4.4.1 设备环境属性 57 4.4.2 画线属性 58 4.4.3 形状填充属性 58 4.4.4 文本绘制属性 58 4.4.5 映像模式 59 4.4.6 调色板属性 62 4.4.7 混合属性 62 4.4.8 剪裁属性 63 4.4.9 位图绘制属性 64 4.5 元文件和路径 65 4.5.1 元文件 65 4.5.2 路径 66 4.6 颜色和调色板 66 4.6.1 抖动色 67 4.6.2 未经抖动色 67 4.6.3 系统调色板 67 4.6.4 使用系统调色板 68 4.6.5 动画色 71 4.7 控制什么候在哪里绘图 71 4.7.1 处理WM_PAINT 71 4.7.2 只绘制被无效化的区域 72 4.7.3 处理WM_DRAWITEM 72 4.7.4 在其他间绘图 73 4.8 小结 74 第二部分 用户界面实例 第5章 应用程序与环境 76 5.1 例1 规划MFC应用程序 76 5.2 例2 用AppWizard创建一个MFC 应用程序 79 5.3 例3 用ClassWizard创建一个 83 5.4 例4 初始化应用程序屏幕 84 5.5 例5 保存应用程序屏幕 86 5.6 例6 处理命令行选项 88 5.7 例7 动态改变应用程序图标 91 5.8 例8 提示用户优先选项 93 5.9 例9 保存和恢复用户优先选项 97 5.10 例10 终止应用程序 100 5.11 例11 创建一个启动窗口 101 第6章 菜单 107 6.1 例12 使用菜单编辑器 107 6.2 例13 添加一个菜单命令处理函数 109 6.3 例14 根据当前可视文档动态改 变菜单 110 6.4 例15 启用和禁用菜单命令 111 6.5 例16 复选标记菜单命令 112 6.6 例17 单选标记菜单命令 113 6.7 例18 动态修改菜单 114 6.8 例19 动态修改系统菜单 116 6.9 例20 触发一个菜单命令 117 6.10 例21 创建弹出式菜单 117 第7章 工具栏和状态栏 120 7.1 例22 使用工具栏编辑器 120 7.2 例23 启用和禁用工具栏按钮 122 7.3 例24 为工具栏按钮添加字 123 7.4 例25 非标准工具栏大小 128 7.5 例26 保持工具栏按钮按下 129 7.6 例27 保持工具栏按钮组中 一个按钮按下 130 7.7 例28 为工具栏添加非按钮控件 131 7.8 例29 修改应用程序的状态栏 136 7.9 例30 更新状态栏窗格 138 7.10 例31 为状态栏添加其他控件 139 第8章 视图 145 8.1 例32 滚动视图 145 8.2 例33 改变鼠标光标形状 147 8.3 例34 沙漏光标 148 8.4 例35 窗体视图 149 8.5 例36 列表视图 152 8.6 例37 动态分割一个视图 163 第9章 对话框和对话条 166 9.1 例38 使用对话框编辑器 166 9.2 例39 创建一个对话框 168 9.3 例40 模式对话框 170 9.4 例41 无模式对话框 171 9.5 例42 在无模式对话框的控件间 切换焦点 172 9.6 例43 对话框中的动画 173 9.7 例44 消息框 174 9.8 例45 对话条 176 第10章 控件窗口 182 10.1 例46 在任意位置创建一个控 件窗口 182 10.2 例47 用子分定制一个通用 控件窗口 183 10.3 例48 用超分定制一个通用 控件窗口 188 10.4 例49 在按钮上放置位图 190 10.5 例50 动态填充一个组合框 192 10.6 例51 排序一个列表控件 194 10.7 例52 分隔线控件 196 第11章 绘图 198 11.1 例53 绘制图形 198 11.2 例54 绘制文本 201 11.3 例55 从任意位置装入一个图 标并绘制 203 11.4 例56 从任意位置装入一个位 图和绘制一个位图 204 11.5 例57 从文件中创建一个位图 206 11.6 例58 创建一个自绘位图 211 第三部分 内部处理实例 第12章 消息 215 12.1 例59 添加消息处理函数或重 载MFC 216 12.2 例60 添加命令范围消息处理函数 219 12.3 例61 重定向命令消息 221 12.4 例62 创建自己的窗口消息 222 第13章 文件、串行化和数据库 225 13.1 例63 访问二进制文件 225 13.2 例64 访问标准I/O文件 227 13.3 例65 访问内存文件 228 13.4 例66 在数据实现串行化 229 13.5 例67 串行化SDI或MDI文档 235 13.6 例68 按要求串行化 240 13.7 例69 透明地更新串行化的文档 242 13.8 例70 串行化多态 246 13.9 例71 串行化数据集 248 13.10 例72 访问ODBC数据库 252 13.11 例73 访问DAO数据库 257 第14章 杂 263 14.1 例74 剪切、拷贝和粘贴文本 数据 263 14.2 例75 剪切、拷贝、粘贴多信 息文本数据 268 14.3 例76 剪切、拷贝和粘贴二进制 数据 273 14.4 例77 数组函数 280 14.5 例78 列表函数 281 14.6 例79 映像函数 283 14.7 例80 系统键盘输入 285 14.8 例81 间 288 第四部分 打包实例 第15章 库 291 15.1 例82 静态链接C/C++库 291 15.2 例83 动态链接C/C++库 295 15.3 例84 动态链接MFC扩展库 300 15.4 例85 资源库 303 第五部分 附录 附录A 控件窗口风格 305 附录B 消息、控件通知和消息映像宏 323 附录C 访问其他应用程序 328 附录D 开发中注意事项 330 附录E MFC快速参考指南 339
如果你要建立一个 Windows 应用程序,应该如何下手? 好的开端是从设计用户界面开始。首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象。Windows 用户界面有一些标准的控制,如按钮、菜单、滚动条和列表等,这对那些 Windows 用户已经是很熟悉了。 要记住的是,作为程序员必须选择一组控制并决定如何把它们安排到屏幕上。传统上,你需要在纸上做一下用户界面的草图,直到对各元素感到满意为止。这对于一些比较小的项目,以及一些大项目的早期原型阶段是可以的。 下一步,是要实现代码。为任何 Windows 平台建立应用程序,程序员都有两种选择:C 或 C++使用 C,程序员是在 Windows 应用程序界面 ( API ) 的水平上编写代码。该界面是由几百个 C 函数所组成,这些函数在Windows API 参考手册中都有介绍。对于Windows NT, API 被称为 “Win32 API”,以区别于其用于Windows 3.1的16位 API。 Microsoft 也提供了 C++ 库,它位于任何 Windows API 之上,能够使程序员的工作更容易。它就是Microsoft基本库 (MFC),该库的主要优点是效率高。它减少了大量在建立 Windows 程序必须编写的代码。同它还提供了所有一般 C++ 编程的优点,例如继承和封装。MFC 是可移植的,例如,在 Windows 3.1下编写的代码可以很容易地移植到 Windows NT 或 Windows 95 上。因此,MFC 很值得推荐的开发Windows 应用程序的方法,在本教程自始至终使用的都是 MFC。 当是使用 MFC ,你编写的代码是用来建立必要的用户界面控制并定制其外观。同你还要编写用来响应用户操作这些控制的代码。例如,如果用户单击一个按钮,你应该有代码来响应。这就是事件驱动代码,它构成了所有应用程序。一旦应用程序正确的响应了所有允许的控制,它的任务也就完成了。 你可以看出,使用 MFC 进行 Windows 编程是一件比较容易的的过程。本教程的目的是比较详细地教你如何快速建立专业级的应用程序的技术。Visual C++ 应用程序开发程序环境特别适合于使用 MFC (也有其它开发环境使用MFC,译者注),所以一起学习 MFC 和 Visual C++ 能够增强你的开发程序的能力。
现在流行的Windows下的编程语言实在不少,所以在BBS上常常有人会问:我应该使用什么编程语言呢?其中,有一个大家认可的答案:真正的程序员使用Visual C++。 的确,Visual C++是一个功能强大、灵活、方便的编程工具,可以完成其他编程语言所无法完成的任务,可以让程序员方便地实现自己的设计,尽情的发挥自己地创造性。 Visual C++的强大无比的功能除了得益于C++的特性之外,更重要的是它具有体系完整、机制灵活、功能丰富的MFC库。 所以,要讲Visual C++,必须讲MFC库。 MFC库可以分两个层次,首先是实现MFC编程框架体系的核心MFC库,然后是建立在核心MFC库基础之上的扩展库,例如,支持COM的库,实现网络功能的库,等等。随着Visual C++的不断升级,MFC库的功能越来越丰富,越来越强大,但是,MFC核心库是相对稳定的,特别是从Visual C++ 4.2开始到现在的Visual C++6.0。 本书的中心就是深入浅出地解析MFC库,分析怎么使用MFC库以及MFC库的内部实现,揭开MFC复杂、深奥的面纱,让读者对MFC有一个全面、透彻、清晰的理解。关于MFC的核心实现,主要有以下几个方面。 首先,MFC采用C++的面向对象的特征封装了Windows的对象和Win32函数,一定程度上隐蔽了底层Win32的复杂性。 其次,MFC采用消息映射的方法来处理Windows消息和事件,隐藏了Windows窗口的窗口过程,简化了消息处理的复杂性和烦琐性。 还有,MFC提供了一个以文档-视为中心的编程模式,并实现了以文档-视为中心的编程框架,简化了数据处理的过程。 而且,MFC提出了模块状态、线程状态、模块线程状态来支持多线程的编程设计和DLL的编程。 本书分别从使用MFC的角度和MFC内部设计及实现的角度讨论了上述内容,分析了MFC核心的设计和实现;然后,在此基础上,进一步讨论了MFC对一些常用实现。有关章节的内容如下: 第一章,MFC概述。 第二章,解释MFC对Win32 APIWindows对象的封装,讨论各MFC对象的使用,分析MFC对象和Windows对象的关系。 第三章,讨论CObject的特性及其实现,包括动态信息、动态创建、序列化的实现等内容。 第四章,讨论MFC的消息映射机制,分析MFC对各消息的处理,例如对Windows消息、控制通知消息、命令消息、状态更新消息、反射消息的处理等;并揭示了MFC通过消息映射手段实现C++虚拟函数机制的原理。 第五章和第六章,分析MFC编程框架启动和关闭一个应用程序的过程,揭示MFC框架的内幕,剖析以文档模板为核心创建基于文档-视的应用程序的过程,展示MFC框架处理消息和调用虚拟函数的机和位置。 第七、八、九章,介绍MFC的动态链接库、进程、线程等概念,以及MFC动态链接库的种使用,讨论MFC下多线程编程的问题。并且进一步阐述MFC的核心概念之一:状态(模块状态、线程状态、模块线程状态),揭示MFC对多线程的支持机制,MFC实现规则DLL和扩展DLL的内幕。 第十章,阐述MFC下的调试手段。 第十一章,讨论CFile,主要分析了CFile的使用和它对Win32文件函数的封装。 第十二章,讨论模式和无模式对话框,分析MFC如何设计和实现这两种对话框的功能,分析CDialog和CFormView为实现有关功能而设计的虚拟函数、消息处理函数等。 第十三章,讨论MFC工具栏和状态栏的设计及其实现,分析MFC是如何以CControlBar为基础,派生出CStatusBar、CToolBar、CDialogBar等子实现MFC工具栏和状态栏标准处理。 第十四章,讨论MFC的Socket。 第一章到第十章介绍了MFC的核心概念以及实现。在此基础上,第十一章到第十四章讨论了MFC一些常用实现。 本书的内容对MFC的初学者(最好对Visual C++Windows有所了解)和提高者都是很有帮助的。 如果您是一个初学者,可以读第一至第六章。主要目的是建立对MFC的全面理解,了解MFC框架是如何支持程序员编程的。如果有读不懂的地方,可以跳过,直接阅读有关分析的结论。特别是第五章和第六章,可以重点阅读,了解MFC是怎样来处理有关消息、调用有关虚拟函数的。 然后,还可以读第十章,第十一至第十四章。特别第十二章,可以重点阅读,它是MFC从CWnd或者CView派生出特定的实现特定功能的例子,可以帮助您进一步理解MFC,并且学习如何设计和实现一个特定的。 如果您对MFC有一定的掌握,可以进一步阅读第八和第九章,了解MFC处理DLL和线程的知识。对于第一至第六章、第十至第十四

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧