使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇对 VLD 源码包中的各文件用途做个概述。同系列文章目录可见 《内存泄漏检测工具》目录
目录说明1. 整体概览2. 文件夹 .teamcity3 文件夹 lib3.1 文件夹 cppformat(生成 libformat)3.2 文件夹 dbghelp3.3 文件夹 gtest(生成 libgtest)4 文件夹 mfc_detect(vld 辅助工程)5 文件夹 setup5.1 文件夹 dbghelp5.2 文件夹 editenv5.3 文件 build_version.bat5.4 文件 license-free.txt5.5 文件 modpath.iss5.6 文件 version.h5.7 文件 vld-setup.iss5.8 文件 WizSmallImage.bmp6 文件夹 src6.1 外部 34 个文件(vld 核心工程)6.2 文件夹 tests6.3 文件夹 tests\basics(测试工程)6.4 文件夹 tests\console(示例工程)6.5 文件夹 tests\corruption(测试工程)6.6 文件夹 tests\dynamic_app(测试工程)6.7 文件夹 tests\dynamic_dll(测试辅助工程)6.8 文件夹 tests\mfc(示例工程)6.9 文件夹 tests\mfc_dll(测试辅助工程)6.10 文件夹 tests\suite(测试工程)6.11 文件夹 tests\vld_ComTest(测试辅助工程)6.12 文件夹 tests\vld_dll1(测试辅助工程)6.13 文件夹 tests\vld_dll2(测试辅助工程)6.14 文件夹 tests\vld_main(示例工程)6.15 文件夹 tests\vld_main_test(测试工程)6.16 文件夹 tests\vld_unload(测试工程)7 其余 12 个文件7.1 文件 .editorconfig7.2 文件 .gitignore7.3 文件 .mailmap7.4 文件 appveyor.yml7.5 文件 AUTHORS.txt7.6 文件 CHANGES.txt7.7 文件 change_toolset.ps17.8 文件 COPYING.txt7.9 文件 README.md7.10 文件 vld.ini7.11 文件 vld_vs14.sln7.12 文件 vld_vs14_wo_mfc.sln1. 整体概览以 vld2.5.1
版本为例,下载源码 后,根目录下一共 5
个文件夹:.teamcity
、lib
、mfc_detect
、setup
、src
。还有 12
个文件:.editorconfig
、.gitignore
、.mailmap
、appveyor.yml
、AUTHORS.txt
、change_toolset.ps1
、CHANGES.txt
、COPYING.txt
、README.md
、vld.ini
、vld_vs14.sln
、vld_vs14_wo_mfc.sln
。
该文件夹的目录结构如下:
(相关资料图)
vld-master\.teamcity└─Vld │ project-config.xml │ ├─buildTypes │ Vld_CompileAll.xml │ Vld_DebugCrtDllWin32.xml │ ├─pluginData │ plugin-settings.xml │ └─vcsRoots Vld_HttpsGithubComKindDragonVldGitRefsHeadsMaster.xml
里面全是 xml
文件,是 teamcity
持续集成工具的配置文件,用于 VLD
项目源码的集成管理,关于该工具的介绍,可访问其官网:Jetbrains-teamcity。
该文件夹下有三个子文件夹:cppformat
、dbghelp
、gtest
。
该文件夹的目录结构如下:
vld-master\lib\cppformat ChangeLog.rst format.cc format.h format.vcxproj format.vcxproj.filters LICENSE.rst posix.cc posix.h
cppformat
是一个开源的 C++ 格式化库,仓库地址为 Github-fmtlib,在 VLD
中被用来格式化输出堆栈信息,详见 源码 callstack.cpp 第 224~275 行。
该文件夹的目录结构如下:
vld-master\lib\dbghelp├─include│ DbgHelp.h│└─lib ├─Win32 │ DbgHelp.Lib │ └─x64 DbgHelp.Lib
dbghelp
是 Windows
系统下的调试跟踪库,相关信息可见 关于 DbgHelp,在 VLD
中被用来获取堆栈信息,详见源码中 callstack.cpp、vld.cpp、vld_hooks.cpp 等文件。
该文件夹的目录结构如下:
vld-master\lib\gtest│ CHANGES│ CMakeLists.txt│ configure│ configure.ac│ CONTRIBUTORS│ LICENSE│ Makefile.am│ Makefile.in│ README│├─include│ └─gtest│ │ gtest-death-test.h│ │ gtest-message.h│ │ gtest-param-test.h│ │ gtest-param-test.h.pump│ │ gtest-printers.h│ │ gtest-spi.h│ │ gtest-test-part.h│ │ gtest-typed-test.h│ │ gtest.h│ │ gtest_pred_impl.h│ │ gtest_prod.h│ ││ └─internal│ gtest-death-test-internal.h│ gtest-filepath.h│ gtest-internal.h│ gtest-linked_ptr.h│ gtest-param-util-generated.h│ gtest-param-util-generated.h.pump│ gtest-param-util.h│ gtest-port.h│ gtest-string.h│ gtest-tuple.h│ gtest-tuple.h.pump│ gtest-type-util.h│ gtest-type-util.h.pump│├─msvc│ gtest-md.sln│ gtest.sln│ gtest.vcxproj│ gtest.vcxproj.filters│ gtest_main.vcxproj│ gtest_main.vcxproj.filters│ gtest_prod_test.vcxproj│ gtest_prod_test.vcxproj.filters│ gtest_unittest.vcxproj│ gtest_unittest.vcxproj.filters│└─src gtest-all.cc gtest-death-test.cc gtest-filepath.cc gtest-internal-inl.h gtest-port.cc gtest-printers.cc gtest-test-part.cc gtest-typed-test.cc gtest.cc gtest_main.cc
gtest
是 Google
开源的单元测试框架,仓库地址为 Github-googletest,在 VLD
中被用来测试 VLD
的各个功能,生成测试报告,详见 vld-master\src\tests 文件夹。
该文件夹的目录结构如下:
vld-master\mfc_detect│ resource.h│ StdAfx.cpp│ StdAfx.h│ vldmfc.cpp│ vldmfc.h│ vldmfc.rc│ vldmfc_detect.sln│ vldmfc_detect.vcxproj│ vldmfc_detect.vcxproj.filters│ vldmfc_detect_vs10.sln│ vldmfc_detect_vs11.sln│ vldmfc_detect_vs14.sln│└─res vldmfc.ico vldmfc.rc2
这个文件夹中的 sln
解决方案,主要用于获取各版本 mfc.dll
的 new
函数序号(即 ORDINAL
值),将获取的函数序号用于 VLD
开发,用处详见 源码 dllspatches.cpp 第 88~370 行,获取思路详见 StackOverflow-Getting-ordinal-from-function-name-programmatically,获取时对应的动态库版本及函数详见 文件 vldmfc.cpp 第 189~301 行。这个文件夹下有多个 .sln
文件,它们分别对应不同的 Microsoft Visual Studio
版本,将其用记事本或其他文本编辑器打开,可以知道对应的版本号:
vldmfc_detect.sln
对应 Visual Studio 2008
,VC
版本号为 VC9.0
。文件 vldmfc_detect_vs10.sln
对应 Visual Studio 2010
,VC
版本号为 VC10.0
。文件 vldmfc_detect_vs11.sln
对应 Visual Studio 2012
,VC
版本号为 VC11.0
。文件 vldmfc_detect_vs14.sln
对应 Visual Studio 2015
,VC
版本号为 VC14.0
。5 文件夹 setup这个文件夹中的文件主要用来打包 VLD
的安装程序,使用的安装制作软件为 Inno Setup 5.4.2
,其官网为:Inno Setup。该文件夹下有两个子文件夹:dbghelp
、editenv
。以及 6
个文件:build_version.bat
、license-free.txt
、modpath.iss
、version.h
、vld-setup.iss
、WizSmallImage.bmp
。
该文件夹的目录结构如下:
vld-master\setup\dbghelp├─x64│ dbghelp.dll│ Microsoft.DTfW.DHL.manifest│└─x86 dbghelp.dll Microsoft.DTfW.DHL.manifest
dbghelp
下存储的是 VLD
依赖的 dbghelp
动态库及对应的清单文件(.manifest
文件),安装 VLD
时会被存储到 VLD
安装目录下(详见 .\Visual Leak Detector\bin
)。
该文件夹的目录结构如下,只有一个 editenv.dll
文件:
vld-master\setup\editenv editenv.dll
这个库是 Dan Moulding
旧版 VLD
修改环境变量时使用的动态库,详见 StackOverflow-programmatically-adding-a-directory-to-windows-path-environment-variable,对应的仓库为 Github-editenv。KindDragon
新版 VLD
是没有用到这个文件的,使用的是文件 modpath.iss
,另一种方法。
文件 build_version.bat
是批处理脚本,用于 Inno Setup
快速打包 VLD
安装器。
文件 license-free.txt
是要在 VLD
安装程序中显示的许可信息。
文件 modpath.iss
是 Inno Setup
脚本,采用 Pascal
编写,用于 VLD
安装时修改 Path
环境变量。
文件 version.h
存储 VLD
的版本信息,被 VLD
源码引用,详见 源码 vldint.h 第 40 行。
文件 vld-setup.iss
是 Inno Setup
生成的脚本,用于指导生成 VLD
安装器,默认情况下,在安装完成后会生成对应的卸载器 unins000.dat
与 unins000.exe
,详见 VLD
安装目录。
文件 WizSmallImage.bmp
是安装程序右上角显示的图像。
这个文件夹用来存储 VLD
库的核心源代码,以及 VLD
功能测试的源代码。有一个 tests
子文件夹及另外 34
个文件。
这 34
个文件分别为:
vld-master\src callstack.cpp callstack.h criticalsection.h crtmfcpatch.h dbghelp.h dllspatches.cpp loaderlock.h map.h ntapi.cpp ntapi.h resource.h runalltests.bat runtests.bat set.h stdafx.cpp stdafx.h tree.h utility.cpp utility.h vld.cpp vld.dll.dependency.x64.manifest vld.dll.dependency.x86.manifest vld.h vld.natvis vld.rc vld.vcxproj vld.vcxproj.filters vldallocator.h vldapi.cpp vldheap.cpp vldheap.h vldint.h vld_def.h vld_hooks.cpp
其中有 17
个 .h
文件、9
个 .cpp
文件,都是 VLD
核心源码的一部分,以下 6
个文件用于 VLD
项目配置、依赖库的版本控制等:
vld.natvisvld.rcvld.vcxprojvld.vcxproj.filtersvld.dll.dependency.x64.manifestvld.dll.dependency.x86.manifest
以下两个批处理文件用于 VLD
的功能批量测试,并自动生成测试报告。
runalltests.batruntests.bat
6.2 文件夹 tests这个文件夹用来存储 VLD
的测试工程代码以及使用示例工程代码,有 14
个子文件夹及另外 2
个文件。
Common.props
是 VS
的属性管理文件,被多个 VLD
测试工程所使用,使用介绍可参考 .vcxproj 和 .props 文件结构。copydlls.bat
是批处理脚本,被用做为 VLD
测试工程的预先生成事件(Pre-Build Event),将 vld.ini
、vld_xx.dll
、vld_xx.pdb
、dbghelp.dll
、Microsoft.DTfW.DHL.manifest
这 5
个依赖文件复制到指定目录。6.3 文件夹 tests\basics(测试工程)该文件夹的目录结构如下:
vld-master\src\tests\basics Allocs.cpp Allocs.h basics.cpp basics.vcxproj basics.vcxproj.filters basics_disabled.cpp stdafx.cpp stdafx.h targetver.h
这是一个 VLD
测试工程,用来测试:当使用不同的内存分配函数(例如 malloc
、calloc
、placement new
等)时,VLD
能否正确检测出内存泄漏。被测的内存分配函数详见 Allocs.h 文件 与 Allocs.cpp 文件。测试用例详见 basics.cpp 文件 与 basics_disabled.cpp 文件。
该文件夹的目录结构如下:
vld-master\src\tests\console main.c main.cpp README.md vldconsole.sln vldconsole.vcxproj vldconsole.vcxproj.filters vldconsole_vs10.sln
这是一个 VLD
示例工程,用来演示如何在普通的控制台程序中使用 VLD
库,演示目标为:VLD
库不仅能检测出 C
程序中 malloc
引起的泄漏(详见 main.c 文件),也能检测出 C++
程序中 new
引起的泄漏(详见 main.cpp 文件)。
vldconsole.sln
对应 Visual Studio 2008
,VC
版本号为 VC9.0
。文件 vldconsole_vs10.sln
对应 Visual Studio 2010
,VC
版本号为 VC10.0
。6.5 文件夹 tests\corruption(测试工程)该文件夹的目录结构如下:
vld-master\src\tests\corruption corruption.cpp corruption.vcxproj corruption.vcxproj.filters stdafx.cpp stdafx.h targetver.h Tests.cpp Tests.h
这是一个 VLD
测试工程,用来测试:当内存分配函数与释放函数不匹配(例如 malloc
与 delete
配对使用)、分配的堆与释放的堆不匹配时,VLD
能否正确检测出内存泄漏。被测的失配用法详见 Tests.h 文件 与 Tests.cpp 文件。测试用例详见 corruption.cpp 文件。
该文件夹的目录结构如下:
vld-master\src\tests\dynamic_app dynamic_app.cpp dynamic_app.vcxproj dynamic_app.vcxproj.filters LoadTests.cpp LoadTests.h stdafx.cpp stdafx.h targetver.h ThreadTest.cpp ThreadTests.h
这是一个 VLD
测试工程,用来测试:当动态加载普通动态库与 MFC
动态库时,VLDEnableModule
及 VLDResolveCallstacks
功能是否正常,以及当在多线程中加载动态库时,VLDGetLeaksCount
及泄漏检测功能是否正常。被测的动态加载用法详见 LoadTests.h 文件 与 LoadTests.cpp 文件,被测的多线程用法详见 ThreadTests.h 文件 与 ThreadTest.cpp 文件。测试用例详见 dynamic_app.cpp 文件。这一测试工程需依赖 dynamic.dll
与 test_mfc.dll
这两个动态库,它们由 tests
文件夹下的另外两个工程生成。
该文件夹的目录结构如下:
vld-master\src\tests\dynamic_dll dllmain.cpp dynamic.cpp dynamic.h dynamic.vcxproj dynamic.vcxproj.filters stdafx.cpp stdafx.h targetver.h
这是一个 VLD
测试辅助工程,用来生成动态库 dynamic.dll
,然后将生成的动态库给其他测试工程做 VLD
功能测试。库中用三种方式(malloc
、new
、new[]
)分别产生 6
处泄漏,一共 18
处泄漏,且库源码中未包含 vld.h
,详见 dynamic.h 文件 与 dynamic.cpp 文件。
该文件夹的目录结构如下:
vld-master\src\tests\mfc│ resource.h│ StdAfx.cpp│ StdAfx.h│ vldmfc.cpp│ vldmfc.h│ vldmfc.rc│ vldmfc.sln│ vldmfc.vcxproj│ vldmfc.vcxproj.filters│ vldmfcdlg.cpp│ vldmfcdlg.h│ vldmfc_vs10.sln│└─res vldmfc.ico vldmfc.rc2
这是一个 VLD
示例工程,用来演示如何在 MFC
程序中使用 VLD
库,演示目标为:VLD
库能检测出 MFC
程序中的内存泄漏。它通过模态显示一个选择对话框(详见 vldmfcdlg.h 文件 与 vldmfcdlg.cpp 文件),让用户选择是否故意产生一个内存泄漏(详见 vldmfc.h 文件 与 vldmfc.cpp 文件),然后通过查看控制台的 VLD
输出,来演示其内存泄漏检测功能。
vldmfc.sln
对应 Visual Studio 2008
,VC
版本号为 VC9.0
。文件 vldmfc_vs10.sln
对应 Visual Studio 2010
,VC
版本号为 VC10.0
。6.9 文件夹 tests\mfc_dll(测试辅助工程)该文件夹的目录结构如下:
vld-master\src\tests\mfc_dll│ mfc.cpp│ mfc.def│ mfc.h│ mfc.rc│ mfc.vcxproj│ mfc.vcxproj.filters│ Resource.h│ stdafx.cpp│ stdafx.h│ targetver.h│└─res mfc.rc2
这是一个 VLD
测试辅助工程,用来生成动态库 test_mfc.dll
,然后将生成的动态库给其他测试工程做 VLD
功能测试。库中用三种方式(new
、CString initialisation with string
、new[]
)产生一共 11
处泄漏,且库源码中未包含 vld.h
,详见 mfc.cpp 文件。
该文件夹的目录结构如下:
vld-master\src\tests\suite testsuite.cpp testsuite.vcxproj testsuite.vcxproj.filters testsuite.vcxproj.vspscc
这是一个 VLD
测试工程,只有一个 cpp
文件,用来测试:在多线程(使用 _beginthreadex
创建线程)、多种分配方式(例如 new
、malloc
、HeapAlloc
等)、不同递归深度、随机分配内存、随机释放内存时,VLD
能否按需正确检测出内存泄漏(测试过程中也会随机地配对使用 VLDDisable
与 VLDRestore
忽略一些泄漏,详见 testsuite.cpp 第 220~225 行)。
该文件夹的目录结构如下:
vld-master\src\tests\vld_ComTest ComTest.aps ComTest.cpp ComTest.def ComTest.idl ComTest.rc ComTest.rgs ComTest.sln ComTest_vs14.vcxproj ComTest_vs14.vcxproj.filters dlldata.c dllmain.cpp dllmain.h MyMath.cpp MyMath.h MyMath.rgs Resource.h stdafx.cpp stdafx.h targetver.h xdlldata.c xdlldata.h
这是一个 VLD
测试辅助工程,用于测试 VLD
能否检测到 COM-based leaks
,工程运行后生成了一个 COM
组件 ComTest.dll
,源文件 stdafx.h
中有 #include
,但其接口函数并没有故意产生内存泄漏(如下,详见 MyMath.cpp 文件),且在 tests
文件夹下未发现有工程使用了 ComTest.dll
。
STDMETHODIMP CMyMath::Test(void){AFX_MANAGE_STATE(AfxGetStaticModuleState());return S_OK;}
6.12 文件夹 tests\vld_dll1(测试辅助工程)该文件夹的目录结构如下:
vld-master\src\tests\vld_dll1 dllmain.cpp stdafx.cpp stdafx.h targetver.h vld_dll1_vs14.vcxproj vld_dll1_vs14.vcxproj.filters
这是一个 VLD
测试辅助工程,用来生成动态库 vld_dll1.dll
,然后将生成的动态库给其他测试工程做 VLD
功能测试,这个库源码中包含了 vld.h
,且使用了 VLD_FORCE_ENABLE
宏。库中用 malloc
产生 1
处泄漏,详见 dllmain.cpp 文件。
该文件夹的目录结构如下:
vld-master\src\tests\vld_dll2 dllmain.cpp stdafx.cpp stdafx.h targetver.h vld_dll2_vs14.vcxproj vld_dll2_vs14.vcxproj.filters
这是一个 VLD
测试辅助工程,用来生成动态库 vld_dll2.dll
,然后将生成的动态库给其他测试工程做 VLD
功能测试。与 vld_dll1.dll
一样,这个库源码中(stdafx.h 文件)包含了 vld.h
,且使用了 VLD_FORCE_ENABLE
宏。库中用 malloc
产生 1
处泄漏,详见 dllmain.cpp 文件。
该文件夹的目录结构如下:
vld-master\src\tests\vld_main stdafx.cpp stdafx.h targetver.h vld_main.cpp vld_main_vs14.vcxproj vld_main_vs14.vcxproj.filters
这是一个 VLD
示例工程,工程运行后生成了 vld_main.exe
,演示目标为:VLD
能检测出全局静态变量的内存泄漏,详见 vld_main.cpp 文件。
该文件夹的目录结构如下:
vld-master\src\tests\vld_main_test stdafx.cpp stdafx.h targetver.h vld_main_test.cpp vld_main_test_vs14.vcxproj vld_main_test_vs14.vcxproj.filters
这是一个 VLD
测试工程,用来测试:VLD
对全局静态变量的泄漏检测功能是否正常,被测程序为 tests\vld_main
工程生成的 vld_main.exe
。测试用例详见 vld_main_test.cpp 文件。
该文件夹的目录结构如下:
vld-master\src\tests\vld_unload stdafx.cpp stdafx.h targetver.h vld_unload.cpp vld_unload_vs14.vcxproj vld_unload_vs14.vcxproj.filters
这是一个 VLD
测试工程,用来测试:主工程未包含 vld.h
,但多个被调的动态库包含 vld.h
时,对各 dll
进行动态安装、动态卸载的情况下,VLD
的泄漏检测功能是否正常。测试用例详见 vld_unload.cpp 文件。这一测试工程需依赖 vld_dll1.dll
与 vld_dll2.dll
这两个动态库,它们由 tests
文件夹下的另外两个工程生成。
源码根目录下还有以下 12
个文件:
vld-master .editorconfig .gitignore .mailmap appveyor.yml AUTHORS.txt CHANGES.txt change_toolset.ps1 COPYING.txt README.md vld.ini vld_vs14.sln vld_vs14_wo_mfc.sln
7.1 文件 .editorconfig这个文件用来统一代码样式,帮助开发者维护编辑器编码风格,以下几个资料对理解该文件的作用有帮助:
牧之博客-.editorconfig 文件。Microsoft-使用 EditorConfig 创建可移植的自定义编辑器设置。EditorConfig。7.2 文件 .gitignore这个文件用来指明源码上传 Git
时,哪些文件应该被忽略,这些文件无需纳入 Git
管理。Github-gitignore 上有一些 .gitignore
文件模板,需要时可以拿来用。
这个文件用于将作者姓名和电子邮件映射到单个规范值,以下几个资料对理解该文件的作用有帮助:
腾讯云开发者社区-如何使用git .mailmap显示作者组织?。w3cschool-git-check-mailmap。7.4 文件 appveyor.yml这个文件用于持续集成服务,自动构建项目,以下几个资料对理解该文件的作用有帮助:
appveyor-docs。51CTO博客-使用Appveyor持续集成博客。7.5 文件 AUTHORS.txt这个文件用于罗列开发者清单。
7.6 文件 CHANGES.txt这个文件用于记录版本迭代日志,各版本更新提要。
7.7 文件 change_toolset.ps1这个文件是一个 PowerShell
脚本,阅读内容可知这个脚本是用来批量更改 Toolset
值的。除 format.vcxproj
与 vld.vcxproj
这两个文件外,它能修改当前目录及其所有子文件夹中的 vcxproj
文件,将文件中的
值修改为指定值。同时,修改 .\src\tests\Common.props
文件中的
值为指定值。关于
,可参考 Microsoft-platform-toolset 以及 关于VS项目属性: Target Platform Version 和 Platform ToolSet。
这是一份许可说明文件,内容是 LGPL 2.1
开源协议。
这个文件里对 VLD
的功能用途做了大致介绍,与 Github-VLD 上的介绍内容一样。
这个是 VLD
库的配置文件,库的使用者需要用到,使用方法详见本人同系列文章。
这个文件是 VLD
项目的解决方案文件,需用 Visual Studio 2015
打开,内含 16
个子项目,包含 VLD
库项目、测试项目、示例项目,如下图所示:
各项目的简要介绍见下表,可以根据项目文件夹名称上翻本文章到介绍处。
标号 | 项目名称 | 对应文件夹名称 | 项目简介 |
---|---|---|---|
1 | dynamic | vld-master\src\tests\dynamic_dll | 测试用 - 依赖库 |
2 | test_mfc | vld-master\src\tests\mfc_dll | 测试用 - 依赖库 |
3 | vld_dll1 | vld-master\src\tests\vld_dll1 | 测试用 - 依赖库 |
4 | vld_dll2 | vld-master\src\tests\vld_dll2 | 测试用 - 依赖库 |
5 | libformat | vld-master\lib\cppformat | VLD - 输出格式化库 |
6 | libgtest | vld-master\lib\gtest\msvc | Google Test 测试框架 |
7 | ComTest | vld-master\src\tests\vld_ComTest | 测试用-依赖库 |
8 | corruption | vld-master\src\tests\corruption | 库功能测试 |
9 | dynamic_app | vld-master\src\tests\dynamic_app | 库功能测试 |
10 | test_basics | vld-master\src\tests\basics | 库功能测试 |
11 | testsuite | vld-master\src\tests\suite | 库功能测试 |
12 | vld_main | vld-master\src\tests\vld_main | 用法示例 |
13 | vld_main_test | vld-master\src\tests\vld_main_test | 库功能测试 |
14 | vld_unload | vld-master\src\tests\vld_unload | 库功能测试 |
15 | vldmfc | vld-master\src\tests\mfc | 用法示例 |
16 | vld | vld-master\src | VLD - 库 |
这个文件也是 VLD
项目的解决方案文件,需用 Visual Studio 2015
打开,内含 13
个子项目,包含 VLD
库项目、测试项目、示例项目,文件名中的 wo
是 without
的简写,表示没有 MFC
相关的测试项目(除了没有 test_mfc
、ComTest
、vldmfc
这三个项目外,其他地方与 vld_vs14.sln
一样),如下图所示:
标签: