更新:2007 年 11 月
![]() |
---|
本主题中提到的某些功能在当前的 Visual C++ 版本中可能已不存在。有关更多信息,请参见Visual C++ 2005 和早期版本中的更改。 |
Microsoft Visual C++ .NET 2003 提供了许多改进的和新增的功能:
Visual C++ 编译器、语言和链接器
Visual C++ 库
开发环境
用于 C++ 托管扩展的 Windows 窗体设计器
项目生成自动化模型
Visual C++ 编译器、语言和链接器
下列编译器、链接器、其他生成工具和 Visual C++ 语言的功能是 Visual C++ .NET 2003 的新增功能。
编译器
有关如何在运行库的早期版本上运行用当前编译器版本生成的 C++ 托管扩展应用程序的信息。
添加了一个演练,显示如何移植现有本机应用程序以使用 C++ 托管扩展:演练:移植现有本机 C++ 应用程序,使其能与 .NET Framework 组件进行交互
现在可以在值类型的方法上创建委托。
Visual C++ .NET 2003 已极大地增强了编译器与 C++ 标准的一致性。
添加了 /arch 编译器选项。
/Gf 被否决并将在 Visual C++ 的下一个版本中移除。
添加了 /G7 编译器选项。
/GS 编译器选项已被增强,帮助保护局部变量以免产生直接缓冲区溢出。
/noBool 编译器选项已被移除。编译器现在允许 bool 在 Visual C++ 源代码文件中仅作为关键字(而不是标识符)出现。
longlong 类型现在可用作 __int64 的 typedef。注意,在 CRT 中还不支持 longlong。
/Zm 编译器选项现在指定预编译头的内存分配限制。
_InterlockedCompareExchange 内部函数现已编入文档。
_InterlockedDecrement 内部函数现已编入文档。
_InterlockedExchange 内部函数现已编入文档。
_InterlockedExchangeAdd 内部函数现已编入文档。
_InterlockedIncrement 内部函数现已编入文档。
添加了 _ReadWriteBarrier 内部函数。
Visual C++ 属性
- implements 属性现在编写完成。
链接器
下面的链接器选项已经添加:
/ASSEMBLYDEBUG
/ASSEMBLYLINKRESOURCE
/DELAYSIGN
/KEYFILE
/KEYCONTAINER
/SAFESEH
预处理器
_STATIC_CPPLIB 符号现在编写完成,以便使用 /MD。
_CPPLIB_VER 符号现已编入文档。
#import 指令现在已编写了以下属性:
auto_search
auto_rename
no_search_namespace
rename_search_namespace
tlbid
MASM
添加了 .SAFESEH 指令和 /safeseh ml.exe 选项。
Visual C++ 库
旧 iostream 库
旧的 iostream 库已从该版本的 Visual C++ 中移除。使用标准 C++ 库进行 iostream 编程。
C 运行时库
C 运行时库的文档现在包括 .NET Framework 等效项的信息。
已添加 _get_heap_handle。
_CrtSetDbgFlag 中使用的宏 _CRTDBG_CHECK_DEFAULT_DF 现在被定义为零,表示默认情况下不执行任何堆检查。
swprintf 现在与 ISO C 标准(仅适用于 C++)兼容。
vswprintf 现在具有的格式仅适用于 C++,它允许您指定可存储的最大字符数。
对一些多字节函数(如 _mbsset),CRT 以前并非始终会检测无效多字节字符串,即前导字节后跟着 null 随尾字节的字符串。现在,CRT 对前导字节后跟着 null 随尾字节的无效多字节字符要进行更多的检查。
已添加 _set_purecall_handler。
以前,当进程加载静止引用 CRT 库的 DLL 时,浮点的精度将初始化为 53 位。在 Visual C++ .NET 2003 中,浮点精度不按此方案初始化。这可能导致在一些依赖 CRT 初始化浮点精度的现有应用程序中产生重大更改。
现在,CRT 包含用于所有数学函数的浮点和双精度格式。这些新函数仅是 Visual C++ 中可调用的函数。
标准 C++ 库
在以前的版本中,如果 wchar_t 没有定义为本机类型,则向流的字符输入和输出可能导致存储字符或无符号短值。现在,无符号短值始终作为字符对待。
在 Visual C++ .NET 2003 中,<hash_map> 和 <hash_set> 头文件的成员不再位于 std 命名空间中,它们已被移到 stdext 命名空间。
标准 C++ 库已升级,以便利用增强 Visual C++ 编译器对 C++ 标准的支持。例如,与 Visual C++ 同时发售的标准 C++ 库实现现在利用了部分模板专用化。
ATL
- 在 Visual Studio .NET 2003 中,MIDL 编译器默认设置为 /robust,这将使 Windows NT 4 下运行的项目停止响应。
将 MIDL 编译器标志更改为 /no_robust
右击项目,并在快捷菜单上单击“属性”。
出现“项目属性”对话框。
在左窗格中单击**“MIDL”**,然后选择“命令行”。
在“附加选项”文本框中输入 /no_robust。
ATL 字符串转换宏 USES_CONVERSION 已被 USES_CONVERSION_EX 取代。它将试图分配堆栈上的空间。如果堆栈上没有可用空间,它将尝试堆。如果堆上也没有空间,它将返回 NULL。USES_CONVERSION_EX 包含一个额外参数(阈值)可以使用:如果要求大于阈值的大小,宏将直接转到堆。
_alloca 已被 _atl_safe_alloca 取代。
CSocketAddr 类已添加,目的是提供用于同时处理 IPv6 和 IPv4 地址且独立于协议的方法。
生成输出可执行文件的项目时,ATL 自动地使用 %MODULE% 注册器脚本参数为运行时创建的路径名添加引号。如果不希望路径名包含引号,请使用新的 %MODULE_RAW% 参数。
如果在生成输出 DLL 的项目时使用 %MODULE% 或 %MODULE_RAW%,则 ATL 不会在路径名中添加引号。
MFC
删除连接点后,连接映射不再紧挨在一起;相反,删除的连接点被替换为 NULL。因此,您在使用 CConnectionPoint::GetConnections 或 CConnectionPoint::GetNextConnection 时应检查 NULL。
以下函数现在可能引发异常:CSimpleString::FreeExtra、CSimpleString::GetAt、CSimpleString::operator []、CSimpleString::ReleaseBuffer、CSimpleString::ReleaseBufferSetLength、CStrBuf::SetLength 和一些 CTime::CTime 构造函数。
AfxIsValidAddress 和 AfxIsValidString 的行为已更改。在非调试版本中,两个函数都仅测试非 NULL 参数。
CHeaderCtrl::GetOrderArray 不再包含默认的第二个参数;-1 不再是第二个参数的有效值。
CAsyncSocket 具有新的 IPv6 敏感成员:GetPeerNameEx、GetSockNameEx、ReceiveFromEx 和 SendToEx。
ATL 和 MFC
CImage 类现在跟踪已创建对象的数量。只要计数变为 0,就自动调用函数 GdiplusShutdown 释放 GDI+ 占用的资源。这防止出现在通过 DLL 创建 CImage 对象时不能释放资源的情况。
MFC CString 类已重写为模板类 CStringT。这允许您在 ATL 项目中使用 CString,而不必链接在更大的 MFC 静态库或 DLL 中。
说明:
此版本解决了知识库文章“PRB: Linking Errors When You Import CString-Derived Classes”(PRB:导入 CString 派生的类时出现的链接错误)(Q309801) 中描述的问题。可以查找 MSDN Library CD-ROM 中或 https://support.microsoft.com/default.aspx 上的知识库文章。如果在从 Visual C++ .NET 2002 的 MFC 扩展 DLL 中导出 CString 派生类时遇到链接器错误,并且已经应用了本文描述的变通方法,则应移除变通方法代码,因为 Visual C++ .NET 2003 中已经解决了该问题。
CStrBufT 和 CSimpleStringT 现在有其他模板参数,通知您是否需要使用 MFC DLL 中的 CString。使用 atlsimplstr.h 的 CStringT 或 CSimpleStringT 类中的 typedef(而不是全局 typedef)。
ATL Server
在使用 ATL Server 生成的 XML Web services 中,默认操作是读取 SOAP 参数然后验证该参数。若要关闭验证,请定义宏 _ATL_SOAP_NO_PARAMETER_VALIDATIONS。
SPROXY.EXE 现在可以处理 .discomap 文件或 .wsdl 文件。指定了新的 /wsdl 选项以供使用 .wsdl 文件作为输入:
sproxy /wsdl <input_location>
其中 <input_location> 是要使用的 .wsdl 文件的路径。
SPROXY.EXE 现在可以处理 results.discomap 文件:
sproxy results.discomap
注意,.discomap 文件包含指向 .wsdl 文件的本地副本的链接,并且也使用架构文件的本地副本。
开发环境
![]() |
---|
本主题中提到的某些功能在当前的 Visual C++ 版本中可能已不存在。有关更多信息,请参见Visual C++ 2005 和早期版本中的更改。 |
在 Visual C++ .NET 2003 中打开从 Visual Studio .NET 中创建的 Visual C++ 项目时,旧的项目文件将重新命名,并将创建 Visual C++ .NET 2003 环境下的新项目文件。
.vcproj 文件的格式现在编写完成。
在开发环境中包括下面的新功能:
$(WebDeployPath)、$(WebDeployRoot)、$(ParentName)、$(RootNameSpace)、$(SafeParentName) 和 $(SafeInputName) 等宏已添加。
现在可以生成项目,而不生成任何项目依赖项目。
C++ 托管扩展项目模板
该版本包括几个新的项目模板,您可以使用这些模板在 C++ 托管扩展中创建应用程序:
Windows 控件库 (.NET)
Windows 窗体应用程序 (.NET)
Windows 服务 (.NET)
此外,该版本对用于 Visual C++ .NET 2002 中的托管项目的模板进行重新命名:
“托管 C++ 应用程序”现在称为“控制台应用程序 (.NET)”
“托管 C++ 类库”现在称为“类库 (.NET)”
“托管 C++ 空项目”现在称为“空项目 (.NET)”
**“托管 C++ Web 服务”**现在称为“ASP.NET Web 服务”
用于 C++ 托管扩展的 Windows 窗体设计器
由于此版本添加了 Windows 窗体设计器,因此 Visual C++ 引入了在 C++ 托管扩展中创建 Windows 窗体应用程序的应用程序快速开发解决方案。
该功能包括对工具箱和服务器资源管理器的完全支持,使您可以向 Windows 窗体应用程序中直接拖放或剪贴控件和组件。另外,您可以通过属性网格轻易地操作控件和组件的属性。
项目生成自动化模型
Visual C++ .NET 提供了新属性页和大量的新对象,并为现有对象提供了用于增强项目生成模型的新属性和方法。
新属性页
“托管资源”属性页
“XML 数据生成器工具”属性页
“托管包装”属性页
“辅助托管包装”属性页
新对象
VCALinkTool 对象
VCActiveXReference 对象
VCAssemblyReference 对象
VCAuxiliaryManagedWrapperGeneratorTool 对象
VCManagedResourceCompilerTool 对象
VCManagedWrapperGeneratorTool 对象
VCPrimaryInteropTool 对象
VCProjectReference 对象
VCReference 对象
VCReferences 集合
VCReferenceConfiguration 对象
VCXMLDataGeneratorTool 对象
现有对象的新成员或已更改成员
几个新建的和更新的属性和方法添加到了现有对象中。注意,更改可以包含几个方面,如已更新的签名或新成员的添加。
对象 |
新成员或已更改成员 |
---|---|
VCCLCompilerTool 对象 |
EnableEnhancedInstructionSet 属性 |
|
ToolKind 属性 |
VCLinkerTool 对象 |
FixedBaseAddress 属性 |
|
ToolKind 属性 |
VCLibrarianTool 对象 |
ToolKind 属性 |
VCCustomBuildTool 对象 |
ToolKind 属性 |
VCMidlTool 对象 |
ToolKind 属性 |
VCResourceCompilerTool 对象 |
ToolKind 属性 |
VCPreBuildEventTool 对象 |
ToolKind 属性 |
VCPreLinkEventTool 对象 |
ToolKind 属性 |
VCPostBuildEventTool 对象 |
ToolKind 属性 |
VCBscMakeTool 对象 |
ToolKind 属性 |
VCNMakeTool 对象 |
ToolKind 属性 |
VCWebServiceProxyGeneratorTool 对象 |
Namespace 属性 (VCProjectEngine) |
|
References 属性 |
|
ToolKind 属性 |
VCWebDeploymentTool 对象 |
ToolKind 属性 |
VCProject 对象 |
AddAssemblyReference 方法 |
|
AddActiveXReference 方法 |
|
AddProjectReference 方法 |
|
CanAddAssemblyReference 方法 |
|
CanAddActiveXReference 方法 |
|
CanAddProjectReference 方法 |
|
Object 属性 |
|
References 属性 |
|
ReferencesConsumableByDesigners 属性 |
|
RemoveReference 方法 |
|
RootNamespace 属性 |
|
VCReferences 属性 |
VCFile 对象 |
AddFile 方法 |
|
CanAddFile 方法 |
|
FileType 属性 |
|
Items 属性 |
|
Object 属性 |
|
RemoveFile 方法 |
VCFilter 对象 |
Object 属性 |
VCConfiguration 对象 |
FullReferencesPath 属性 |
|
ReferencesPath 属性 |
|
ReferenceTools 属性 |
|
SatelliteDLLs 属性 |
|
StopBuild 方法 |
|
StyleSheets 属性 |
VCStyleSheet 对象 |
FullReferencesPath 属性 |
|
ReferencesPath 属性 |
|
ReferenceTools 属性 |
|
StyleSheetDirectory 属性 |
|
StyleSheetName 属性 |
VCFileConfiguration 对象 |
ProjectConfiguration 属性 |
|
Compile 方法 |
|
OutputUpToDate 属性 |
VCProjectEngine 对象 |
ShowEnvironmentInBuildLog 属性 |