author:
Windows Vista™ 公开了数千个新的本机 API,对 Windows ® 平台进行了扩展。这些 API 让开发人员能够创建更时尚的用户界面,开发出反应更迅速的 I/O 操作,更高效地管理线程等等。代号为“Orcas”的下一版本 Visual Studio ® 将帮助 C++ 开发人员充分利用 Windows Vista 提供的新功能。为了做到这一点,它提供了针对所有新的本机 API 的内置支持,以及针对 MFC 和对话框编辑器中的新控件和公共对话框的附加支持。除了所有这些本机开发的改进外,Visual Studio“Orcas”还通过提供旨在弥合本机和托管代码之间沟壑的新库,扩展了可供 C++ 开发人员实现其本机组件和 Microsoft ® .NET Framework 托管组件之间互操作的技术。本文将详细介绍即将发布的 Visual Studio“Orcas”中包含的这些新技术。
Visual Studio“Orcas”包含了针对从 Windows 2000 直到 Windows Vista 的所有 Windows 版本所需的全部必要头文件和库文件。这就使得开发人员能够访问操作系统直接公开的低级 API 及其用于 C/C++ 应用程序的组件。除提供对 C 语言级 API 的访问外,Visual Studio“Orcas”还扩展了 MFC,以便在适当之处使用新的 Windows Vista API,并且还在 MFC 库环境中封装和公开了一个 API 子集。
对 MFC 的多数改进都集中在 UI 上。当使用 Visual Studio“Orcas”重新编译 MFC 应用程序后,它将自动升级为适用于 Windows Vista 的新界面 — 即公共对话框将得到加强,工具栏将遵循 Windows Vista 的主题,窗口框架和标题栏将炫出 Aero™ 的透明度。这种界面升级无需修改任何代码 — 您只需重新编译应用程序即可。当然,通过将 MFC 应用程序迁移到新版本的 Visual Studio,开发人员就能访问 Windows Vista 中公开的新控件和样式。
更新后的 MFC 还将完成所有必要的工作,以便轻松使用 Windows Vista 中的公共对话框。以下面用 Visual Studio“Orcas”编译的 MFC 代码为例:
CFileDialog dlgFile(TRUE);
dlgFile.DoModal();
图 1 Windows Vista 上的 MFC 公共文件对话框 (单击该图像获得较大视图)
当在 Windows Vista 平台上执行时,将显示精美的公共文件对话框,如图 1 所示。但在低级平台上,如 Windows 2000,MFC 则使用回退机制来显示旧版的公共文件对话框,如图 2 所示。
图 2 低级平台上的 MFC 公共文件对话框 (单击该图像获得较大视图)
请注意,如用早期版本的 Visual Studio 和 MFC 编译同样的代码,结果只能是传统的公共文件对话框(如图 2 所示)— 即使在 Windows Vista 上也是如此。如果需要,您可以用默认值覆盖新的 MFC 行为,始终显示旧版的、非 Windows Vista 公共对话框。方法是向 CFileDialog 类的构造函数传递一个额外参数,将 bVistaStyle 标记设置为 FALSE。
此 外,更新后的 MFC 类允许开发人员回退至 Windows Vista 公共文件对话框的底层 COM 实现,以执行更复杂的任务,如自定义公共对话框。例如,更新后的 CFileDialog 类有一个 getter,用于提供对 IFileDialogCustomize 界面的访问,该界面允许开发人员向对话框对象添加控件。
添加对新的公共控件的支持
Windows Vista 提供的对新控件和样式的支持使开发人员能够创建美观、纯正的 Windows Vista 应用程序。但 Visual Studio“Orcas”也对某些在早期版本的 Visual Studio 中没有实现的 Windows XP 控件和样式添加了支持。以下是 Visual Studio“Orcas”新增控件的摘要:
Command Link 控件 如图 3 所示,Command Link 是在 Windows Vista 中引入的一种新的按钮样式。它实质上是一种具有 BS_COMMANDLINK 风格标记集的按钮控件。这些按钮实际上指明了按钮将要执行的操作,并附有该操作的简短说明,它们使 Command Link 大大改善了用户界面。此控件主要用于 Windows Vista 任务对话框。
图 3 Command Link
Split Button 控件 如图 4 所示,Split Button 是一种 Windows Vista 按钮,它有一个默认操作,但也可通过一个巧妙的 UI 手势来访问其他可能的操作,该手势会显示一个具有更多操作的下拉菜单。Split Button 控件实质上是一种具有 BS_SPLITBUTTON 风格标记集的按钮控件。
图 4 Split Button
Network Address 控件 如图 5 所示,此控件是一种简单的 Windows Vista 编辑框,负责验证输入,将输入限定为 IPv4 地址、IPv6 地址或友好的 DNS 名称。
图 5 Network Address
Sys Link 控件 这是一种 Windows XP 控件,不受早期版本的 Visual Studio 支持。如图 6 所示,它可以方便地在窗口中嵌入超文本链接。
图 6 Sys Link
对 于每个新支持的控件,MFC 还包含了类和通知。此外,IDE 中的资源编辑器已经更新,可以使用新的 MFC 类和控件。“工具箱”(Toolbox) 窗口将所有新控件显示为可供 MFC 对话框编辑器使用的本机控件。如果将控件拖放到 MFC 对话框,它们会在 Windows Vista 主机上正确呈现;如果拖放到低级平台,则会显示占位符,并附有相应的消息,指明该控件无法在非 Windows Vista 平台上呈现。图 7 显示了 Windows Vista 之前版本的对话框,而图 8 则显示了更美观的 Windows Vista 对话框。)“Property Pages”(属性页) 也已更新,以显示新控件可使用的样式和事件。最后,对 MFC 向导也添加了支持,以添加控件类和成员。
图 7 Windows XP 的对话框
Visual Studio“Orcas”中的 MFC 还扩展了对在 Windows Vista 中已得到增强的现有控件的支持。以下控件具有扩展支持:TreeView、MonthCalendar、DateTimePicker、Static、 Slider (TrackBar) 和 Progress 控件。此外,Windows Vista 还通过扩展样式使 UI 外观更为流畅,用户功能更为丰富,从而增强了许多其他控件。这些控件的样式可通过向各自的控件发送消息来直接设置。例如,为激活 TreeView 控件上丰富的工具提示,以便能够自定义绘制带图标和文本的内容,您可向此控件上的 TVS_EX_RICHTOOLTIP 扩展样式发送一条 TVM_SETEXTENDEDSTYLE 消息。
图 8 用 Windows Vista 控件更新的对话框 (单击该图像获得较大视图)
希望遵循 Windows Vista UI 指南的应用程序应利用 Windows Vista 提供的新控件来创建更醒目、更具功能性的用户界面。
其他 MFC 增强功能
新 的 Windows Vista UI 惯例,如可选择性地默认为隐藏应用程序的菜单栏,也已包括在 Visual Studio“Orcas”中。此特定示例将菜单栏设置为仅在用 Alt 键激活时才会显示,否则隐藏菜单栏。许多 Microsoft 应用程序都在使用同样的技术,如在 Windows Vista 中运行的 Internet Explorer® 7。要启用此行为,开发人员需要通过调用 CFrameWnd::SetMenuBarVisibility(AFX_MBV_DISPLAYONFOCUS),在 CFrameWnd 上设置适当的标记。MFC 还公开了 Aero 向导。目前,可通过在 CPropertySheet 构造函数内设置 m_psh.dwFlags |= PSH_AEROWIZARD 来更新 MFC 向导,以使用 Aero 向导框架。
同 样,资源编辑器也已更新,可支持新的 Windows Vista UI 指南。默认情况下,将要添加的新对话框在控件位置、控件大小和所用字体方面都将遵循 UI 指南。资源管理器还提供用于查看基于 Windows Vista 的应用程序中使用的图标的增强功能。它现在支持查看 32 位彩色图像、PNG 图像、256×56 大图标和 PNG 图标(如图 9 所示)。此外,对于包含多个图标图像的图标文件,它还支持更佳的预览模式。
图 9 资源编辑器中的图标支持 (单击该图像获得较大视图)
最后,Spy++ 应用程序已更新,可监视在 Windows Vista 中引入的新消息。并且 Spy++ 还以其对 Visual Studio“Orcas”中的 64 位应用程序的附加支持而引以为豪。
为用户帐户控制做准备
Windows Vista 中最值得注意的新安全性功能就是用户帐户控制 (UAC)。通过 UAC,用户使用最低权限运行,并且管理权必须显式授予。该功能具有非常重要的意义。现在,当应用程序在 Windows Vista 默认的 UAC 下运行时,开发人员必须意识到他们的应用程序将如何执行,这非常关键。另外,建议开发人员通过指定其应用程序所需的安全性级别来积极增强桌面安全性。 Visual Studio“Orcas”消除了 UAC 所要求的必须手动生成必要 XML 指令清单的负担,从而帮助开发人员准备适用于 UAC 的应用程序。没有 UAC 指令清单且没有以管理员权限显式运行的应用程序均将以兼容虚拟化模式运行,在此模式下,具有全局影响的所有写入(如写入注册表或非用户磁盘位置)都将被重 新定向到每个用户的位置。但是请注意,兼容模式应仅视为一种权宜之计,因为它可能会对应用程序带来细小的缺陷。我们建议,为 Windows Vista 设计的所有应用程序应针对 UAC 进行测试,并且应当具有适当的 UAC 指令清单。
UAC 指令清单可包含以下三种调用模式中的一种:As-Invoker、Highest-Available 和 Require-Administrator。
As-Invoker 此权限级别允许应用程序运行时使用与其父进程相同的令牌。这是默认值,并且是推荐所有 Windows Vista 应用程序都使用的 UAC 设置。
Require-Administrator 此权限级别要求必须使用完整的管理员权限来运行应用程序。只有本地计算机上的管理员组成员才能使用此设置来运行应用程序。使用此权限级别调用应用程序时将会出现一个 UAC 对话框,要求在此权限级别执行。
Highest-Available 此权限级别要求必须使用提供给当前用户的最高权限来运行应用程序。这通常被转换为 Require-Administrator 权限,因为有太多用户以管理员身份运行。
那么您如何生成一份 UAC 指令清单呢?Visual Studio“Orcas”公开了 LINK.EXE 的一个新开关,负责启用 UAC XML 指令清单片段的自动生成。该新开关 /MANIFESTUAC 的格式是:
/MANIFESTUAC[:{NO|UAC fragment}]
该开关的默认值是生成具备 As-Invoker 权限的指令清单。对此开关指定 No 将不会生成指令清单,并将导致应用程序以兼容模式运行。指定 requireAdministrator 或 highestAvailable 将在生成的 UAC 指令清单上设置相应的权限。
如图 10 所示,Visual Studio“Orcas”还在项目的属性页上公开了同样的选项。
图 10 Visual C++ 项目的用户帐户控制选项 (单击该图像获得较大视图)
默认情况下,会为用 Visual Studio“Orcas”创建的所有新应用程序均生成一个 As-Invoker UAC 指令清单。所有从早期版本的 Visual Studio 升级的应用程序也将自动启用 UAC。
我 还要指出,Internet Explorer 7 使用 Windows Vista 的 UAC 功能,提供了更安全的保护模式。此默认模式实质上是使用低于标准的用户权限运行 Internet Explorer 内的组件。这是通过启动新生成的 Internet Explorer 实例(具有较低权限)中的组件来实现的。因此,需在 Internet Explorer 7 环境中运行的组件,如 ActiveX® 控件,必须进行 Internet Explorer 7 保护模式的测试。
Visual Studio“Orcas”为 C++ 项目增加了一个新的选项,以便能够调试 Web 浏览器下的应用程序。可用调试器列表目前包含了 Web 浏览器调试器,该调试器也已考虑到 Internet Explorer 7 保护模式,并且执行了所有必要的工作,以依附于新创建的、权限较低的进程。
与托管代码进行互操作
除 重点关注 C++ 开发人员的本机工具外,对于弥合本机 C++ 组件与 .NET 组件(用托管代码开发)之间沟壑的技术,Visual Studio“Orcas”还扩展对其的支持。随着 .NET Framework 的推出,越来越多的行业级应用程序正将更多的托管组件纳入其本机 C++ 应用程序之中,托管代码在这些领域极具价值和适用性。
要将那些 .NET 组件集成到现有的和新的本机 C++ 代码中,Visual Studio“Orcas”使之变得更为简便。Visual Studio 目前提供了可将本机惯例融入托管代码的库,并帮助您有效编写跨越本机-托管界线的代码。
用封送处理库简化程序
混 合本机和公共语言运行库 (CLR) 类型的最基本要求是能够跨越两种系统封送处理数据。幸运的是,Visual Studio“Orcas”带来了解决方案。它包含一个新的封送处理库,可简化编写用于封送处理本机环境和 CLR 之间的类型的代码。封送处理库操作基于现有的 .NET Framework 例程,但通过将封送处理例程作为可扩展的模板库的成员予以公开,降低了使用这些类的复杂性。
新 的封送处理库具有针对 C++ 应用程序所使用的所有不同常见字符串类型的内置支持 — 如 ATL CString、BSTR、CComBSTR、char *、wchar *、std::string、std::wstring 和 System::String^。而且开发人员可添加比现有支持更多的转换。以下是用封送处理库将 System::String 转换为 char * 的简单示例:
#include <msclr/marshal.h>
void myfunc (String^ s)
{
msclr::interop::marshal_context ctx;
char *s2 = ctx.marshal_as<char*> (s);
//...
}
在 CLR 类型上使用 STL/CLR
标 准模板库 (STL) 的容器-迭代器-算法结构简化了 C++ 开发,目前已成为许多 C++ 开发人员习惯使用的一种模式。就像 STL 为本机类型实现的惯例一样,Visual Studio“Orcas”使用 STL/CLR 将同样的惯例带入 CLR 的领域。这一新功能允许在本机和托管环境中使用相同的惯例,从而可能大幅度提高 C++ 开发人员的生产率。另外,此功能还使在 STL 容器和 .NET 集合之间交换数据变得更为轻松。
STL/CLR 为 CLR 类型提供的容器和 STL 为本机类型提供的容器相同。该新容器是客户端命名空间的组成部分。STL/CLR 也使算法的复杂程度与 STL 保持一致。STL/CLR 容器可存储垃圾回收的 CLR 引用类型和值类型,以及 CLR 和本机内置类型;它们不能存储纯本机类型或指向本机类型的指针。
STL/CLR 还公开了可与其容器配合使用的迭代器。STL/CLR 迭代器的层次结构与 STL 迭代器的层次结构相同,而且 STL/CLR 迭代器的访问方式也完全相同。STL/CLR 还公开了与 STL 同样的算法集。该算法可在 STL/CLR 和 STL 容器上运行。以下示例显示了运行中的 STL/CLR 容器和迭代器:
#include <cliext/hash_map>
void myfunc ()
{
cliext::hash_map<Int32, String^> m;
m.insert (cliext::make_pair(5, L”five”));
cliext::hash_map<Int32, String^>::iterator i = m.find(5);
Console::WriteLine(“map[{0}] == {1}”, i->first, i->second);
}
更快速地构建代码
针 对 CLR 开发 C++ 代码的另一种改进是增量式构建的速度明显加快。开发具有 C++ 组件的大型 CLR 应用程序过程中长久以来的一个弱点是必须重新构建依赖关系,即使核心组件只有实现改动而无界面改动。原因是 CLR 程序集将组件元数据和实现封装到同一个二进制包中。因此,当 CLR 程序集的任何一部分发生更改时,就必须重新构建依赖 CLR 程序集的大型 C++ 项目。
即将发布的 Visual Studio 版本增加了一个新工具,用于创建只有元数据的程序集,该程序集将捕获界面,并仅在界面程序集发生更改时才重新构建依赖的 C++ 项目。对程序集的实现所做的更改不会导致触发重新构建依赖程序集。这将显著缩短增量式构建方案中的构建时间,进而提高开发人员的生产率。
在讨论构建吞吐量的主题时,我比较喜欢的 Visual Studio“Orcas”的功能之一是能够并行编译源文件。这既适用于本机代码,也适用于托管代码。CL.EXE 提供了一个新开关 /MP 来启用该行为。该新开关的语法如下所示:
/MP[n] use up to ‘n’ processes for compilation
其中,n 实际用来指定待用处理器的数量。如果未指定处理器的数量,编译器将使用机器上可用的逻辑处理器的数量。如果指定了数量,将准确生成 n 个进程来完成编译。
并行编译功能通过在不同进程中编译不同转换单元来实现,单个转换单元无法跨越多个进程进行编译。例如,在含有四处理器的计算机上运行时,请考虑以下编译器调用的结果:
CL /c /MP a.cpp b.cpp c.cpp d.cpp e.cpp f.cpp
结果是编译器将并行编译四个转换单元,四个处理器中一旦有一个被释放,立即开始编译新的转换单元。
现在请考虑以下在含有双处理器的计算机上运行的编译器调用的结果:
CL /c /MP a.cpp
编译器将对接收的单一转换单元执行顺序编译,因为它不能在转换单元内执行并行编译。
结束语
对渴望使用 Windows Vista 提供的新特性和功能的 C++ 开发人员来说,即将发布的 Visual Studio“Orcas”版将提供显著增强的工具。在此版本中,将向 Win32® 开发人员提供几千个全新的 Windows Vista API。MFC 也已得到改进,以使 MFC 开发人员方便地利用许多 Windows Vista 功能。IDE 扩展了资源编辑器,以公开新的 Windows Vista 控件。此外,还添加了用于创建适应 UAC 的应用程序的支持。
Visual Studio“Orcas”还为需要弥合本机 C++ 代码和 CLR 之间沟壑的开发人员提供了改进。这是通过提供有助于提高开发人员生产率的新库和新工具而达成的。同时,Visual Studio 的新版本还包含了诸如并行编译之类的便利新功能,以进一步改善开发人员的体验。