控制台访问权限、别名及注意事项

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

本文属于控制台编程第五篇文章,前四篇链接如下。

本文主要介绍控制台的一些附加处理,比如控制台句柄的访问权限、控制台命令别名、控制台的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"));
View Code

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

可使用 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  
posted @ 2014-11-30 11:22  Tocy  阅读(1314)  评论(0编辑  收藏  举报