Skip to content

Commit d2dcef6

Browse files
Bug #49, msvcrt模式_beginthread创建的线程无法获取ptd
1 parent 9bc7bae commit d2dcef6

File tree

7 files changed

+219
-85
lines changed

7 files changed

+219
-85
lines changed

.github/workflows/Build&Test.yml

+5-5
Original file line numberDiff line numberDiff line change
@@ -139,15 +139,15 @@ jobs:
139139
$Env:PROCDUMP_PATH="$Env:GITHUB_WORKSPACE\Tools"
140140
141141
# 编译单元测试项目
142-
&msbuild UnitTest\UnitTest.vcxproj "-p:Configuration=Dynamic;Platform=Win32;SolutionDir=$Env:GITHUB_WORKSPACE\\"
142+
&msbuild UnitTest\UnitTest.vcxproj "-p:Configuration=Static;Platform=Win32;SolutionDir=$Env:GITHUB_WORKSPACE\\"
143143
if($lastexitcode -ne 0)
144144
{
145145
throw "单元测试编译失败!退出代码:$lastexitcode"
146146
}
147147
148148
$RunFaild = 0
149149
150-
&vstest.console Dynamic\UnitTest.dll "/logger:trx;LogFileName=UnitTest.trx" --Parallel "/Blame:CollectDump;CollectAlways=false;DumpType=full"
150+
&vstest.console Static\UnitTest.dll "/logger:trx;LogFileName=UnitTest.trx" --Parallel "/Blame:CollectDump;CollectAlways=false;DumpType=full"
151151
if($lastexitcode -ne 0)
152152
{
153153
$RunFaild = 1
@@ -217,9 +217,9 @@ jobs:
217217
path: |
218218
TestResults/**/*.dmp
219219
TestResults/**/Sequence_*.xml
220-
Dynamic\UnitTest.dll
221-
Dynamic\UnitTest.pdb
222-
Dynamic\*.log
220+
Static\UnitTest.dll
221+
Static\UnitTest.pdb
222+
Static\*.log
223223
UnitTest/SymbolBuildTest/.test/**/Build.log
224224
*.7z
225225

Build.proj

+5-2
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,16 @@
3939
</Target>
4040

4141
<Import Project="$(VCInstallDir)\Auxiliary\Build\Microsoft.VCToolsVersion.default.props" />
42-
43-
<Target Name="Build">
42+
43+
<Target Name="DownloadTools" BeforeTargets="Build;PackRedist">
4444
<!--下载LibMaker-->
4545
<DownloadFile
4646
Condition="!Exists('$(MSBuildThisFileDirectory)Tools\LibMaker.exe')"
4747
SourceUrl="https://github.com/Chuyu-Team/LibMaker/releases/download/v1.0.2/LibMaker.exe"
4848
DestinationFolder="$(MSBuildThisFileDirectory)Tools" DestinationFileName="LibMaker.exe"/>
49+
</Target>
50+
51+
<Target Name="Build">
4952

5053
<!--提取所有需要编译的配置-->
5154
<MSBuild Projects="%(ProjectReferenceWork.Identity)" StopOnFirstFailure="True" Properties="_GetProjectAllConfiguration=true;ForceImportAfterCppTargets=$(MSBuildThisFileFullPath)" Targets="_GetProjectAllConfiguration">

Sources/ucrt/inc/corecrt_internal.h

+57-10
Original file line numberDiff line numberDiff line change
@@ -1489,23 +1489,70 @@ __declspec(dllimport) void __cdecl _amsg_exit(
14891489

14901490
__acrt_ptd* __cdecl __acrt_getptd_head(void);
14911491
#ifdef __BuildWithMSVCRT
1492-
__forceinline __acrt_ptd* __cdecl __acrt_getptd_noexit(void)
1492+
__declspec(noinline) __inline __acrt_ptd* __cdecl __acrt_getptd_noexit(void)
14931493
{
1494-
__acrt_ptd* ptd = (__acrt_ptd*)(((unsigned char*)_errno()) - FIELD_OFFSET(__acrt_ptd, _terrno));
1495-
1496-
/*
1497-
当 _thandle = -1,这表明此线程的ptd通过msvcrt.dll begin_thread 或者 __getptd_noexit 创建。
1498-
当 _thandle = 0,这表明此线程的ptd通过msvcrt.dll的DllMain创建。
1499-
当 _thandle = 其他,这表明msvcrt.dll内部内存已经申请失败。
1500-
*/
1501-
return (ptd->_thandle == (uintptr_t)-1/*Current Thread Handle*/ || ptd->_thandle == 0) ? ptd : (__acrt_ptd*)NULL;
1494+
// ptd->_thandle 一共有3中情况:
1495+
// 当 _thandle = -1,这表明此线程的ptd通过msvcrt.dll _beginthreadex 或者 __getptd_noexit 创建。
1496+
// 当 _thandle = 0,这表明此线程的ptd通过msvcrt.dll的DllMain创建。
1497+
// 当 _thandle = 其他,这可能是通过_beginthread启动的线程,它是实际有效的线程句柄。但是也有可能是内存申请失败了。
1498+
1499+
// 我们不要再根据 ptd->_thandle 判断__getptd_noexit 内存是否申请失,因为我们必须考虑 _beginthread 创建的线程。
1500+
// 这时必须借助GetThreadId,可是它开销是惊人的,不容易做到快速判断。
1501+
// 结合总总情况,我们现在通过判断 _errno() 返回地址是否在msvcrt模块范围来判断 __getptd_noexit 是否发生内存申请失败。
1502+
// 具体Bug请参考:https://github.com/Chuyu-Team/VC-LTL5/issues/49
1503+
typedef struct _DllAddressInfo
1504+
{
1505+
uintptr_t uBaseAddress;
1506+
uintptr_t uEndAddress;
1507+
} DllAddressInfo;
1508+
1509+
static DllAddressInfo s_DllAddressCache;
1510+
1511+
if (s_DllAddressCache.uBaseAddress == 0)
1512+
{
1513+
DllAddressInfo _DllAddressInfo = { (uintptr_t)-1, (uintptr_t)-1};
1514+
MEMORY_BASIC_INFORMATION _BaseInfo;
1515+
if (VirtualQuery(&_amsg_exit, &_BaseInfo, sizeof(_BaseInfo)))
1516+
{
1517+
_DllAddressInfo.uBaseAddress = (uintptr_t)_BaseInfo.AllocationBase;
1518+
_DllAddressInfo.uEndAddress = (uintptr_t)_BaseInfo.BaseAddress + _BaseInfo.RegionSize;
1519+
1520+
for (; VirtualQuery((void*)(_DllAddressInfo.uEndAddress + 1), &_BaseInfo, sizeof(_BaseInfo));)
1521+
{
1522+
if (_DllAddressInfo.uBaseAddress != (uintptr_t)_BaseInfo.AllocationBase)
1523+
break;
1524+
1525+
_DllAddressInfo.uEndAddress = (uintptr_t)_BaseInfo.BaseAddress + _BaseInfo.RegionSize;
1526+
}
1527+
}
1528+
1529+
#if defined(_X86_) || defined(_ARM_)
1530+
static_assert(sizeof(s_DllAddressCache) == sizeof(LONGLONG), "");
1531+
InterlockedCompareExchange64((volatile LONGLONG*)&s_DllAddressCache, *(LONGLONG*)&_DllAddressInfo, 0);
1532+
#elif defined(_IA64_) || defined(_AMD64_) || defined(_ARM64_)
1533+
// AMD 早期不支持 InterlockedCompareExchange128,所以不用……
1534+
InterlockedCompareExchange64((volatile LONGLONG*)&s_DllAddressCache.uEndAddress, _DllAddressInfo.uEndAddress, 0);
1535+
InterlockedCompareExchange64((volatile LONGLONG*)&s_DllAddressCache.uBaseAddress, _DllAddressInfo.uBaseAddress, 0);
1536+
#else
1537+
#error unsrpport!
1538+
#endif
1539+
}
1540+
1541+
uintptr_t _p_errno_value = (uintptr_t)_errno();
1542+
if (_p_errno_value == 0 || (s_DllAddressCache.uBaseAddress <= _p_errno_value && _p_errno_value < s_DllAddressCache.uEndAddress))
1543+
{
1544+
return NULL;
1545+
}
1546+
1547+
__acrt_ptd* ptd = (__acrt_ptd*)(((unsigned char*)_p_errno_value) - FIELD_OFFSET(__acrt_ptd, _terrno));
1548+
return ptd;
15021549
}
15031550
#else
15041551
__acrt_ptd* __cdecl __acrt_getptd_noexit(void);
15051552
#endif
15061553

15071554
#ifdef __BuildWithMSVCRT
1508-
__forceinline __acrt_ptd* __cdecl __acrt_getptd(void)
1555+
__declspec(noinline) __inline __acrt_ptd* __cdecl __acrt_getptd(void)
15091556
{
15101557
__acrt_ptd* ptd = __acrt_getptd_noexit();
15111558

UnitTest/UnitTest.vcxproj

+39-32
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
33
<ItemGroup Label="ProjectConfigurations">
4-
<ProjectConfiguration Include="DDynamic|Win32">
5-
<Configuration>DDynamic</Configuration>
4+
<ProjectConfiguration Include="DStatic|Win32">
5+
<Configuration>DStatic</Configuration>
66
<Platform>Win32</Platform>
77
</ProjectConfiguration>
8-
<ProjectConfiguration Include="Dynamic|Win32">
9-
<Configuration>Dynamic</Configuration>
8+
<ProjectConfiguration Include="Static|Win32">
9+
<Configuration>Static</Configuration>
1010
<Platform>Win32</Platform>
1111
</ProjectConfiguration>
12-
<ProjectConfiguration Include="DDynamic|x64">
13-
<Configuration>DDynamic</Configuration>
12+
<ProjectConfiguration Include="DStatic|x64">
13+
<Configuration>DStatic</Configuration>
1414
<Platform>x64</Platform>
1515
</ProjectConfiguration>
16-
<ProjectConfiguration Include="Dynamic|x64">
17-
<Configuration>Dynamic</Configuration>
16+
<ProjectConfiguration Include="Static|x64">
17+
<Configuration>Static</Configuration>
1818
<Platform>x64</Platform>
1919
</ProjectConfiguration>
2020
</ItemGroup>
@@ -27,29 +27,31 @@
2727
<ProjectSubType>NativeUnitTestProject</ProjectSubType>
2828
</PropertyGroup>
2929
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
30-
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DDynamic|Win32'" Label="Configuration">
30+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DStatic|Win32'" Label="Configuration">
3131
<ConfigurationType>DynamicLibrary</ConfigurationType>
3232
<UseDebugLibraries>true</UseDebugLibraries>
3333
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
3434
<CharacterSet>Unicode</CharacterSet>
3535
<UseOfMfc>false</UseOfMfc>
36+
<WindowsTargetPlatformMinVersion>5.1.2600.0</WindowsTargetPlatformMinVersion>
3637
</PropertyGroup>
37-
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Dynamic|Win32'" Label="Configuration">
38+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Static|Win32'" Label="Configuration">
3839
<ConfigurationType>DynamicLibrary</ConfigurationType>
3940
<UseDebugLibraries>false</UseDebugLibraries>
4041
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
4142
<WholeProgramOptimization>true</WholeProgramOptimization>
4243
<CharacterSet>Unicode</CharacterSet>
4344
<UseOfMfc>false</UseOfMfc>
4445
</PropertyGroup>
45-
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DDynamic|x64'" Label="Configuration">
46+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DStatic|x64'" Label="Configuration">
4647
<ConfigurationType>DynamicLibrary</ConfigurationType>
4748
<UseDebugLibraries>true</UseDebugLibraries>
4849
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
4950
<CharacterSet>Unicode</CharacterSet>
5051
<UseOfMfc>false</UseOfMfc>
52+
<WindowsTargetPlatformMinVersion>5.1.2600.0</WindowsTargetPlatformMinVersion>
5153
</PropertyGroup>
52-
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Dynamic|x64'" Label="Configuration">
54+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Static|x64'" Label="Configuration">
5355
<ConfigurationType>DynamicLibrary</ConfigurationType>
5456
<UseDebugLibraries>false</UseDebugLibraries>
5557
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
@@ -62,60 +64,62 @@
6264
</ImportGroup>
6365
<ImportGroup Label="Shared">
6466
</ImportGroup>
65-
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='DDynamic|Win32'">
66-
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
67+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='DStatic|Win32'">
68+
<Import Project="..\VC-LTL helper for Visual Studio.props" />
6769
</ImportGroup>
68-
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Dynamic|Win32'">
69-
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
70+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Static|Win32'">
71+
<Import Project="..\VC-LTL helper for Visual Studio.props" />
7072
</ImportGroup>
71-
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='DDynamic|x64'">
72-
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
73+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='DStatic|x64'">
74+
<Import Project="..\VC-LTL helper for Visual Studio.props" />
7375
</ImportGroup>
74-
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Dynamic|x64'">
75-
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
76+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Static|x64'">
77+
<Import Project="..\VC-LTL helper for Visual Studio.props" />
7678
</ImportGroup>
7779
<PropertyGroup Label="UserMacros" />
78-
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DDynamic|Win32'">
80+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DStatic|Win32'">
7981
<LinkIncremental>true</LinkIncremental>
8082
</PropertyGroup>
81-
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DDynamic|x64'">
83+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DStatic|x64'">
8284
<LinkIncremental>true</LinkIncremental>
8385
</PropertyGroup>
84-
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Dynamic|Win32'">
86+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Static|Win32'">
8587
<LinkIncremental>false</LinkIncremental>
8688
</PropertyGroup>
87-
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Dynamic|x64'">
89+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Static|x64'">
8890
<LinkIncremental>false</LinkIncremental>
8991
</PropertyGroup>
90-
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DDynamic|Win32'">
92+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DStatic|Win32'">
9193
<ClCompile>
9294
<PrecompiledHeader>Use</PrecompiledHeader>
9395
<WarningLevel>Level3</WarningLevel>
9496
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
9597
<PreprocessorDefinitions>SymbolBuildTestPath=LR"($(ProjectDir)SymbolBuildTest\)";MSBuildBinPath=LR"($(MSBuildBinPath)\)";VC_LTL_ROOT=LR"($(ProjectDir)..\)";VCToolsInstallDir=LR"($(VCToolsInstallDir))";CurrentUniversalCRTSdkDir=LR"($(UniversalCRTSdkDir)Lib\$(WindowsTargetPlatformVersion)\)";WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
9698
<UseFullPaths>true</UseFullPaths>
9799
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
100+
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
98101
</ClCompile>
99102
<Link>
100103
<SubSystem>Windows</SubSystem>
101104
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
102105
</Link>
103106
</ItemDefinitionGroup>
104-
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DDynamic|x64'">
107+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DStatic|x64'">
105108
<ClCompile>
106109
<PrecompiledHeader>Use</PrecompiledHeader>
107110
<WarningLevel>Level3</WarningLevel>
108111
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
109112
<PreprocessorDefinitions>SymbolBuildTestPath=LR"($(ProjectDir)SymbolBuildTest\)";MSBuildBinPath=LR"($(MSBuildBinPath)\)";VC_LTL_ROOT=LR"($(ProjectDir)..\)";VCToolsInstallDir=LR"($(VCToolsInstallDir))";CurrentUniversalCRTSdkDir=LR"($(UniversalCRTSdkDir)Lib\$(WindowsTargetPlatformVersion)\)";_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
110113
<UseFullPaths>true</UseFullPaths>
111114
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
115+
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
112116
</ClCompile>
113117
<Link>
114118
<SubSystem>Windows</SubSystem>
115119
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
116120
</Link>
117121
</ItemDefinitionGroup>
118-
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Dynamic|Win32'">
122+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Static|Win32'">
119123
<ClCompile>
120124
<PrecompiledHeader>Use</PrecompiledHeader>
121125
<WarningLevel>Level3</WarningLevel>
@@ -125,6 +129,7 @@
125129
<PreprocessorDefinitions>SymbolBuildTestPath=LR"($(ProjectDir)SymbolBuildTest\)";MSBuildBinPath=LR"($(MSBuildBinPath)\)";VC_LTL_ROOT=LR"($(ProjectDir)..\)";VCToolsInstallDir=LR"($(VCToolsInstallDir))";CurrentUniversalCRTSdkDir=LR"($(UniversalCRTSdkDir)Lib\$(WindowsTargetPlatformVersion)\)";WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
126130
<UseFullPaths>true</UseFullPaths>
127131
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
132+
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
128133
</ClCompile>
129134
<Link>
130135
<SubSystem>Windows</SubSystem>
@@ -133,7 +138,7 @@
133138
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
134139
</Link>
135140
</ItemDefinitionGroup>
136-
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Dynamic|x64'">
141+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Static|x64'">
137142
<ClCompile>
138143
<PrecompiledHeader>Use</PrecompiledHeader>
139144
<WarningLevel>Level3</WarningLevel>
@@ -143,6 +148,7 @@
143148
<PreprocessorDefinitions>SymbolBuildTestPath=LR"($(ProjectDir)SymbolBuildTest\)";MSBuildBinPath=LR"($(MSBuildBinPath)\)";VC_LTL_ROOT=LR"($(ProjectDir)..\)";VCToolsInstallDir=LR"($(VCToolsInstallDir))";CurrentUniversalCRTSdkDir=LR"($(UniversalCRTSdkDir)Lib\$(WindowsTargetPlatformVersion)\)";NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
144149
<UseFullPaths>true</UseFullPaths>
145150
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
151+
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
146152
</ClCompile>
147153
<Link>
148154
<SubSystem>Windows</SubSystem>
@@ -154,11 +160,12 @@
154160
<ItemGroup>
155161
<ClCompile Include="detect_mismatch_UnitTest.cpp" />
156162
<ClCompile Include="pch.cpp">
157-
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='DDynamic|Win32'">Create</PrecompiledHeader>
158-
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='DDynamic|x64'">Create</PrecompiledHeader>
159-
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Dynamic|Win32'">Create</PrecompiledHeader>
160-
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Dynamic|x64'">Create</PrecompiledHeader>
163+
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='DStatic|Win32'">Create</PrecompiledHeader>
164+
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='DStatic|x64'">Create</PrecompiledHeader>
165+
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Static|Win32'">Create</PrecompiledHeader>
166+
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Static|x64'">Create</PrecompiledHeader>
161167
</ClCompile>
168+
<ClCompile Include="ptdTest.cpp" />
162169
<ClCompile Include="RCBuildUnitTest.cpp" />
163170
<ClCompile Include="UnitTest.cpp" />
164171
</ItemGroup>

UnitTest/UnitTest.vcxproj.filters

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
<ClCompile Include="RCBuildUnitTest.cpp">
2828
<Filter>源文件</Filter>
2929
</ClCompile>
30+
<ClCompile Include="ptdTest.cpp">
31+
<Filter>源文件</Filter>
32+
</ClCompile>
3033
</ItemGroup>
3134
<ItemGroup>
3235
<ClInclude Include="pch.h">

0 commit comments

Comments
 (0)