下面的这个例子使用 Win32 API 函数和通用数据类型设置 C 盘的卷标。
//******************
// 设置 C 盘的卷标
//******************
// drvsvl.cpp
#include <windows.h>
#include <iostream.h>
void main()
{
BOOL success;
char volumeName[MAX_PATH];
cout << "输入新的 C 盘卷标:";
cin >> volumeName;
success = SetVolumeLabel("c:\\", volumeName);
if (success)
cout << "成功\n";
else
cout << "错误代码:" << GetLastError() << endl;
}
通过使用 TCHAR 数据类型,将这段代码最上面的字符数组声明为两个字节的字符。TEXT 宏再次被用于字符串常量:
void main()
{
BOOL success;
TCHAR volumeName[MAX_PATH];
cout << TEXT("输入新的 C 盘卷标: ");
cin >> volumeName;
success = SetVolumeLabel(TEXT("c:\\" ), volumeName);
if (success)
cout << TEXT("成功\n");
else
cout << TEXT("错误代码:") << GetLastError() << endl;
}
Visual C++ 中的通用数据类型
Visual C++ 提供了几种 MFC 专用的数据类型用于创建具有国际化特性的应用程序。这些定义很通用,完全可以在 UNICODE、ASCII、DBCS (双字节字符集) 和 MBCS (多字节字符集)。由于篇幅所限,本文不打算涉及所有上面提到的这些字符集。有关它们的详细资料请参考相关资料。MFC 提供了一种透明的方式来实现这些字符集。通用数据类型的映射到哪个字符集以及映射方式是根据工程的设置决定的,默认值为 ASCII 模式,其它几个可选项是 MBCS、DBCS 或者 UNICODE。本文主要讨论 UNICODE,所以下表中只列出了 ASCII 与 UNICODE 字符之间的映射关系:
表一:
通用 MFC 数据类型
|
映射到 ASCII
|
映射到 UNICODE
|
注释
|
_TCHAR
|
char
|
wchar_t
|
_TCHAR 是一个映射宏,当定义 UNICODE 时,该数据类型映射到 wchar_t,如果没有定义 UNICODE,那么它映射到 char。
|
_T 或 _TEXT
|
char 常量字符串
|
wchar_t 常量字符串
|
功能与宏相同,在 ASCII 模式下,它们被忽略,也就是说被预处理器删除掉,但是如果定义了UNICODE, 则它们会将常量字符串转换成等价的 UNICODE 。
|
LPTSTR
|
char*, LPSTR(Win32)
|
wchar_t*
|
可移植的32位字符串指针。它将字符类型映射到工程设置的类型。
|
LPCTSTR
|
const char*, LPCSTR(Win32)
|
const wchar_t*
|
可移植的32位常量字符串指针。它将字符类型常量映射到工程设置的类型。
|
使用表一中列出的通用数据类型,开发人员可以保证所创建的工程始终是针对一种字符集,这些通用数据类型就相当于占位符,在编译时被特定的字节所替代,使得应用程序在 ASCII 和 UNICODE 模式下都能运行。但是,有一点要特别注意,那就是上述的通用数据类型为微软专有,与 ANSI 标准并不兼容。有关微软提供的这些通用数据类型详细描述请参考 MSDN 库文档。
有关技术注释
为了成功编译支持 UNICODE 的 MFC 程序,必须使用 MFC 的 UNICODE 版本库。该库在定制安装Visual C++ 时是个可选安装项。
有一点很重要:那就是不使用 UNICODE 标准在外观上并不影响程序的执行。也就是说,上面提到过的代码不管设没设置 _UNICODE 生成选项,最终都能生成正常运行的程序。当开发人员使用多个版本的Win32 API函数时才会出现问题。
在使用多个版本的 Win32 API函数(任何有字符或字符串作为参数的 Win32 API函数)时,编译器根据是否设置 _UNICODE 指令来决定调用正确的函数。如果没有定义_UNICODE,那么编译器将默认调用 ASCII 版本函数。
结束语
综上所述可以看到,编译 UNICODE 版本的程序并不难。只是在编写代码时记住函数调用上些微的变化。微软为此提供的扩展是开发人员能够以透明的方式选择所用的字符集,为应用软件的国际化打开了方便之门。
Jeffrey Richter 在他的《Windows 核心编程》(机械工业出版社-王建华、张焕生、侯丽坤等译)一书中专门用一章讨论了 UNICODE。翻译得也不错。有兴趣的朋友不妨找来看看。
相关推荐
"Python快速编程入门的课后习题答案" Python 是一种高级的、解释性的编程语言,具有简单易学、开源、高级语言、可移植性、解释性、面向对象、可扩展性、丰富的库、规范的代码等特点。 Python 可以应用在 web 应用...
win32编程入门程序 包括:自定义消息 定时器 使用资源(图标,光标,菜单,对话框) 键盘消息响应 后备缓冲区 说明:需自建工作空间,并在建好之后在属性->配置属性->常规->项目默认值->字符集 选择"使用Unicode...
COM编程入门是一个面向初学者的主题,旨在帮助程序员理解并开始使用Component Object Model(COM)这一核心技术。COM是微软开发的一种二进制接口标准,它允许不同应用程序之间共享和交互对象,不受特定编程语言的...
Windows 编程入门 Windows 编程入门是指使用微软的 Windows 操作系统进行软件开发的入门指南。本指南涵盖了 Windows 编程的基本理论、开发工具和框架、 Demo 实战等方面的知识点。 Windows 操作系统 Windows 操作...
3. **组件对象(COM对象)**:CoClass的实例称为COM对象,是COM组件的实际表现形式。每个COM对象都实现了至少一个接口。 4. **COM服务器**:包含CoClass的二进制文件(通常是DLL或EXE)被称为COM服务器。服务器提供...
### API编程入门:掌握Windows数据类型与宏定义 在IT行业,尤其是软件开发领域,**API(Application Programming Interface)编程**是一项核心技能。API作为不同软件组件之间通信的桥梁,其重要性不言而喻。本文...
【Windows编程入门知道书】 Windows编程对于初学者来说可能显得有些复杂,但通过这本指导书,你可以逐步熟悉这个领域。首先,你需要了解操作系统的基本概念,尤其是Windows操作系统的核心组成部分。操作系统(OS)...
总之,Windows驱动编程要求开发者对`UNICODE_STRING`等内核结构有深入理解,并熟练使用`Rtl`系列函数进行字符串操作。理解这些基础知识对于避免驱动开发中的常见错误至关重要,也是编写安全、稳定驱动程序的前提。
易语言是一种基于中文的编程语言,它以简明的语法和直观的编程界面为特点,旨在降低编程入门难度。在处理字符编码时,易语言原生支持的是ANSI编码,对于Unicode这种更广泛的字符集支持相对有限。"易语言读Unicode...
这个名为“Windows编程入门”的压缩包资源可能是一个引导初学者踏入Windows API和应用程序开发的教程。它包含了一个名为"Windows编程入门——字节跳动.pptx"的PPT文件,很可能是由字节跳动公司提供的一个教学材料,...
C语言编程入门是计算机科学的基础,它是一种强大的、低级别的编程语言,被广泛用于系统开发、嵌入式系统以及各种应用程序。C语言以其简洁、高效和可移植性著称,是许多现代编程语言的基石。 在C语言编程中,了解...
3. **COM对象(COM Object)**:在内存中,CoClass的实例就是COM对象,它实现了接口中定义的方法。 4. **COM服务器(COM Server)**:包含一个或多个CoClass的二进制文件,可以是DLL或EXE,提供COM对象的实现。 5....
C语言编程入门是学习计算机科学的基础,它是一种高级程序设计语言,被广泛应用于系统开发、软件工程、嵌入式系统等多个领域。C语言简洁、高效,允许直接操作内存,因此理解计算机内存的工作原理对掌握C语言至关重要...
标题《VC++_Win32 编程入门》指出了文章的主题是介绍使用C++语言进行Windows编程的初学者入门指南,且仅覆盖Win32 API编程部分,不涉及MFC(Microsoft Foundation Classes)框架。Win32 API是Windows操作系统提供的...
本资料"windows+SDK编程入门介绍共49页.pdf.zip"显然是一个关于Windows SDK编程初学者的教程,旨在帮助开发者快速理解和掌握Windows SDK的基本用法和核心概念。 在Windows SDK编程中,以下几个关键知识点是入门阶段...
C语言编程入门是学习计算机编程的基础,它涉及到内存管理、数据表示、运算规则以及编码标准等核心概念。在C语言中,对内存的理解至关重要,因为它是程序运行的基础。内存条由大量的电子元器件组成,每个元器件能处于...
2. **默认编码**:Python 3.x默认使用UTF-8编码,增强了对Unicode的支持。 3. **除法运算符**:Python 3.x中,除法运算符 `/` 总是返回浮点数,除非两边都是整数。 4. **异常处理**:Python 3.x的异常处理语法更规范...
COM编程入门 COM,全称为Component Object Model,是一种组件对象模型,是微软提出的一种跨应用程序和编程语言的二进制代码共享机制。COM的核心思想是促进代码的重用,避免源码级别的重用带来的局限性,如C++中的...