目录
2、创建Source Insight工程,将reactos项目文件添加到工程中
3.2、通过regsvr32程序对应的.c源文件查看regsvr32程序的内部实现
VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)
https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具案例集锦(专栏文章正在更新中...)
https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)
https://blog.csdn.net/chenlycly/category_11931267.html 有时我们需要去查看一些大型项目的开源代码,但这些开源项目不支持使用我们日常用的IDE开发工具去打开,此时该选择哪个工具去查看源码呢?Source Insight工具绝对是一个不错的选择,本文我们就来介绍如何使用Source Insight工具去查看并编辑源码。
1、Source Insight介绍
Source Insight是最简洁、最强大的轻量级代码浏览编辑器之一,启动快、使用便捷,很多程序员应该都使用过!它几乎支持所有的语言,比如C、C++、ASM汇编、HTML等,能创建并维护其高性能的符号数据库,包括函数、变量、结构体、类等符号,特别对于阅读大型工程项目的代码十分方便。不过Source Insight仅仅是个代码浏览编辑器,没有包含编译器,所以没有编译代码的能力。
本文以查看reactos开源操作系统源码为例,介绍如何使用Source Insight编辑器。
2、创建Source Insight工程,将reactos项目文件添加到工程中
在菜单栏点击Project->New Project发起工程的创建。在弹出的窗口中输入工程名reactos-2,如下所示:
点击OK,进入工程的配置页面。在配置页面中,设置reactos源码的目录,并且勾选“store function-local symbols in database”选项,如下所示:
勾选该选项后,Source Insight会自动将自动将函数、变量等符号保存到数据库中,下次打开工程时还可以继续使用。
点击OK后进入“Add and Remove Project Files”页面:
该页面中默认会选中上一步选择的源码目录,点击右侧的“Add Tree”按钮,将项目目录下的所有文件都添加到reactos-2工程中。
如果项目目录中的文件比较多,将会显示添加文件的进度条:
Source Insight正是通过这些添加进来的文件中的符号信息构建出符号数据库,以方便代码的查阅的。点击Close按钮即完成工程的创建。
Source Insight每次启动时都会默认打开上一次打开的工程,如果创建了多个工程,想查看另一个工程,可以点击Project->Close Project将当前打开的工程关闭掉,然后再点击Project->Open Project,打开要查看的另一个工程。
在这里,给大家重点推荐一下我的几个热门畅销专栏:
专栏1:(该精品技术专栏的订阅量已达到430多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!)
C++软件调试与异常排查从入门到精通系列文章汇总https://blog.csdn.net/chenlycly/article/details/125529931
本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!
考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!
专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!
专栏2:
C/C++基础与进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html
以多年的开发实战为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域的多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!
专栏3:
C++常用软件分析工具从入门到精通案例集锦汇总https://blog.csdn.net/chenlycly/article/details/131405795
常用的C++软件辅助分析工具有PE工具、Dependency Walker、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!
专栏4:
VC++常用功能开发汇总https://blog.csdn.net/chenlycly/article/details/124272585
将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。
专栏5:
开源组件及数据库技术https://blog.csdn.net/chenlycly/category_12458859.html
以多年的开发实战为基础,分享一些开源组件及数据库技术!
3、使用Source Insight查看代码
在查看代码之前,可以先点击右侧的“Project Symbol List”按钮:
将工程中所有文件中的函数符号显示到列表中,以方便在列表中搜索查看。如果项目目录下的文件比较多,这个处理起来也会比较慢,也会显示一个进度条:
等待其搜索完即可。
3.1、查看reactos中的某个接口的内部实现
假设我们现在要看一下SetUnhandledExceptionFilter函数的内部实现,可以点击工具栏中如下的按钮:
在弹出窗口中输入SetUnhandledExceptionFilter,然后点击Search按钮进行搜索,搜索到如下的结果:
在搜索结果中随便找一个条目,点击左侧的那个切换按钮,就跳转到对应的文件及代码的行号上:
在源代码中点击左边的切换按钮,可以切回到搜索列表中。
然后将左键点击SetUnhandledExceptionFilter函数处,下方的视图中会自动跳转到SetUnhandledExceptionFilter函数内部的实现代码:
双击该显示SetUnhandledExceptionFilter内部实现的视图,即可跳转到SetUnhandledExceptionFilter函数内部实现处:
所以通过上述方法,我们可以去查看系统库中任意一个接口的内部实现,而reactos中的实现,和Windows NT内核的实现是很相似的,所以通过查看reactos中的代码,可以大概地看出Windows系统的一些内部实现。
3.2、通过regsvr32程序对应的.c源文件查看regsvr32程序的内部实现
之前我们在安装包中注册控件时遇到加载dll控件库失败的问题,手动使用regsvr32可以在windows的cmd窗口是可以手动加载注册成功的,所以想看一下regsvr32程序中是如何加载dll控件库,以及如何向系统注册控件的。
regsvr32程序是一个独立的exe,他有独立的main函数,有对应的.c源文件,于是点击右侧的“Project File List”按钮:
切换到文件列表页面,然后在上方的搜索框中尝试这输入regsvr32关键字,结果还真找到了regsvr32.c源文件:
双击进入到regsvr32.c源文件中,找到了regsvr32程序的main函数_tWinMain,继续向下查看_tWinMain函数的内部实现,看到了两个关键点:
一个是调用LoadLibraryEx函数去加载dll库的,传入了LOAD_WITH_ALTERED_SEARCH_PATH参数;二是通过获取库中的DllRegisterServer接口去向系统注册控件的。
所以后来我们将加载库的代码由LoadLibrary换成LoadLibraryEx(并传入LOAD_WITH_ALTERED_SEARCH_PATH参数)就解决我们的问题了。这个问题排查实例,可以参见我之前写的文章:
4、最后
本文只是简单的介绍了如何创建工程,以及创建工程过程中要注意的若干细节。文章还介绍了如何去查看代码,并给出查看代码的两个实际范例。本文只是介绍了一些主要的点,仅供参考,更多的细节还需要读者自己去使用去发现。