本文涉及的某些概念在前文中有所提及,如果有不太清楚的描述,建议参考前文。

本文主要介绍控制台的一些附加处理,比如控制台句柄的访问权限、控制台命令别名、控制台的ANSI函数使用注意事项。

一、控制台访问权限

 控制台中有效访问权限主要有下面两种


说明

GENERIC_READ(0x80000000L)

控制台屏幕缓冲的读权限。

GENERIC_WRITE(0x40000000L)

控制台屏幕缓冲的写权限。

使用CreateFileCreateConsoleScreenBufferGetStdHandle函数获得的句柄,默认都是有GENERIC_READGENERIC_WRITE权限的。在函数调用时可指定仅有读或者写的权限。

在调用函数CreateFileCreateConsoleScreenBuffer时可指定控制台屏幕缓冲句柄的访问权限控制(安全性控制),详细内容可参考

Access Control Model

二、控制台别名

别名的作用主要是将源字符串替换为目标字符串,例如预先在控制台中定义“abc”到“cd <a-long_patch>\abc”的别名,在控制台中输入"abc",控制台会自动将“abc”扩展为“cd <a-long_patch>\abc”的形式。并执行cd操作。

定义控制台别名可使用Doskey或者AddConsoleAlias函数。

如下面代码的使用方式:

// using Doskey.exe:
doskey abc=cd \a_very_long_path\test

// using AddConsoleAlias
AddConsoleAlias( TEXT("abc"), 
                 TEXT("cd \\<a_very_long_path>\\test"), 
                 TEXT("cmd.exe"));


运行于同一个控制台的多个可执行文件的实例共享所有预先定义的别名。其他情况下别名不会共享,比如运行于同一个控制台的不同可执行文件是不共享别名的,运行于多个控制台的同一个应用程序的多个实例也不会共享别名。

可使用 GetConsoleAlias函数获取指定应用程序上指定字符串是否存在别名定义。

可使用GetConsoleAliases函数获取指定应用程序中定义的所有别名。

可使用GetConsoleAliasExes函数获取用于控制台别名的所有进程的名称。

三、控制台ANSI函数使用注意事项

 控制台输入输出函数中在处理8bit字符数据(ANSI)时默认采用OEM Code Page。但所有其他函数默认使用ANSI Code Page。二者不完全相同,这样就会造成控制台输入输出函数中的ANSI字符串不能被其他函数正确解析,反过来也也如此。比如FindFirstFileA函数返回的字符串中包含特定的ANSI扩展字符,WriteConsoleA函数就不能正确的显示这些字符串。

因此,在控制台程序中推荐使用UNICODE编码方式。如果这样不可行,建议使用SetFileApisToOEM函数设置下其他文件读写函数的默认Code Page。其中的文件处理函数包括:

CopyFile

GetFileAttributes

LoadLibrary

CreateDirectory

GetFullPathName

LoadLibraryEx

CreateFile

GetModuleFileName

MoveFile

CreateProcess

GetModuleHandle

MoveFileEx

DeleteFile

GetSystemDirectory

OpenFile

FindFirstFile

GetTempFileName

RemoveDirectory

FindNextFile

GetTempPath

SearchPath

GetCurrentDirectory

GetVolumeInformation

SetCurrentDirectory

GetDiskFreeSpace

GetWindowsDirectory

SetFileAttributes

GetDriveType