附 录 A 语 法 总 结
本 附 录 描 述 一 般 C++ 语 言 中 的 语 法 , 按 在 Microsoft C++ 编 译 器 中 的 实 现 。 它 是按 本 书 的 章 节 结 构 松 散 地 按 如 下 进 行 组 织 :
-
在 第 1 章 “ 词 汇 规 定 ” 的 “ 关 键 字 ” 一 节 中 描 述 关 键 字 。
-
在 第 4 章 “ 表 达 式 ” 的 “ 表 达 式 ” 一 节 中 描 述 表 达 式 语 法 。
-
在 第 6 章 “ 说 明 ” 的 “ 说 明 ” 一 节 中 描 述 说 明 的 语 法 。
-
在 第 7 章 “ 说 明 符 ” 的 “ 说 明 符 ” 一 节 中 描 述 说 明 符 语 法 。
-
在 第 8 章 “ 类 ” 的 “ 类 ” 一 节 中 讨 论 用 于 说 明 类 的 语 法 。
-
在 第 5 章 “ 语 句 ” 的 “ 语 句 ” 一 节 中 讨 论 用 于 写 语 句 的 语 法 。
-
在 “ Microsoft 扩 展 ” 一 节 上 讨 论 只 适 用 于 Microsoft C++ 的 特 性 。很 多 这 些 特 性 在 附 录 B “ Microsoft 特 殊 修 饰 符 ” 中 涉 及 。
关 键 字
类 名 称 :
标 识 符枚 举 名 称 :
标 识 符
typedef 名 称 :
标 识 符
标 识 符 : 以 下 之 一
非 数 字
标 识 符 非 数 字标 识 符 数 字
非 数 字 : 以 下 之 一
_ a b c d e f g h I j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z 数 字 : 以 下 之 一
0 1 2 3 4 5 6 7 8 9
表 达 式
表 达 式 :
赋 值 表 达 式
表 达 式 , 赋 值 表 达 式赋 值 表 达 式 :
条 件 表 达 式
单 目 表 达 式 赋 值 运 算 符 赋 值 表 达 式
赋 值 运 算 符 : 以 下 之 一
= *= /= %= += -= >= <= &= ^= |= 条 件 表 达 式 :
逻 辑 或 表 达 式
逻 辑 或 表 达 式 ? 表 达 式 : 条 件 表 达 式逻 辑 或 表 达 式 :
逻 辑 与 表 达 式
逻 辑 或 表 达 式 || 逻 辑 与 表 达 式逻 辑 与 表 达 式 :
逻 辑 或 表 达 式
逻 辑 与 表 达 式 && 或 表 达 式或 表 达 式 :
异 或 表 达 式
或 表 达 式 | 异 或 表 达 式异 或 表 达 式 :
与 表 达 式
异 或 表 达 式 ^ 与 表 达 式与 表 达 式 :
相 等 表 达 式
与 表 达 式 & 相 等 表 达 式相 等 表 达 式 :
关 系 表 达 式
相 等 表 达 式 == 关 系 表 达 式相 等 表 达 式 != 关 系 表 达 式
关 系 表 达 式 :
移 位 表 达 式
关 系 表 达 式 < 移 位 表 达 式关 系 表 达 式 > 移 位 表 达 式关 系 表 达 式 <= 移 位 表 达 式关 系 表 达 式 >= 移 位 表 达 式
移 位 表 达 式 :
加 法 表 达 式
移 位 表 达 式 << 加 法 表 达 式移 位 表 达 式 >> 加 法 表 达 式
加 法 表 达 式 :
乘 法 表 达 式
加 法 表 达 式 + 乘 法 表 达 式加 法 表 达 式 - 乘 法 表 达 式
乘 法 表 达 式 :
段 表 达 式
乘 法 表 达 式 * 段 表 达 式乘 法 表 达 式 / 段 表 达 式乘 法 表 达 式 % 段 表 达 式
段 表 达 式 :
指 向 成 员 指 针 表 达 式
段 表 达 式 :> 指 向 成 员 指 针 表 达 式指 向 成 员 指 针 表 达 式 :
类 型 转 换 表 达 式
指 向 成 员 指 针 表 达 式 .* 类 型 转 换 表 达 式指 向 成 员 指 针 表 达 式 ->* 类 型 转 换 表 达 式
类 型 转 换 表 达 式 : 单 目 表 达 式
( 类 型 名 称 ) 类 型 转 换 表 达 式单 目 表 达 式 :
后 缀 表 达 式
++ 单 目 表 达 式
-- 单 目 表 达 式
单 目 运 算 符 类 型 转 换 表 达 式sizeof 单 目 运 算 符
sizeof ( 类 型 名 称 ) 分 配 表 达 式
取 消 分 配 表 达 式单 目 运 算 符 : 以 下 之 一
* & + - ! ~ 分 配 表 达 式 :
:: opt new 位 置 opt new 类 型 名 称 new 初 始 化 符 opt
:: opt new 位 置 opt ( 类 型 名 称 ) new 初 始 化 符 opt
位 置 :
( 表 达 式 表 ) new 类 型 名 称 :
类 型 指 示 符 表 new 说 明 符 opt
new 说 明 符 :
ms 修 饰 符 表 opt * cv 限 定 符 表 opt new 说 明 符 opt ms 修 饰 符 表 opt 完 整 类 名 称 :: *cv 限 定 符 表 opt new 说 明 符 opt
new 说 明 符 opt [ 表 达 式 ] new 初 始 化 器 :
( 初 始 化 器 表 ) 取 消 分 配 表 达 式 :
::opt delete 造 型 表 达 式
::opt delete[ ] 造 型 表 达 式后 缀 表 达 式 :
基 本 表 达 式
后 缀 表 达 式 [ 表 达 式 ] 后 缀 表 达 式 ( 表 达 式 表 )
简 单 类 型 名 称 ( 表 达 式 表 ) 后 缀 表 达 式 . 名 称
后 缀 表 达 式 -> 名称
后 缀 表 达 式 ++ 后 缀 表 达 式 -
dynamic_cast< 类 型 标 识 > ( 表 达 式 ) static_cast< 类 型 标 识 > ( 表 达 式 ) const_cast< 类 型 标 识 > ( 表 达 式 ) reinterpret_cast< 类 型 标 识 > ( 表 达 式 ) typeid( 表 达 式 )
typeid( 类 型 标 识 ) 表 达 式 表 :
赋 值 表 达 式
表 达 式 表 , 赋 值 表 达 式基 本 表 达 式 :
literal this
:: 标 识 符
:: 运 算 符 函 数 名 称
:: 限 定 名 ( 表 达 式 ) 名 称
名 称 :
标 识 符
运 算 符 函 数 名 称转 换 函 数 名 称
~ 类 名 称限 定 名
限 定 名 :
ms 修 饰 符 表 opt 限 定 类 名 称 :: 名 称literal:
整 型 常 量字 符 型 常 量浮 点 型 常 量字 符 串 文 字
整 型 常 量 :
十 进 制 常 量 整 型 后 缀 opt 八 进 制 常 量 整 型 后 缀 opt 十 六 进 制 常 量 整 型 后 缀 opt
- c 字 符 序 列 ′ 十 进 制 常 量 :
非 零 数 字
十 进 制 常 量 数 字八 进 制 常 量 :
0
八 进 制 常 量 八 进 制 数 字十 六 进 制 常 量 :
0x 十 六 进 制 数 字
0X 十 六 进 制 数 字
十 六 进 制 常 量 十 六 进 制 数 字非 零 数 字 : 以 下 之 一
1 2 3 4 5 6 7 8 9 八 进 制 数 字 : 以 下 之 一
0 1 2 3 4 5 6 7 十 六 进 制 数 字 : 以 下 之 一
0 1 2 3 4 5 6 7 8 9 a b c d e f
A B C D E F 整 型 后 缀 :
无 符 号 后 缀 长 整 型 后 缀 opt
长 整 型 后 缀 无 符 号 后 缀 opt
无 符 号 后 缀 : 以 下 之 一u U
长 整 型 后 缀 : 以 下 之 一l L
字 符 常 量 :
'c 字 符 序 列 ' L'c 字 符 序 列 '
c 字 符 序 列 :
c 字 符
c 字 符 序 列 c 字 符c 字 符 :
源 字 符 集 中 除 单 引 号 ( ′ ) 、 反 斜 线 (\) 、 换 行 字 符 以 外 的 任 何 字 符转 义 字 符
转 义 字 符 :
简 单 转 义 字 符八 进 制 转 义 字 符
十 六 进 制 转 义 字 符 简 单 转 义 序 列 : 以 下 之 一
\ ′ \" \? \\
\a \b \f \n \r \t \v 八 进 制 转 义 序 列 :
\ 八 进 制 数 字
\ 八 进 制 数 字 八 进 制 数 字
\ 八 进 制 数 字 八 进 制 数 字 八 进 制 数 字十 六 进 制 转 义 序 列 :
\x 十 六 进 制 数 字
十 六 进 制 转 义 序 列 十 六 进 制 数 字浮 点 常 量 :
分 数 常 量 指 数 部 分 opt 浮 点 后 缀 opt
数 字 序 列 指 数 部 分 浮 点 后 缀 opt
分 数 常 量 :
数 字 序 列 opt . 数 字 序 列数 字 序 列 .
指 数 部 分 :
e 符号 opt 数 字 序 列E 符号 opt 数 字 序 列
符 号 : 以 下 之 一
+ - 数 字 序 列 :
数 字
数 字 序 列 数 字浮 点 后 缀 : 以 下 之 一
f l F L 字 符 串 文 字 :
"s 字 符 串 序 列 opt " L"s 字 符 串 序 列 opt"
s 字 符 序 列 :
s 字 符
s 字 符 序 列 s 字 符s 字 符 :
源 字 符 集 中 除 双 引 号 (") 、 反 向 斜 线 (\) 、 换 行 字 符 以 外 的 任 何 字 符转 义 序 列
说 明
说 明 :
说 明 说 明 符 opt 说 明 符 表 opt
asm 说 明函 数 定 义连 接 规 格模 板 说 明
asm 说 明 :
_asm( 字 符 串 文 字 ); 说 明 指 示 符 表
说 明 指 示 符 表 opt 说 明 指 示 符说 明 指 示 符 :
存 储 类 指 示 符类 型 指 示 符函 数 指 示 符friend typedef
__declspec( 扩 展 说 明 修 饰 符 序 列 ) 存 储 类 型 指 示 符 :
auto register
static extern
函 数 指 示 符 :
inline virtual
类 型 指 示 符 :
简 单 类 型 名 称类 指 示 符
枚 举 指 示 符全 类 型 指 示 符const volatile
扩 展 说 明 修 饰 符 序 列 : 扩 展 说 明 修 饰 符 opt
扩 展 说 明 修 饰 符 扩 展 说 明 修 饰 符 序 列扩 展 说 明 修 饰 符 :
thread naked dllimport dllexport
简 单 类 型 名 称 :
完 整 类 型 名 称
char short int long signed unsigned float double void
全 类 型 指 示 符 :
类 关 键 字 标 识 符类 关 键 字 类 名 称枚 举 名 称
类 关 键 字 :
class struct union
限 定 类 型 名 称 : typedef 名称
类 名 称 :: 限 定 类 型 名 称完 整 类 名 称 :
:: 限 定 类 型 名 称限 定 类 型 名 称 :
类 名 称
类 名 称 :: 限 定 类 型 名 称枚 举 指 示 符 :
enum 标 识 符 opt { 枚 举 列 表 opt } 枚 举 列 表 :
枚 举 符
枚 举 列 表 , 枚 举 符枚 举 符 :
标 识 符
标 识 符 = 常 量 表 达 式常 量 表 达 式 :
条 件 表 达 式连 接 规 格 :
extern 字 符 串 文 字 { 说 明 表 opt }
extern 字 符 串 文 字 说 明说 明 表 :
说明
说 明 表 说 明模 板 说 明 :
模 板 参 量 表 :
模 板 参 量
模 板 参 量 表 , 模 板 参 量模 板 参 量 :
类 型 参 量参 量 说 明
类 型 参 量 :
class 标 识 符模 板 类 名 称 :
模 板 名 称 < 模 板 参 量 表 > 模 板 参 量 表 :
模 板 参 量
模 板 参 量 表 , 模 板 参 量模 板 参 量 表 :
模 板 参 量
模 板 参 量 表 , 模 板 参 量模 板 参 量 :
表 达 式类 型 名 称
原 始 名 称 空 间 名 称 : 标 识 符
名 称 空 间 定 义 :
原 始 名 称 空 间 定 义扩 展 名 称 空 间 定 义无 名 名 称 空 间 定 义
原 始 名 称 空 间 定 义 :
namespace 标 识 符 { 名 称 空 间 体 } 扩 展 名 称 空 间 定 义 :
namespace 原 始 名 称 空 间 名 称 { 名 称 空 间 体 } 无 名 名 称 空 间 定 义 :
namespace { 名 称 空 间 体 } 名 称 空 间 体 :
说 明 序 列 opt
id 表 达 式 :
无 限 定 id 限 定 id
嵌 套 名 称 指 示 符 :
类 或 名 称 空 间 名 称 :: 嵌 套 名 称 指 示 符 opt
类 或 名 称 空 间 名 称 : 类 名 称
名 称 空 间 名 称名 称 空 间 名 称 :
原 始 名 称 空 间 名 称
名 称 空 间 别 名名 称 空 间 别 名 :
标 识 符
名 称 空 间 别 名 定 义 :
namespace 标 识 符 = 限 定 名 称 空 间 指 示 符 ; 限 定 名 称 空 间 指 示 符 :
:: opt 嵌 套 名 称 指 示 符 opt 类 或 名 称 空 间 名 称用 法 说 明 :
using:: opt 嵌 套 名 称 指 示 符 未 限 定 id using:: 未 限 定 id
用 法 命 令 :
using namespace :: opt 嵌 套 名 称 指 示 符 opt 名 称 空 间 名 称
说 明 符
说 明 符 表 :
初 始 化 说 明 符
说 明 符 表 , 初 始 化 说 明 符初 始 化 说 明 符 :
ms 修 饰 符 表 opt 说 明 符 初 始 化 器 opt
说 明 符 :
说 明 名 称
指 针 运 算 符 说 明 符
说 明 符 ( 参 量 说 明 表 ) cv 修 饰 符 表 opt
说 明 符 [ 常 量 表 达 式 opt ] ( 说 明 符 )
cv 修 饰 符 表 :
cv 限 定 符 cv 修 饰 符 表 opt
指 针 运 算 符 :
ms 修 饰 符 表 opt * cv 限 定 符 表 opt
ms 修 饰 符 表 opt & cv 限 定 符 表 opt
ms 修 饰 符 表 opt 完 整 类 型 名 称 :: *cv 限 定 符 表 opt
cv 修 饰 符 表 :
cv 修 饰 符 cv 修 饰 符 表 opt
cv 限 定 符 :
const volatile
dname:
名 称类 名 称
~ 类 型 名 称typedef 名称限 定 类 型 名 称
类 型 名 称 :
类 型 指 示 符 表 ms 修 饰 符 表 opt 抽 象 说 明 符 opt
类 型 指 示 符 表 :
类 型 指 示 符 类 型 指 示 符 表 opt
抽 象 说 明 符 :
指 针 运 算 符 ms 修 饰 符 表 opt 抽 象 说 明 符 opt 抽 象 说 明 符 opt ( 参 量 说 明 表 ) cv 限 定 符 表抽 象 说 明 符 opt [ 常 量 表 达 式 opt ]
(ms 修 饰 符 表 opt 表 抽 象 说 明 符 ) 参 数 说 明 表 :
参 量 说 明 表 opt opt
参 量 说 明 表 , . . .
参 量 说 明 表 :
参 数 说 明
参 量 说 明 表 , 参 数 说 明参 数 说 明 :
decl 指 示 符 ms 修 饰 符 表 opt 说 明 符
decl 指 示 符 ms 修 饰 符 表 opt 说 明 符 = 表 达 式decl 指 示 符 ms 修 饰 符 表 opt 抽 象 说 明 符 opt
decl 指 示 符 ms 修 饰 符 表 opt 抽 象 说 明 符 opt = 表 达 式函 数 定 义 :
decl 指 示 符 opt ms 修 饰 符 表 opt 说 明 符 ctor 初 始 化 器 opt 函 数 体函 数 体 :
复 合 语 句初 始 化 器 :
= 表 达 式
= { 初 始 化 器 表 opt } ( 表 达 式 表 )
初 始 化 器 表 :
表 达 式
初 始 化 器 表 , 表 达 式
{ 初 始 化 器 表 , opt }
类
类 指 示 符 :
类 头 { 成 员 表 opt } 类 头 :
类 关 键 字 环 境 模 式 opt 标 识 符 opt 基 类 指 示 符 opt
类 关 键 字 环 境 模 式 opt 类 名 称 基 类 指 示 符 opt
成 员 表 :
成 员 说 明 成 员 表 opt
访 问 指 示 符 : 成 员 表 opt
成 员 说 明 :
说 明 指 示 符 成 员 说 明 符 表 opt ;
函 数 定 义 ; opt
限 定 名 ;
成 员 说 明 符 表 : 成 员 说 明 符
成 员 说 明 符 表 , 成 员 说 明 符成 员 说 明 符 :
ms 修 饰 符 表 opt 说 明 符 纯 指 示 符 opt
标 识 符 opt : 常 量 表 达 式纯 指 示 符 :
=0
基 类 指 示 符 :
: 基 类 表基 类 表 :
基 类 指 示 符
基 类 表 , 基 类 指 示 符基 类 指 示 符 :
完 整 类 名 称
virtual 访 问 指 示 符 opt 完 整 类 名 称
访 问 指 示 符 virtual opt 完 整 类 名 称访 问 指 示 符 :
private protected
public
转 换 函 数 名 称 :
operator 转 换 类 型 名 称转 换 类 型 名 称 :
类 型 指 示 符 表 指 针 运 算 符 opt
ctor 初 始 化 器 :
: 成 员 初 始 化 器 表成 员 初 始 化 器 表 :
成 员 初 始 化 器
成 员 初 始 化 器 , 成 员 初 始 化 器 表成 员 初 始 化 器 :
完 整 类 名 称 ( 表 达 式 表 opt) 标 识 符 ( 表 达 式 表 opt )
运 算 符 函 数 名 称 : operator 运 算 符
运 算 符 : 以 下 之 一
new delete
+ |
- |
* |
/ |
% |
^ |
& |
| |
~ |
---|---|---|---|---|---|---|---|---|
! |
= |
< |
> |
+= |
-= |
*= |
/= |
%= |
^= |
&= |
|= |
<< |
>> |
>>= |
<<= |
== |
!= |
<= |
>= |
&& |
|| |
++ |
-- |
, |
->* |
-> |
() |
[] |
语 句
语 句 :
标 号 语 句
表 达 式 语 句
复 合 语 句
选 择 语 句
迭 代 语 句
跳 转 语 句
说 明 语 句
try-except 语 句
try-finally 语 句标 号 语 句
标 识 符 : 语句
case 常 量 表 达 式 : 语 句
default : 语句表 达 式 语 句 :
表 达 式 opt ; 复 合 语 句 :
{ 语 句 表 opt } 语 句 表 :
语句
语 句 表 语 句选 择 语 句 :
if ( 表 达 式 ) 语 句
if ( 表 达 式 ) 语 句 else 语 句
switch ( 表 达 式 ) 语 句迭 代 语 句 :
while ( 表 达 式 ) 语 句
do 语 句 while ( 表 达 式 ) ;
for (for 初 始 化 语 句 表 达 式 opt ; 表 达 式 opt) 语 句for 初 始 化 语 句 :
表 达 式 语 句
说 明 语 句跳 转 语 句 :
break;
continue;
return 表 达 式 opt ;
goto 标 识 符 ; 说 明 语 句 :
说明
try-except 语 句 :
__ try 复 合 语 句
__ excep t ( 表 达 式 ) 复 合 语 句
try-finally 语 句 :
__ try 复 合 语 句
__ finally ( 表 达 式 ) 复 合 语 句
M icrosoft 扩 展
asm 说 明 :
__asm 汇 编 指 令 ; opt
__asm { 汇 编 指 令 表 } ; opt
汇 编 指 令 表 : 汇 编 指 令 ; opt
汇 编 指 令 ; 汇 编 指 令 表 ; opt
ms 修 饰 符 表 :
ms 修 饰 符 ms 修 饰 符 表 opt
ms 修 饰 符 :
__cdecl
__fastcall
__stdcall
__syscall( 为 将 来 实 现 而 保 留 )
__oldcall( 为 将 来 实 现 而 保 留 )
__unaligned( 为 将 来 实 现 而 保 留 ) 基 修 饰 符
基 修 饰 符 :
__based ( 基 类 型 ) 基 类 型 :
名 称
附 录 B M icrosoft 特 殊 修 饰 符
很 多 Microsoft 特 殊 的 关 键 字 可 以 用 来 修 饰 说 明 符 以 形 成 派 生 类 型 ( 有 关 说 明 符的 更 多 信 息 参 见 第 7 章 “ 说 明 符 ” ) 。
表 B.1 Microsoft 特 殊 的 关 键 字
关键字 |
意义 |
是 否 用 于 形 成 派 生 类 |
---|---|---|
__ asm |
加入后续的汇编语言代码 |
否 |
__ based |
把后续的名称说明为相对于说明中所 包含的 32 位基址的一个 32 位的偏移 |
是 |
地址 |
||
__ cdecl |
把后面跟着的名称按 C 语言规则命名 并用 C 语言的调用规则。 |
是 |
__ declspec |
把 后 面 跟 着 的 名 称 (thread,naked, dllimport,dllexport) 说 明 为 |
否 |
Microsoft 特殊的存储属性 |
||
__ fastcall |
把后面所说明的函数名称说明为只要 有可能就使用寄存器来传递参数而不 |
是 |
是用堆栈来传递参数 |
__ stdcall 把后面所说明的函数名称说明为遵循
标准转换规则
续 表
是
下 面 的 几 节 讨 论 有 关 Microsoft 的 特 殊 修 饰 符 的 句 法 使 用 和 语 义 上 的 意 义 。
基 地 址
这 一 节 包 括 下 面 一 些 主 题 :
-
__ based
-
基 指 针
-
基 于 指 针 的 指 针
在 32 位 的 编 辑 环 境 中 使 用 __ based
当 你 要 显 式 控 制 分 配 静 态 和 动 态 基 址 数 据 对 象 的 段 时 , 基 地 址 是 很 有 用 的 。
在 32 位 编 辑 环 境 中 , 基 地 址 的 唯 一 可 接 受 形 式 是 “ 基 于 一 个 指 针 ” , 该 指 针 定 义了 一 个 对 于 一 个 32 位 的 基 址 所 含 的 32 位 的 偏 址 ; 或 者 基 于 void 型 。
语 法
基 范 围 修 饰 符 :
__ based ( 基 表 达 式 ) 基 表 达 式 :
基 变 量
基 抽 象 说 明 符段 名 称
段 造 型基 变 量 :
标 识 符
基 抽 象 说 明 符 : 抽 象 说 明 符
基 类 型 :
类 型 名 称
基 指 针
在 32 位 的 编 辑 环 境 中 , __based 关 键 字 的 唯 一 有 效 形 式 是 基 于 指 针 地 址 的 指 针 。在 这 种 编 辑 环 境 中 , 基 指 针 是 一 个 对 32 位 基 地 址 的 32 位 的 偏 移 量 。
当 对 一 个 基 地 址 指 针 进 行 间 接 引 用 时 , 基 地 址 要 么 是 显 式 地 说 明 了 的 , 要 么 是 通过 说 明 已 经 隐 含 知 道 了 的 。
基 于 指 针 的 指 针
基 地 址 的 “ 基 于 指 针 ” 的 变 量 使 得 可 以 把 一 个 指 针 说 明 为 “ 基 表 达 式 ”。 这 个 基指 针 就 成 为 了 一 个 段 的 偏 移 量 , 此 段 开 始 于 这 个 基 指 针 所 基 于 的 地 址 的 开 始 。
基 于 指 针 的 指 针 的 一 个 用 途 是 为 了 保 留 含 有 指 针 的 对 象 。 一 个 基 于 指 针 的 指 针的 链 表 可 以 保 存 到 磁 盘 上 并 能 重 新 载 入 到 存 储 器 的 其 他 地 方 , 并 且 指 针 依 然 是 有效 的 。 下 面 的 例 子 说 明 了 一 个 这 样 的 链 表 :
struct llist_t
{
void __ based(vpBuffer) *vpData;
llist_t __ based(vpBuffer) *llNext;
};
指 针 vpBuffer 赋 值 为 在 程 序 后 面 分 配 的 存 储 器 地 址 ; 然 后 该 链 表 可 以 相 对 于vpBuffer 的 值 重 新 装 载 。
在 32 位 的 编 辑 环 境 中 , 基 于 指 针 地 址 的 指 针 是 __ base 有 效 的 唯 一 形 式 。 在 这 种编 辑 环 境 中 , 它 们 是 32 位 基 址 的 32 位 的 位 置 。
调 用 和 命 名 的 常 规 修 饰 符
调 用 规 则 决 定 了 函 数 是 如 何 调 用 的 ; 命 名 规 则 决 定 了 如 何 对 待 外 部 名 。 有 关 详情 参 见 联 机 “ Microsoft Visual C++ 6.0 程 序 员 指 南 ” 中 的 “ 调 用 规 定 主 题 ”。
扩 展 存 储 类 属 性
这 一 节 描 述 扩 展 属 性 语 法 , 它 精 简 并 规 范 化 了 对 Miscrosoft C/C++ 的 扩 展 。 使用 扩 展 属 性 语 法 的 存 储 类 属 性 包 括 :thread 、 naked 、 dllimport 及 dllexport 。
扩 展 属 性 语 法
扩 展 属 性 语 法 是 用 __declspec 关 键 字 说 明 存 储 类 信 息 , 它 说 明 了 一 个 给 定 类 型的 对 象 的 实 例 是 按 Microsoft 特 殊 的 存 储 类 属 性 ( thread 、 naked 、 dllimport 、dllexport 、 nothrow 、 property 、 selectany 或 uuid) 进 行 存 储 。 其 他 的 存 储类 修 饰 符 的 例 子 包 括 :static 和 extern 关 键 字 。 然 而 , 这 些 关 键 字 是 ANSI 规 范的 C 和 C++ 语 言 的 一 部 分 , 故 而 扩 展 属 性 语 法 不 涉 及 它 们 。
下 面 是 C++ 的 扩 展 属 性 语 法 :
语 法
说 明 指 示 符 :
__declspec( 扩 展 的 说 明 修 饰 符 序 列 ) 扩 展 的 说 明 修 饰 符 序 列 :
扩 展 的 说 明 修 饰 符 opt
扩 展 的 说 明 修 饰 符 扩 展 的 说 明 修 饰 符 序 列扩 展 的 说 明 修 饰 符 :
thread naked dllimport dllexport nothrow property
selectany uuid("ComObjectGUID")
空 白 符 用 于 分 隔 说 明 修 饰 符 序 列 。 语 法 的 例 子 将 在 后 面 几 节 上 给 出 。
存 储 类 属 性 thread 、naked 、dllimport 、dllexport 、nothrow 、property 、selectany 和 uuid 仅 仅 只 是 它 们 所 作 用 的 对 象 说 明 和 函 数 说 明 的 属 性 。 不 象 __near 和 _ _ far 关 键 字 , 它 们 实 际 上 影 响 对 象 或 函 数 的 类 型 ( 在 这 种 情 况 下 ,2 字 节 和 4 字 节 的 地址 ), 这 些 存 储 类 属 性 并 不 重 新 定 义 对 象 自 身 的 类 型 属 性 。 thread 属 性 仅 影 响 数据 和 对 象 。 naked 属 性 仅 影 响 函 数 。 dllimport 属 性 和 dllexport 属 性 仅 影 响 函数 、 数 据 和 对 象 。 property 、 selectany 和 uuid 属 性 仅 影 响 COM 对 象 。
thread 属 性
线 程 局 部 存 储 (TLS) 是 一 种 机 制 , 通 过 这 种 机 制 , 在 一 个 多 线 程 的 进 程 中 每 个 线程 可 以 为 线 程 特 有 的 数 据 分 配 存 储 。 在 标 准 多 线 程 的 程 序 中 , 数 据 是 在 给 定 进 程的 所 有 线 程 中 共 享 的 , 然 而 线 程 局 部 存 储 是 一 种 可 以 为 每 个 线 程 分 配 数 据 的 机制 。 有 关 线 程 的 完 整 讨 论 参 见 联 机 “ Visual C++ 程 序 员 指 南 ” 中 的 “ 多 线 程 主题 ” 。
C/C++ 语 言 包 括 扩 展 存 储 类 属 性 thread 。 thread 属 性 必 须 同 _ _ declspec 关 键 字一 起 使 用 来 说 明 一 个 线 程 变 量 。 例 如 , 下 面 的 代 码 说 明 为 一 个 整 型 线 程 局 部 变 量并 把 它 用 一 个 值 进 行 初 始 化 :
__ declspec(thread) int tls_i = 1;
在 说 明 一 个 线 程 局 部 对 象 和 变 量 时 , 必 须 遵 循 如 下 的 一 些 准 则 :
- thread 属 性 只 能 适 用 于 数 据 的 说 明 和 定 义 以 及 不 含 成 员 函 数 的 类 。
它 还 能 用 于 函 数 的 说 明 和 定 义 。 例 如 , 下 面 的 代 码 会 产 生 一 个 编 译错 误 :
#define Thread __declspec(thread) Thread void func(); // 错 误
- 你 只 能 对 具 有 静 态 存 储 期 的 数 据 项 说 明 thread 属 性 。 这 包 括 全 局数 据 对 象 ( 包 括 static 和 exte rn ) 、 局 部 静 态 对 象 和 类 的 静 态 数 据成 员 。 你 不 能 说 明 一 个 自 动 类 型 数 据 对 象 具 有 thread 属 性 。 例 如 , 下 面 的 代 码 会 引 起 编 译 错 误 :
#define Thread __ declspec(thread) void func1()
{
Thread int tls_i; // 错 误
}
int func2(Thread int tls_i) // 错误
{
return tls_i;
}
- 无 论 说 明 和 定 义 是 出 现 在 同 一 文 件 中 还 是 不 同 的 文 件 中 , 对 于 线 程局 部 对 象 的 说 明 和 定 义 要 都 使 用 thread 属 性 。 如 下 例 子 , 下 述 代 码会 产 生 错 误 :
#define Thread __ declspec(thread)
extern int tls_i; // 这 将 产 生 错 误 ,
int Thread tls_i; // 因 为 说 明 与 定 义 不 同
- 你 不 能 把 thread 属 性 作 为 类 型 修 饰 符 使 用 。 例 如 , 下 述 代 码 会 产 生编 译 错 误 :
char __ declspec(thread) *ch;// 错 误
- 如 果 类 不 含 有 成 员 函 数 , 则 类 可 以 用 thread 属 性 进 行 实 例 化 。 如 果在 类 的 说 明 部 分 没 有 说 明 对 象 则 thread 属 性 将 被 忽 略 。 例 如 :
__ declspec(thread) class X { public:
int I; } x; //x 是 个 线 程 对 象X y; //y 不 是 一 个 线 程 对 象
因 为 允 许 说 明 具 有 thread 属 性 的 对 象 , 下 面 的 两 个 例 子 在 意 义 上 完 全 一 样 : #define Thread __ declspec(thread)
Thread class B
{
// 代 码
} BObject;// 可 以 :BObject 说 明 为 线 程 局 部 对 象class B
{
// 代 码
}
Thread B BObject; // 可 以 :BObject 说 明 为 线 程 局 部 对 象
- 标 准 的 C 允 许 用 一 个 包 含 对 自 身 引 用 的 表 达 式 对 一 个 对 象 或 变 更 进行 初 始 化 , 但 仅 能 对 非 静 态 领 域 的 对 象 进 行 初 始 化 。 尽 管 C++ 通 常 允许 有 一 个 包 含 有 对 自 身 引 用 的 表 达 式 对 外 对 象 进 行 动 态 初 始 化 , 但这 种 类 型 的 初 始 化 不 能 用 于 对 线 程 局 部 对 象 进 行 初 始 化 。 例 如 :
#define Thread __ declspec(thread)
Thread int tls_i = tls_i; // 在 C 和 C++ 中 均 是 错 误 的int j = j; // 在 C++ 是 正 确 的 但 在 C 中 是 错 误 的
Thread int tls_i = sizeof(tls_i)// 在 C 和 C++ 中 均 是 正 确 的
注 意 sizeof 表 达 式 中 包 含 了 要 被 初 始 化 的 对 象 , 但 并 不 构 成 一 个 对 自 身 的 引 用 , 因 而 在 C 和 C++ 中 均 是 允 许 的 。
naked 属 性
对 于 用 naked 属 性 定 义 的 函 数 , 编 译 器 产 生 的 代 码 不 会 包 括 前 言 和 结 尾 部 分 代码 。 利 用 这 种 特 性 你 可 以 用 内 嵌 汇 编 代 码 写 出 自 己 的 前 言 和 结 尾 部 分 代 码 序 列 。带 naked 属 性 的 函 数 在 写 虚 拟 设 备 驱 动 程 序 时 特 别 有 用 。
因 为 naked 属 性 仅 仅 同 函 数 的 定 义 有 关 并 且 又 不 是 一 个 类 型 修 饰 符 , 故 如 前 面 所述 , 带 naked 属 性 的 函 数 使 用 扩 展 属 性 语 法 。 例 如 如 下 代 码 定 义 了 一 个 带 naked 属 性 的 函 数 :
__ declspec(naked) int func(formal_parameters)
{
// 函 数 体
}
或 者 可 以 写 成 :
#define Naked __ declspec(naked) Naked int func(formal_parameters)
{
// 函 数 体
}
naked 属 性 只 影 响 编 译 器 为 函 数 的 前 言 和 结 尾 部 分 序 列 产 生 代 码 的 性 质 。 它 并不 会 影 响 到 调 用 此 函 数 所 生 成 的 代 码 。 因 此 ,naked 属 性 还 能 视 为 函 数 类 型 的 一部 分 , 并 且 函 数 指 针 也 不 能 具 有 naked 属 性 。 而 且 naked 属 性 也 不 能 用 于 数 据 的定 义 。 例 如 , 下 面 的 示 例 代 码 会 产 生 错 误 :
__ declspec(naked) int i; // 错 误 :naked 属 性 不 能 用 于 数 据 的 定 义
naked 属 性 仅 只 同 函 数 的 定 义 有 关 并 不 能 在 函 数 的 原 型 中 说 明 。 例 如 : 下 面 的 说明 会 产 生 编 译 错 误 :
__ declspec(naked) int func(); // 错误 :naked 属 性 不 能 用 于 函 数 的 说 明
规 则 与 限 制
-
一 个 带 naked 属 性 的 函 数 中 不 允 许 有 返 回 语 句 。但 是 , 可 以 通 过 在 RET 指 令 之 前 把 一 个 值 放 入 到 EAX 寄 存 器 来 返 回 一 个 整 型 。
-
结 构 异 常 处 理 结 构 在 带 naked 属 性 的 函 数 中 是 不 允 许 的 , 因 为 这 一结 构 必 须 交 叉 展 开 堆 栈 框 架 。
-
setjmp 进 行 时 间 函 数 也 还 能 在 带 naked 属 性 的 函 数 中 使 用 , 因 为 它必 须 是 交 叉 展 开 堆 栈 框 架 。 但 是 使 用 longjmp 运 行 时 间 函 数 是 允 许
的 。
-
在 带 naked 属 性 的 函 数 中 不 允 许 使 用 _alloca 函 数
-
要 保 证 在 前 言 序 列 之 前 不 能 有 对 局 部 变 量 的 初 始 化 代 码 , 在 函 数 范围 中 初 始 化 局 部 变 量 是 不 允 许 的 。 特 别 的 , 在 函 数 范 围 中 说 明 C++ 对象 是 不 允 许 的 。 然 而 , 在 一 个 嵌 套 的 范 围 是 可 以 初 始 化 对 象 的 。
-
不 推 荐 对 框 架 指 针 进 行 优 化 (/Oy 编 译 器 选 项 ), 对 于 带 naked 属 性 的函 数 该 指 示 是 自 动 关 闭 的 。
写 前 言 / 结 尾 部 分 代 码 考 虑 的 事 情
在 写 你 自 己 的 前 言 和 结 尾 部 分 代 码 序 列 之 前 , 理 解 堆 栈 框 架 如 何 布 置 是 很 重 要 。理 解 符 号 __ LOCAL _ SIZE 的 使 用 也 很 重 要 。
C++ 堆 栈 框 架 的 布 置
这 一 例 子 给 出 了 可 能 出 现 在 32 位 函 数 中 的 标 准 前 言 代 码 : push ebp; 存 储 ebp
mov ebp, esp ; 设 置 堆 栈 框 架 指 针sub esp, localbytes; 为 locals 分 配 空 间push<registers>; 存 储 registers
localbytes 变 量 代 表 了 在 堆 栈 上 为 局 部 变 量 所 需 的 字 节 数 , 而 <registers> 变 量是 一 个 位 置 容 器 代 表 了 一 系 列 要 保 存 在 堆 栈 上 的 寄 存 器 。 在 保 存 了 寄 存 器 以 后 , 你 可 以 在 堆 栈 上 放 置 任 何 合 适 的 数 据 了 。 下 面 是 相 应 的 结 尾 部 分 代 码 :
pop <registers> ; 恢 复 registers
mov esp, ebp ; 恢 复 堆 栈 指 针pop ebp ; 恢 复 ebp
ret ; 从 函 数 返 回
堆 栈 总 是 向 下 生 长 的 ( 从 存 储 器 高 地 址 向 存 储 器 低 地 址 生 长 ) 。 基 指 针 (ebp) 指 向是 由 ebp 压 入 的 值 。 这 一 局 部 区 开 始 于 ebp-2 。要 存 储 局 部 变 量 , 只 要 通 过 从 ebp 中 减 去 一 个 合 适 的 值 , 从 ebp 中 计 算 出 正 确 的 偏 移 量 即 可 。
__ LOCAL _ SIZE
编 译 器 提 供 了 一 个 符 号 ( __ LOCAL _ SIZE) 用 于 在 函 数 前 言 代 码 的 内 嵌 汇 编 块 中 使用 。
在 自 定 义 的 前 言 代 码 中 , 这 一 符 号 是 用 于 在 堆 栈 框 架 上 为 局 部 变 量 分 配 空 间 。
编 译 器 决 定 了 __ LOCAL _SIZE 值 的 大 小 。 它 的 值 是 所 有 用 户 自 定 义 的 局 部 变 量 和 编译 器 生 成 的 临 时 变 量 的 整 体 字 节 大 小 。__ LOCAL _SIZE 只 能 作 为 直 接 操 作 数 来 使 用 ; 它 不 能 在 表 达 式 中 使 用 。 也 不 能 够 重 定 义 或 改 变 该 符 号 的 值 。 例 如 :
mov eax, __ LOCAL_SIZE ; 直 接 操 作 数 , 正 确mov eax, [ebp - __ LOCAL_SIZE] ; 错 误
下 面 的 例 子 上 一 个 含 有 自 定 义 的 前 言 和 结 尾 部 分 序 列 的 带 naked 属 性 的 函 数 , 在前 言 序 列 中 使 用 了 __ LOCAL _ SIZE 符 号 :
__ declspec (naked) func()
{
int i;
int j;
__ asm /* 前 言 代 码 */
{
push ebp
move e bp, esp
sub esp, __ LOCAL_SIZE
}
/* 函 数 体 */
__ asm /* 结 尾 部 分 代 码 */
{
move e sp, ebp
pop ebp
ret
}
}
dllexport 和 dllimport 属 性
存 储 类 修 饰 符 dllexport 和 dllimport 是 为 了 从 一 个 DLL 中 输 出 及 输 入 函 数 、数 据 和 对 象 。 这 些 修 饰 符 或 者 属 性 , 显 式 定 义 了 DLL 对 用 户 端 的 接 口 , 用 户 端 可以 是 一 个 可 执 行 文 件 或 另 一 个 DLL 。 把 函 数 说 明 为 具 有 dllexport 属 性 可 以 不
需 要 模 块 定 义 文 件 (.DEF), 至 少 可 以 不 需 要 输 出 函 数 的 说 明 部 分 。注 意 dllexport 代 替 了 _ _export 关 键 字 。
说 明 dllexport 和 dllimport 要 用 扩 展 属 性 语 法 。
__ declspec(dllexport) void func();
为 了 增 加 你 的 代 码 的 可 读 性 , 可 以 用 下 面 的 宏 定 义 。#define DllImport __ declspec(dllimport) #define DllExport __ declspec(dllexport)
DllExport void func(); DllExport int i = 10; DllImport int j; DllExport int n;
定 义 和 说 明
DLL 的 接 口 涉 及 到 由 系 统 中 的 其 他 程 序 显 式 输 出 的 项 ( 函 数 和 数 据 ); 也 即 , 所 有说 明 为 dllimport 和 dllexport 的 项 。 包 括 在 DLL 接 口 中 的 所 有 说 明 必 须 说 明为 要 么 具 有 dllimport 属 性 , 要 么 具 有 dllexport 属 性 。 然 而 , 定 义 仅 只 能 说 明为 具 有 dllexport 属 性 。 例 如 下 面 的 函 数 定 义 会 产 生 编 译 错 误 :
__ declspec(dllimport) int func() // 错 误 : 在 定 义 中 不 能 用 dllimport 属 性
{
return 1;
}
下 面 的 代 码 也 会 产 生 错 误 :
#define DllImport __ declspec(dllimport)
__ declspec(dllimport) int i = 10; // 错 误 : 这 是 一 个 定 义然 而 下 面 的 代 码 是 正 确 的 :
__ declspec(dllexport) int i = 10; // 正 确 :export 定 义
使 用 dllexport 隐 含 了 一 个 定 义 , 而 使 用 dllimport 隐 含 了 一 个 说 明 。 你 必 须 把extern 关 键 字 同 dllexport 一 起 使 用 以 强 制 一 个 说 明 ; 否 则 将 隐 含 一 个 定 义 。因 此 , 下 面 的 代 码 是 正 确 的 :
#define DllImport __ declspec(dllimport) #define DllExport __ declspec(dllexport)
extern DllImport int k; // 这 两 个 都 是 正 确 的DllImport int j; // 并 隐 含 了 一 个 说 明
下 面 的 例 子 阐 明 了 前 面 所 解 释 的 :
static __ declspec(dllimport) int l; // 错 误 : 没 有 说 明 为 extern 的
void func()
{
st atic __ declspec(dllimport) int s; // 错 误 : 没 有 说 明 为 extern 的
__ declspec(dllimport) int m; // 正 确 : 这 是 一 个 说 明
__ declspec(dllexport) int n; // 错 误 : 隐 含 了 一 个 在 局 部 范 围
// 的 外 部 定 义
extern __ declspec(dllimport) int i; // 正 确 : 这 是 一 个 说 明
extern __ declspec(dllexport) int k; // 正 确 :extern 暗 示 了 是 一 个 说 明
__ declspec(dllexport) int x = 5; // 错 误 : 隐 含 了 一 个 在 局 部 范 围
// 的 外 部 定 义
}
用 dllexport 和 dllimport 定 义 C++ 函 数
可 以 定 义 一 个 有 dllexport 属 性 的 内 嵌 函 数 。 在 此 情 况 下 , 无 论 是 否 有 程 序 中 的其 他 模 块 引 用 了 该 函 数 , 函 数 总 是 被 实 例 化 的 并 且 是 被 输 出 的 。 该 函 数 假 定 是 被其 他 程 序 输 入 的 。
也 可 以 用 dllimport 属 性 定 义 一 个 联 编 函 数 。 在 此 情 况 下 , 函 数 是 可 扩 充 的 ( 遵循 编 译 指 示 /Ob), 但 从 不 被 实 例 化 的 。 特 别 是 , 如 果 取 一 个 输 入 联 编 函 数 的 地 址 , 则 将 返 回 该 函 数 驻 留 在 DLL 中 的 地 址 。 这 种 行 为 就 象 取 一 个 非 联 编 的 输 入 函 数的 地 址 一 样 。
这 一 规 则 适 用 于 其 定 义 出 现 在 类 定 义 中 的 联 编 函 数 。 而 且 , 在 联 编 函 数 中 的 静 态局 部 数 据 和 字 符 串 将 在 DLL 和 用 户 端 中 保 持 同 样 的 标 识 , 因 为 它 们 是 在 同 一 程 序中 的 ( 即 , 一 个 没 有 DLL 接 口 的 可 执 行 文 件 ) 。
在 提 供 一 个 输 入 的 联 编 函 数 时 要 非 常 小 心 。 例 如 : 如 果 你 更 新 了 DLL, 你 不 能 假定 用 户 端 会 使 用 改 变 后 的 DLL 版 本 。 要 保 证 能 够 载 入 正 确 的 DLL 版 本 , 得 重 新 编译 DLL 客 户 程 序 。
一 般 规 则 及 限 制
- 如 果 你 没 有 用 dllexport 和 dllimport 属 性 说 明 一 个 函 数 和 对 象 , 该 函 数 和 对 象 就 不 会 作 为 DLL 接 口 的 一 部 分 。 因 此 , 必 须 在 此 模 块中 或 者 同 一 程 序 的 其 他 模 块 中 提 供 对 该 函 数 和 对 象 的 定 义 。 要 使 函数 和 对 象 成 为 DLL 接 口 的 一 部 分 , 你 必 须 在 其 他 模 块 中 用 dllexport 说 明 对 函 数 及 对 象 的 定 义 。 否 则 会 产 生 一 个 链 接 器 错 误 。
如 果 你 用 dllexport 和 dllimport 属 性 说 明 一 个 函 数 和 对 象 , 则 它 们 的 定 义 必 须出 现 在 同 一 程 序 的 某 个 模 块 中 。 否 则 会 产 生 一 个 链 接 器 错 误 。
- 如 果 在 你 的 程 序 的 单 一 模 块 中 , 对 同 一 函 数 或 对 象 同 时 包 含 了dllexport 和 dllimport 属 性 的 说 明 , 则 dllexport 属 性 将 取 代dllimport 属 性 处 于 优 先 权 地 位 。 但 编 译 器 会 给 出 一 个 警 告 错 误 : 例如 :
__ declspec(dllimport) int i;
__ declspec(dllexport) int i; // 警告 : 不 一 致 ;
// dllexport 处 于 优 先 地 位
- 在 C++ 中 , 你 可 以 用 一 个 带 有 dllimport 属 性 的 数 据 对 象 的 地 址 去 初始 化 一 个 全 局 说 明 的 或 静 态 局 部 的 数 据 指 针 。 然 而 在 C 中 , 这 种 初始 化 会 产 生 错 误 。 而 且 在 C++ 中 , 也 可 以 用 一 个 带 有 dllimport 属 性的 函 数 的 地 址 去 初 始 化 一 个 静 态 局 部 函 数 指 针 。 在 C 中 , 这 种 赋 值会 把 指 针 指 向 DLL 输 入 thunk 区 (thunk, 是 一 种 用 于 传 递 控 制 给 函数 的 残 留 代 码 ) 的 地 址 , 而 并 未 把 函 数 的 地 址 赋 给 指 针 。 在 C++ 中 , 则会 使 指 针 指 向 函 数 的 地 址 。 例 如 :
__ declspec(dllimport) void func1(void);
__ declspec(dllimport) int i;
int *pi = &i; // 在 C 中 错 误
static void (*pf)(void) = &func1; // 在 C 中 是 thunk 区 的 地 址 , 在 C++
// 中 是 函 数 的 地 址void func2()
{
static int *pi = &i; // 在 C 中 错 误
static void (*pf)(void) = &func1; // 在 C 中 是 thunk 区 的 地 址 ,
// 在 C++ 中 是 函 数 的 地 址
}
然 而 , 因 为 一 个 程 序 如 果 包 含 了 有 dllexport 属 性 说 明 的 对 象 , 它 必 须 在 程 序 的某 个 地 方 为 该 对 象 提 供 定 义 。 因 此 , 你 可 以 用 一 个 带 有 dllexport 属 性 的 函 数 地址 去 初 始 化 一 个 全 局 的 或 者 局 部 静 态 的 函 数 指 针 。 同 样 , 也 可 以 用 一 个 带 有dllexport 属 性 的 数 据 对 象 地 址 去 初 始 化 一 个 全 局 的 或 者 局 部 静 态 的 数 据 指 针 。例 如 : 下 面 的 代 码 在 C 或 C++ 中 不 会 产 生 错 误 :
__ declspec(dllexport) void func1(void);
__ declspec(dllexport) int i;
int *pi = &i; // 可以static void (*pf)(void) = &func1; // 可 以
void func2()
{
static int *pi = &i; // 可 以static void (*pf)(void) = &func1; // 可 以
}
在 C++ 中 使 用 dllimport 和 dllexport
可 用 dllimport 和 dllexport 属 性 说 明 C++ 的 类 。 这 一 形 式 隐 含 了 整 个 类 是 输入 的 或 者 是 输 出 的 。 以 这 种 方 法 输 出 的 类 称 为 可 输 出 类 。
下 面 的 例 子 定 义 了 一 个 可 输 出 类 。 它 的 所 有 成 员 函 数 和 静 态 数 据 是 输 出 的 : #define DllExport __ declspec(dllexport)
class DllExport C
{
int i;
virtual int func(void)
{ return 1; }
};
注 意 在 一 个 可 输 出 类 的 成 员 函 数 上 禁 止 显 式 使 用 dllimport 和 dllexport 属 性 。
输 出 类
在 说 明 一 个 输 出 类 时 , 它 的 所 有 成 员 函 数 和 静 态 数 据 成 员 是 输 出 的 。 必 须 在 同 一程 序 中 提 供 所 有 这 些 成 员 的 定 义 。 否 则 , 会 产 生 一 个 链 接 错 误 。 这 一 规 则 在 应 用于 纯 虚 拟 函 数 时 有 一 个 异 常 , 对 于 纯 虚 拟 函 数 不 必 提 供 显 式 的 定 义 。 然 而 , 因 为抽 象 类 的 析 构 函 数 总 是 由 基 类 的 析 构 函 数 调 用 的 , 所 以 纯 虚 拟 析 构 函 数 总 是 必 须要 提 供 一 个 定 义 的 。 这 一 规 则 对 于 非 可 输 出 的 类 也 是 同 样 的 。
如 果 你 输 出 了 类 类 型 数 据 或 者 返 回 类 的 函 数 , 一 定 要 输 出 该 类 。
输 入 类
在 你 说 明 一 个 输 入 类 时 , 它 的 所 有 成 员 函 数 和 静 态 数 据 成 员 是 输 入 的 。 同dllimport 和 dllexport 属 性 作 用 在 非 类 类 型 上 的 行 为 不 同 , 静 态 数 据 成 员 不 能在 定 义 输 入 类 的 同 一 程 序 中 说 明 一 个 定 义 。
继 承 和 输 出 类
可 输 出 类 的 所 有 基 类 必 须 是 可 输 出 的 。 如 果 不 是 这 样 , 会 产 生 一 个 编 译 警 告 。 而且 , 所 有 可 访 问 的 类 类 型 成 员 也 必 须 是 可 输 出 的 。 这 一 规 则 允 许 一 个 输 出 类 继承 一 个 输 入 类 , 而 一 个 输 入 类 继 承 一 个 输 出 类 ( 尽 管 不 推 荐 后 者 的 用 法 ) 。 作 为 一个 规 则 , 对 于 DLL 的 客 户 端 可 访 问 的 每 一 个 成 员 ( 按 照 C++ 的 访 问 规 则 ) 应 该 是 可输 出 接 口 的 一 部 分 。 这 包 括 在 联 编 函 数 中 引 用 的 私 有 数 据 成 员 。
有 选 择 地 输 入 / 输 出 成 员
因 为 在 一 个 类 中 的 成 员 函 数 和 静 态 数 据 隐 含 地 具 有 外 部 连 接 , 除 非 整 个 类 被 输 出
了 。 你 可 以 用 dllimport 和 dllexport 属 性 说 明 它 们 。 如 果 类 是 被 输 入 的 或 输出 的 , 则 禁 止 显 式 说 明 成 员 函 数 和 数 据 为 dllimport 和 dllexport 属 性 。 如 果 你在 类 定 义 中 说 明 一 个 静 态 数 据 成 员 具 有 dllexport 属 性 , 必 须 在 同 一 程 序 的 某 个地 方 提 供 定 义 ( 因 为 具 有 非 类 的 外 部 连 接 ) 。
同 样 地 , 你 可 以 说 明 具 有 dllimport 和 dllexport 属 性 的 成 员 函 数 。 在 这 种 情 形下 , 你 必 须 在 同 一 程 序 的 某 个 地 方 提 供 一 个 dllexport 定 义 。
关 于 有 选 择 地 输 入 / 输 出 成 员 有 以 下 一 些 关 键 点 值 得 注 意 :
-
有 选 择 地 输 入 / 输 出 成 员 能 很 好 地 用 于 提 供 一 种 更 加 严 谨 的 输 出 类接 口 ; 也 就 是 , 用 这 种 接 口 设 计 一 个 DLL 能 够 比 不 用 时 暴 露 更 少 的 公有 及 私 有 的 属 性 。 在 微 调 输 出 接 口 中 , 这 也 是 很 有 用 的 : 通 过 定 义 , 在 你 了 解 了 客 户 端 不 能 访 问 某 些 私 有 数 据 时 , 不 必 输 出 整 个 类 。
-
如 果 输 出 了 类 中 的 一 个 虚 拟 函 数 , 必 须 输 出 所 有 的 虚 拟 函 数 , 否 则 至少 要 提 供 一 个 客 户 端 能 直 接 调 用 的 版 本 。
-
如 果 定 义 了 一 个 类 , 其 中 对 于 虚 拟 函 数 使 用 了 有 选 择 的 输 入 / 输 出 成员 , 则 这 些 函 数 必 须 在 输 出 接 口 中 被 定 义 为 联 编 的 ( 对 客 户 端 可见 ) 。
-
如 果 你 把 一 个 成 员 定 义 为 dllexport 属 性 的 , 但 并 没 有 在 类 定 义 中包 含 它 , 则 会 产 生 一 个 编 译 器 错 误 。 你 必 须 在 类 头 中 定 义 该 成 员 。
-
尽 管 用 dllimport 和 dllexport 属 性 定 义 类 成 员 是 允 许 的 , 但 你 不能 重 载 在 类 定 义 中 说 明 的 接 口 。
-
如 果 你 在 说 明 类 定 义 的 定 义 体 以 外 的 地 方 定 义 了 一 个 函 数 , 并 把 它说 明 为 有 dllimport 和 dllexport 属 性 的 ( 如 果 这 一 定 义 同 类 说 明
中 所 说 明 的 不 同 ) 就 会 产 生 一 个 警 告 。
联 编 汇 编 器
联 编 汇 编 器 使 你 能 够 在 C 语 言 源 代 码 中 直 接 包 含 汇 编 语 言 指 令 而 不 需 要 额 外 的汇 编 及 链 接 步 骤 。 联 编 汇 编 器 是 内 置 于 编 译 器 中 的 , 所 以 不 需 要 一 个 单 独 的 汇 编器 如 Microsoft 的 宏 汇 编 (MASM) 。
因 为 联 编 汇 编 器 不 需 要 单 独 的 汇 编 及 链 接 步 骤 , 它 比 单 独 的 汇 编 器 更 方 便 。 联 编汇 编 器 代 码 能 够 使 用 处 在 同 一 范 围 中 的 任 何 C 的 变 量 名 称 和 函 数 名 称 , 因 此 它 很容 易 同 你 编 写 的 C 代 码 集 成 在 一 起 。 并 且 正 是 因 为 汇 编 代 码 能 和 C 语 句 混 合 使用 , 它 可 以 用 来 解 决 一 些 很 麻 烦 的 任 务 以 及 单 独 用 C 不 可 解 决 的 任 务 。
__asm 关 键 字 将 激 活 联 编 汇 编 器 , 并 能 出 现 在 C 语 句 可 合 法 出 现 的 任 何 地 方 。 该关 键 字 之 后 必 须 跟 有 汇 编 指 令 , 或 由 大 括 号 括 起 的 一 组 指 令 , 或 者 , 最 少 应 有 一 对空 的 大 括 号 ; 而 不 能 仅 仅 只 出 现 这 一 关 键 字 。 这 里 ,“ __ asm 块 ” 是 指 任 何 指 令 或一 组 指 令 , 无 论 是 否 在 大 括 号 中 。
下 面 的 代 码 是 一 个 简 单 的 括 在 大 括 号 中 的 __ asm 块 ( 这 一 代 码 是 一 个 函 数 的 前 言序 列 ) 。
__ asm
{
push ebp
mov ebp, esp
sub esp, __ LOCAL_SIZE
}
当 然 , 也 可 以 选 择 把 __ asm 放 在 每 一 条 汇 编 指 令 之 前 :
__ asm push ebp
__ asm mov ebp, esp
__ asm sub esp, __ LOCAL _ SIZE
因 为 __ asm 关 键 字 是 一 个 语 句 的 分 隔 符 , 也 可 以 在 同 一 行 中 放 置 多 条 汇 编 指 令 :
__ asm push ebp __ asm mov ebp, esp __ asm sub esp, __ LOCAL_SIZE
附 录 C 编 译 器 C O M 支 持 类
Microsoft 特 殊 处 →
一 些 标 准 类 用 于 支 持 某 些 COM 类 型 。 这 些 类 在 COMDEF.H 和 从 类 型 库 中 生 成 的 头文 件 中 定 义 。
#include <comdef.h>
类 目的
_com_error 定义在大多数失败中由 _com_raise_error 丢弃的错误对象
_com_ptr_t 封 装 COM 接 口 指 针 , 并 使 对 AddRef 、 Release 、QueryInterface 的调用自动化
_bstr_t 封装 BSTR 类型以提供有用的操作和方法
_variant_t 封装 VARIANT 类型以提供有用的操作和方法
而 且 , 有 一 个 支 持 例 程 叫 作 _com_raise_error, 它 用 于 所 有 由 编 译 器 生 成 的 COM 支 持 代 码 以 丢 弃 一 个 _com_error 来 响 应 失 败 。
_com_raise_error 在 comdef.h 中 定 义 如 下 :
void __ stdcall com_raise_error(HRESULT hr,IErrorInfo* perrinfo=0)
throw(_com_error); 实 际 的 源 代 码 是 :
void __ stdcall com_raise _ error(HRESULT hr,IErrorInfo* perrinfo)
throw(_com_error)
{
throw _com_error(hr, perrinfo);
}
_com_raise_error 可 以 由 用 户 提 供 的 具 有 同 样 名 称 及 原 型 的 函 数 版 本 所 替 代 。如 果 你 要 用 #import, 但 又 不 想 用 C++ 的 异 常 处 理 , 就 可 以 这 样 做 。 在 这 种 情 况 下 , 用 户 自 定 义 的 _com_raise_error 版 本 可 以 决 定 是 作 一 个 longjmp 还 是 弹 出 一 个消 息 框 或 者 停 机 。 这 一 用 户 版 本 不 应 返 回 , 尽 管 因 为 编 译 器 COM 支 持 代 码 并 不 希望 它 返 回 。
Microsoft 特 殊 处 结 束
_com_error
Microsoft 特 殊 处 →
一 个 _com_error 对 象 代 表 了 一 个 异 常 条 件 , 这 一 异 常 条 件 能 由 从 类 型 库 生 成 的头 文 件 中 的 错 误 处 理 封 装 函 数 检 测 到 或 者 能 由 COM 支 持 类 检 测 到 。类 _com_error 封 装 了 HRESULT 错 误 代 码 和 相 关 联 的 IErrorInfo 对 象 。
#include <comdef.h>
构造函 数
_com_error 构造一个 _com_error 对象
运算符
operator =\ 把一个已存在的 _com_error 对象赋值给另外一个
Extractor 函数
Error 检索传递给构造函数的 HRESULT 值
ErrorInfo 检索传递给构造函数的 IErrorInfo 对象
WCode 检索映射到封装的 HRESULT 上的 16 位错误代码
IErrorInfo 函数
Description 调用 IErrorInfo::GetDescription 函数
HelpContext 调用 IErrorInfo::GetHelpContext 函数
HelpFile 调用 IErrorInfo::GetHelpFile 函数
Source 调用 IErrorInfo::GetSource 函数
GUID 调用 IErrorInfo::GetGUID 函数
格式消息 Extractor 函数
ErrorMessage 为存储在 _com_error 对象中的 HRESULT 检索字符串消息
ExepInfo.wCode to HRESULT Mappers
HRESULTToWCode 把 32 位的 HRESULT 映射为 16 位的 wCode
WCodeToHRESULT 把 16 位的 wCode 映射为 32 位的 HRESULT
Microsoft 特 殊 处 结 束
成 员 函 数
_com_error::_com_error
Microsoft 特 殊 处 →
_com_error(HRESULT hr , IErrorInfo* perrinfo = NULL) throw();
_com_error(const _com_error& that ) throw();
参 数
hr
HRESULT 信 息
perrinfo
IErrorInfo 对 象
that
一 个 存 在 的 _com_error 对 象
注 释
构 造 一 个 _com_error 对 象 。 第 一 种 构 造 函 数 用 一 个 HRESULT 以 及 一 个 可 选 的IErrorInfo 对 象 来 构 造 一 个 _com_error 对 象 。 第 二 种 构 造 函 数 是 创 建 一 个 已 有
_com_error 对 象 的 拷 贝 。
Microsoft 特 殊 处 结 束
_com_error::Description
Microsoft 特 殊 处 →
_bstr_t Description() const throw ();
返 回 值
对 于 记 录 在 _com_error 对 象 中 的 IErrorInfo 对 象 , 返 回IErrorInfo::GetDescription 的 结 果 。 结 果 BSTR 是 封 装 在 一 个 _bstr_t 对 象中 的 。 如 果 没 有 记 录 IErrorInfo, 将 返 回 一 个 空 的 _bstr_t 对 象 。
注 释
调 用 函 数 IErrorInfo::GetDescription 并 检 索 记 录 在 _com_error 对 象 中 的IErrorInfo 。 在 调 用 IErrorInfo::GetDescription 时 的 任 何 失 败 都 将 忽 略 。Microsoft 特 殊 处 结 束
_com_error::Error
Microsoft 特 殊 处 →
HRESULT Error() const throw();
返 回 值
传 递 给 构 造 函 数 的 原 始 HRESULT 项 。
注 释
检 索 封 装 在 _com_error 对 象 中 的 HRESULT 项。
Microsoft 特 殊 处 结 束
_com_error::ErrorInfo
Microsoft 特 殊 处 →
IErrorInfo * ErrorInfo() const throw();
返 回 值
传 递 给 构 造 函 数 的 原 始 IErrorInfo 项 。
注 释
检 索 封 装 在 _com_error 对 象 中 的 IErrorInfo 项 , 如 果 没 有 记 录 IErrorInfo 项则 返 回 NULL 。 当 调 用 者 完 成 了 对 返 回 对 象 的 使 用 后 , 必 须 对 其 调 用 Release 。Microsoft 特 殊 处 结 束
_com_error::ErrorMessage
Microsoft 特 殊 处 →
const TCHAR * ErrorMessage() const throw();
返 回 值
为 记 录 在 _com_error 对 象 中 的 IErrorInfo 返 回 字 符 串 消 息 。 如 果 HRESULT 是一 个 映 射 为 16 位 的 wCode, 则 返 回 一 条 普 通 的 "IDispatch error #<wCode>" 消息 。 如 果 没 有 发 现 消 息 , 则 返 回 一 条 普 通 的 "Unknown error #<hresult>" 消 息 。返 回 的 字 符 串 可 以 是 单 代 码 或 者 多 字 节 字 符 串 , 这 一 点 有 赖 于 _UNICODE 宏 的 状态 。
注 释
为 记 录 在 _com_error 对 象 中 的 IErrorInfo 返 回 合 适 的 系 统 消 息 文 本 。 此 系 统消 息 文 本 是 通 过 调 用 Win32 函 数 FormatMessage 获 得 的 。 返 回 的 字 符 串 是 由FormatMessage API 分 配 的 , 并 在 _com_error 对 象 消 毁 后 将 被 释 放 。
Microsoft 特 殊 处 结 束
_com_error::GUID
Microsoft 特 殊 处 →
GUID GUID() const throw();
返 回 值
为 记 录 在 _com_error 对 象 中 的 IErrorInfo 返 回 IErrorInfo::GetGUID 的 结 果 。如 果 没 有 记 录 IErrorInfo, 将 返 回 GUID_NULL 。
注 释
调 用 IErrorInfo::GetGUID 方 法 。 在 调 用 IErrorInfo::GetGUID 方 法 时 的 任 何失 败 都 将 被 忽 略 。
Microsoft 特 殊 处 结 束
_com_error::HelpContext
Microsoft 特 殊 处 →
DWORD HelpContext() const throw();
返 回 值
为 记 录 在 _com_error 对 象 中 的 IErrorInfo 对 象 返 回 IErrorInfo::GetHelpContext 的 结 果 。 如 果 没 有 记 录 IErrorInfo 对 象 , 将 返 回 0 值 。
注 释
调 用 IErrorInfo::GetHelpContext 接 口 方 法 。 调 用 IErrorInfo::GetHelpContext 方 法 时 的 任 何 失 败 都 将 被 忽 略 。
Microsoft 特 殊 处 结 束
_com_error::HelpFile
Microsoft 特 殊 处 →
_bstr_t HelpFile() const throw();
返 回 值
为 记 录 在 _com_error 对 象 中 的 IErrorInfo 对 象 返 回 IErrorInfo::GetHelpFile 的结 果 。 结 果 BSTR 是 封 装 在 _bstr_t 对 象 中 的 。 如 果 没 有 记 录 IErrorInfo, 将 返回 一 个 空 的 _bstr_t 。
注 释
调 用 IErrorInfo::GetHelpFile 接 口 方 法 。 调 用 IErrorInfo::GetHelpFile 方法 时 的 任 何 失 败 都 将 被 忽 略 。
Microsoft 特 殊 处 结 束
_com_error::HRESULTToWCode
Microsoft 特 殊 处 →
static WORD HRESULTToWCode(HRESULT hr ) throw();
返 回 值
从 32 位 的 HRESULT 映 射 的 16 位 wCode 值 。
参 数
hr
要 映 射 为 16 位 wCode 值 的 32 位 的 HRESULT 。
注 释
完 成 一 个 32 位 HRESULT 到 16 位 wCode 值 的 映 射 。 详 细 的 信 息 参 见
_com_error::WCode 。
参 见
_com_error::WCode , _com_error::WCodeToHRESULT , _com_error 概 述
Microsoft 特 殊 处 结 束
_com_error::Source
Microsoft 特 殊 处 →
_bstr_t Source() const throw();
返 回 值
为 记 录 在 _com_error 对 象 中 的 IErrorInfo 对 象 返 回 IErrorInfo::GetSource 的 结 果 。
结 果 BSTR 是 封 装 在 _bstr_t 对 象 中 的 。 如 果 没 有 记 录 IErrorInfo, 将 返 回 一 个空 的 _bstr_t 。
注 释
调 用 IErrorInfo::GetSource 接 口 方 法 。 调 用 IErrorInfo::GetSource 方 法 时的 任 何 失 败 都 将 被 忽 略 。
Microsoft 特 殊 处 结 束
_com_error:: WCode
Microsoft 特 殊 处 →
WORD WCode () const throw();
返 回 值
如 果 HRESULT 是 在 0x80040200 ~ 0x8004FFFF 的 范 围 内 , 则 WCode 方 法 将 返 回 最小 的 HRESULT 值 0x80040200; 否 则 返 回 0 值 。
注 释
WCode 方 法 检 索 的 是 一 个 由 封 装 的 HRESULT 映 射 的 16 位 错 误 码 。
WCode 方 法 是 用 于 解 除 发 生 在 COM 支 持 代 码 中 的 映 射 。 dispinterface 属 性 的 封
装 器 或 者 方 法 调 用 一 个 支 持 例 程 , 该 支 持 例 程 封 装 了 参 数 并 调 用 了IDispatch::Invoke 函 数 。 在 返 回 时 , 如 果 返 回 了 一 个 DISP_E_EXCEPTION 的 失败 HRESULT , 则 从 EXCEPINFO 结 构 中 检 索 错 误 信 息 , 并 传 递 给 IDispatch::Invoke 函 数 。 错 误 码 可 以 是 存 储 在 EXCEPINFO 结 构 wCode 成 员 中 的 16 位 值 , 或 者 是EXCEPINFO 结 构 的 scode 成 员 中 的 完 全 的 32 位 值 。 如 果 返 回 的 是 16 位 wCode, 则 它 必 定 先 映 射 为 了 32 位 的 失 败 HRESULT 。
参 见
_com_error::HRESULTToWCod e , _com_error::WCodeToHRESULT , _com_error 概述
Microsoft 特 殊 处 结 束
_com_error:: WCodeToHRESULT
Microsoft 特 殊 处 →
static HRESULT WCodeToHRESULT(WORD w Code ) throw();
返 回 值
从 一 个 16 位 的 wCode 映 射 为 32 位 HRESULT 值 。
参 数
wCode
是 一 个 映 射 为 32 位 HRESUL T 的 16 位 wCode 值 。
注 释
完 成 一 个 16 位 的 wCode 到 32 位 HRESULT 的 映 射 。 参 见 WCode 成 员 函 数 。
参 见
_com_error::W C ode , _com_error::HRESULTToWCode , _com_error 概 述
Microsoft 特 殊 处 结 束运 算 符
_com_error::operator =
Microsoft 特 殊 处 →
_com_error& operator = (const _com_error& that ) throw ();
参 数
that
一 个 _com_error 对 象
注 释
把 一 个 已 有 的 _com_error 对 象 赋 值 给 另 外 一 个 。
Microsoft 特 殊 处 结 束
_com_ptr_t
Microsoft 特 殊 处 →
-
个 _com_prt_t 对 象 封 装 了 一 个 COM 接 口 指 针 , 被 称 为 是 “ 灵 敏 ” 指 针 。 这 一个 模 板 类 通 过 对 IUnknown 的 成 员 函 数 QueryInterface 、 AddRef 及 Release 的调 用 , 来 管 理 资 源 的 分 配 和 回 收 。
-
个 “ 灵 敏 ” 指 针 通 常 由 _COM_SMARTPTR_TYPEDEF 宏 提 供 的 类
型 定 义 来 引 用 。
此 宏 带 有 一 个 接 口 名 称 和 一 个 IID, 并 说 明 了 一 具 带 有 接 口 名 加 上 Ptr 前 缀 的 特殊 的 _com_ptr_t 。 例 如 :
_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface)); 说 明 了 _com_ptr_t 特 例 化 的 IMyInterfacePtr 。
- 系 列 的 函 数 模 板 ( 非 此 模 板 类 的 成 员 ) 支 持 在 比 较 运 算 符 的 右 手 边 出 现 “ 灵 敏 ” 指 针 的 比 较 。
#include <comdef.h>
构造函 数
_com_ptr_t 构造一个 _com_ptr_t 对象
低级操 作
AddRef 在 封 装 的 接 口 指 针 上 调 用 IUnknown 的 成员函数 AddRef
Attach 封装这一灵敏指针类型的原始接口指针
CreateInstance 按所给的 CLSID 或 ProgID 创建一个新的对象实例
Detach 抽出并返回封装的接口指针
GetInterfacePtr 返回封装的接口指针
QueryInterface 在 封 装 的 接 口 指 针 上 调 用 IUnknown 的 成员函数 QueryInterface
Release 在 封 装 的 接 口 指 针 上 调 用 IUnknown 的 成员函数 Release
运算 符
operator = 把一个新值赋给一个已有的 _com_ptr _t 对象
operators ==, !=,
<,>,<=,>=
把 一 个 “ 灵 敏 ” 指 针 同 另 外 一 个 “ 灵 敏 ” 指针、原始接口指针、及 NULL 进行比较
Extractors 提取封装的 COM 接口指针
Microsoft 特 殊 处 结 束成 员 函 数
_com_ptr_t::_com_ptr_t
Microsoft 特 殊 处 →
_com_ptr_t() throw();
_com_ptr_t(Interface* pInterface) throw();
_com_ptr_t(Interface* pInterface , bool f AddRef ) throw();
_com_ptr_t(int NULL) throw(_com_error);
template< > _com_ptr_t(const _com_ptr_t& cp ) throw(); template<typename _InterfacePtr> _com_ptr_t(const _InterfacePtr& p) throw(_com_error);
template< > _com_ptr_t(const _variant_t& varSrc ) throw(_com_error);
explicit _com_ptr_t(const CLSID& clsid , DWORD dwClsContext = CLSCTX_ALL) throw( _com_error);
explicit _com_ptr_t(LPOLESTR lpOleStr , DWORD dwClsContext = CLSCTX_ALL) throw( _com_error);
explicit _com_ptr_t(LPCSTR lpcStr , DWORD dwClsContext = CLSCTX_ALL) throw(_com_error);
参 数
pInterface
一 个 原 始 的 接 口 指 针
fAddRef
如 果 为 真 , 则 调 用 AddRef 函 数 以 增 加 对 象 封 装 的 接 口 指 针 的 引 用 计 数
cp
- 个 _com_ptr_t 对 象
p
- 个 原 始 接 口 指 针 , 其 类 型 同 这 个 _com_ptr_t 对 象 的 灵
敏 指 针 类 型 不 同
varSrc
- 个 _variant_t 型 对 象
clsid
联 合 类 的 CLSID
dwClsContext
正 在 运 行 的 代 码 的 上 下 文
lpOleStr
一 个 含 有 lpcStr |
CLSID( 以 “ { ” 开 始 ) 或 者 |
ProgID 的 单 代 码 字 符 串 |
---|---|---|
一 个 含 有 注 释 |
CLSID( 以 “ { ” 开 始 ) 或 者 |
ProgID 的 多 字 节 字 符 串 |
构 造 一 个 _com_ptr_t 对 象 。
-
_com_ptr_t() 构 造 一 个 NULL 的 灵 敏 指 针 。
-
_com_ptr_t( pInterface ) 从 这 种 灵 敏 指 针 类 型 的 原 始 接 口 指 针 中 构 造一 个 灵 敏 指 针 。 调 用 AddRef 函 数 以 增 加 对 象 封 装 的 接 口 指 针 的 引用 计 数 。
-
_com_ptr_t( pInterface , fAddRe f) 从 这 种 灵 敏 指 针 类 型 的 原 始 接 口 指针 中 构 造 一 个 灵 敏 指 针 。 如 果 fAddRef 是 真 , 则 调 用 AddRef 函 数 以增 加 对 象 封 装 的 接 口 指 针 的 引 用 计 数 。 如 果 fAddRef 是 假 , 则 此 构造 函 数 对 这 一 原 始 接 口 指 针 具 有 所 有 权 , 并 也 不 调 用 AddRef 函 数 。
-
_com_ptr_t(NULL) 构 造 一 个 NULL 的 灵 敏 指 针 。 该 NULL 参 数 必 须是 0 。
-
_com_ptr_t( cp ) 以 其 它 的 同 类 型 的 灵 敏 指 针 的 拷 贝 来 构 造 一 个 灵敏 指 针 。 调 用 AddRef 函 数 以 增 加 对 象 封 装 的 接 口 指 针 的 引 用 计 数 。
-
_com_ptr_t( p ) 从 一 个 不 同 的 灵 敏 指 针 类 型 或 者 一 个 不 同 的 原 始 指针 来 构 造 一 个 灵 敏 指 针 。 调 用 QueryInterface 函 数 以 找 出 此 灵 敏指 针 类 型 的 接 口 指 针 。 如 果 函 数 QueryInterface 以 带 一 个E_NOINTERFACE 错 误 的 失 败 而 告 终 , 则 构 造 一 个 NULL 灵 敏 指 针 。 其它 任 何 错 误 将 会 引 起 产 生 一 个 _com_error 。
-
_com_ptr_t( varSrc ) 从 一 个 _variant_t 对 象 中 构 造 一 个 灵 敏 指针 。 封 装 的 VARIANT 必 须 是 VT_DISPATCH 类 型 的 或 者 是 VT_UNKNOWN 类 型 的 , 或 者 是 一 个 能 够 转 换 为 这 两 者 之 一 的 类 型 。 如 果 函 数QueryInterface 以 带 一 个 E_NOINTERFACE 错 误 的 失 败 而 告 终 , 则 构造 一 个 NULL 灵 敏 指 针 。 其 它 任 何 错 误 将 会 引 起 产 生 一 个
_com_error 。
- _com_ptr_t( clsid, dwClsContext ) 从 一 个 联 合 类 的 CLSID 中 构 造 一个 灵 敏 指 针 。 这 一 函 数 调 用 CoCreateInstance 通 过 成 员 函 数CreateInstance 创 建 一 个 新 的 COM 对 象 然 后 为 此 灵 敏 指 针 进 行 查询 。 如 果 函 数 QueryInterface 以 带 一 个 E_NOINTERFACE 错 误 的 失败 而 告 终 , 则 构 造 一 个 NULL 灵 敏 指 针 。 其 它 任 何 错 误 将 会 产 生 一 个
_com_error 。
-
_com_ptr_t( lpOleStr, dwClsContext) 从 一 个 含 有 CLSID ( 以 “ { ” 开始 ) 或 者 含 有 ProgID 的 Unicode 型 字 符 串 中 构 造 一 个 灵 敏 指 针 。 这一 函 数 调 用 CoCreateInstance 通 过 成 员 函 数 CreateInstance 创 建一 个 新 的 COM 对 象 然 后 对 此 灵 敏 指 针 进 行 查 询 。 如 果 函 数QueryInterface 以 带 一 个 E_NOINTERFACE 错 误 的 失 败 而 告 终 , 则 构造 一 个 NULL 灵 敏 指 针 。 其 它 任 何 错 误 将 会 产 生 一 个 _com_error 。
-
_com_ptr_t( lpcStr , dwClsContext ) 从 一 个 含 有 CLSID ( 以 “ { ” 开
始 ) 或 者 含 有 ProgID 的 多 字 节 型 字 符 串 中 构 造 一 个 灵 敏 指 针 。 这 一函 数 调 用 CoCreateInstance 通 过 成 员 函 数 CreateInstance 创 建 一个 新 的 COM 对 象 然 后 对 此 灵 敏 指 针 进 行 查 询 。 如 果 函 数
QueryInterface 以 带 一 个 E_NOINTERFACE 错 误 的 失 败 而 告 终 , 则 构造 一 个 NULL 灵 敏 指 针 。 其 它 任 何 错 误 将 会 产 生 一 个 _com_error 。
Microsoft 特 殊 处 结 束
_com_ptr_t::AddRef
Microsoft 特 殊 处 →
void AddRef() throw(_com_error);
注 释
在 封 装 的 接 口 指 针 上 调 用 IUnknown::AddRef 函 数 。 如 果 指 针 是 NULL 则 产 生 一个 _POINTER 错 误 。
Microsoft 特 殊 处 结 束
_com_ptr_t::Attach
Microsoft 特 殊 处 →
void Attach(Interface* pInterface ) throw();
void Attach(Interface* pInterface , bool fAddRef ) throw();
参 数
pInterface
- 个 原 始 的 接 口 指 针
fAddRef
如 果 是 真 , 则 调 用 函 数 AddRef; 如 果 是 假 , 则 此 _com_ptr_t 对 象 对 原 始 接 口 指 针具 有 所 有 权 , 并 也 不 调 用 函 数 AddRef 。
注 释
封 装 一 个 此 灵 敏 指 针 类 型 的 原 始 接 口 指 针 。
- Attach( pInterface ) 不 调 用 AddRef 。 接 口 的 所 有 权 传 送 给 了 此
_com_ptr_t 对 象 。 调 用 Release 为 以 前 封 装 的 指 针 减 少 引 用 次 数 。
- Attach( pInterface , fAddRef ) 如 果 fAddRef 是真 , 则 调 用 AddRef 函数 以 增 加 对 象 封 装 的 接 口 指 针 的 引 用 计 数 。 如 果 fAddRef 是 假 , 则 此
_com_ptr_t 对 象 对 这 一 原 始 接 口 指 针 具 有 所 有 权 , 并 也 不 调 用AddRef 函 数 。 调 用 Release 为 以 前 封 装 的 指 针 减 少 引 用 次 数 。
Microsoft 特 殊 处 结 束
_com_ptr_t::CreateInstance
Microsoft 特 殊 处 →
HRESULT CreateInstance(const CLSID& rclsid , IUnknown * pOuter =NULL, DWORD dwClsContext = CLSCTX_ALL) throw();
HRESULT CreateInstance(LPOLESTR clsidString , IUnknown * pOuter =NULL, DW ORD dwClsContext = CLSCTX_ALL) throw();
HRESULT CreateInstance(LPCSTR clsidStringA , IUnknown * pOuter =NULL, DWORD dwClsContext = CLSCTX_ALL) throw();
参 数
rclsid
- 个 CLSID 对 象 。
clsidString
- 个 含 有 CLSID( 以 "{" 开 始 ) 或 者 含 有 ProgID 的 单 代 码 字 符
串
clsidStringA
- 个 含 有 CLSID( 以 "{" 开 始 ) 或 者 含 有 ProgID 的 多 字 节 字 符
串
dwClsContext
正 在 执 行 的 代 码 的 上 下 文
pOuter
对 于 集 合 体 的 外 部 未 知 对 象
注 释
按 给 定 的 CLSID 或 ProgID 创 建 一 个 对 象 的 新 的 可 运 行 的 实 例 。 这 一 函 数 调 用CoCreateInstance 通 过 成 员 函 数 CreateInstance 创 建 一 个 新 的 COM 对 象 然 后对 此 灵 敏 指 针 进 行 查 询 。 这 一 结 果 指 针 立 即 封 装 在 _com_ptr_t 对 象 之 中 。 调 用Release 为 以 前 封 装 的 指 针 减 少 引 用 次 数 。 这 一 例 程 返 回 HRESULT 以 表 示 是 成功 还 是 失 败 。
-
CreateInstance( rclsid , dwClsContext ) 按 给 定 的 CLSID 创 建 一 个 对象 的 新 的 可 运 行 的 实 例 。
-
CreateInstance( clsidString , dwClsContext ) 从 一 个 含 有 CLSID( 以“ { ” 开 始 ) 或 者 含 有 ProgID 的 单 代 码 字 符 串 中 创 建 一 个 对 象 的 新的 可 运 行 的 实 例 。
-
CreateInstance( clsidStringA , dwClsContext ) 从 一 个 含 有 CLSID( 以“ { ” 开 始 ) 或 者 含 有 ProgID 的 多 字 节 字 符 串 中 创 建 一 个 对 象 的 新的 可 运 行 的 实 例 。 调 用 MultiByteToWideChar, 它 假 设 字 符 串 是 按ANSI 代 码 页 而 不 是 OEM 代 码 页 。
Microsoft 特 殊 处 结 束
_com_ptr_t::Detach
Microsoft 特 殊 处 →
Interface* Detach() throw();
注 释
提 取 并 返 回 封 装 的 接 口 指 针 , 然 后 把 封 装 的 指 针 存 储 清 除 为 NULL 。 这 将 从 封 装中 清 除 接 口 指 针 。 程 序 员 有 责 任 对 返 回 的 接 口 指 针 调 用 Release 函 数 。Microsoft 特 殊 处 结 束
_com_ptr_t::GetAcitveObject
Microsoft 特 殊 处 →
HRESULT GetActiveObject(const CLSID& rclsid ) throw(); HRESULT GetActiveObject(LPOLESTRE clsidString ) throw(); HRESULT GetActiveObject(LPCSTR clsidStringA ) throw(); 参 数
rclsid
CLSID 对 象 。
clsidString
- 个 含 有 CLSID ( 以 “ { ” 开 始 ) 或者 ProgID 的 单 代 码 字 符 串 。
clsidStringA
- 个 含 有 CLSID( 以 “ { ” 开 始 ) 或 者 ProgID 的 多 字 节 字 符 串 。
注 释
按 给 定 的 CLSID 或 ProgID 同 一 个 对 象 的 已 存 在 的 实 例 进 行 连 接 。 这 些 成 员 函 数
调 用 GetActiveObject 以 检 索 一 个 按 OLE 进 行 注 册 的 运 行 对 象 的 指 针 , 然 后 为 此接 口 灵 敏 指 针 的 接 口 类 型 进 行 查 询 。返 回 的 这 一 结 果 指 针 立 即 封 装 在 _com_ptr_t 对 象 之 中 。调 用 Release 为 以 前 封 装 的 指 针 减 少 引 用 次 数 。这 一 例 程 返 回 HRESULT 以 表 示 是 成 功 还 是 失 败 。
-
GetActiveObject( rclsid ) 按 给 定 的 CLSID 同 一 个 对 象 的 已 存 在 的 实例 进 行 连 接 。
-
GetAcitveObject( clsidString ) 按 一 个 含 有 CLSID( 以 “ { ” 开 始 ) 或 者含 有 ProgID 的 单 代 码 字 符 串 同 一 个 对 象 的 已 存 在 的 实 例 进 行 连 接 。
-
GetActiveObject( clsidStringA ) 按 一 个 含 有 CLSID( 以 “ { ” 开 始 ) 或者 含 有 ProgID 的 多 字 节 字 符 串 同 一 个 对 象 的 已 存 在 的 实 例 进 行 连接 。 调 用 MultiByteToWideChar, 它 假 设 字 符 串 是 按 ANSI 代 码 页 而还 是 OEM 代 码 页 。
Microsoft 特 殊 处 结 束
_com_ptr_t::GetInterfacePtr
Microsoft 特 殊 处 →
Interface* GetInterfacePtr() const throw();
注 释
返 回 封 装 的 接 口 指 针 , 其 值 可 以 是 NULL 。
Microsoft 特 殊 处 结 束
_com_ptr_t::QueryInterface
Microsoft 特 殊 处 →
template<typename _InterfaceType> HRESULT QueryInterface (const IID& iid , _InterfaceType*& p ) throw (); template<typename _InterfaceType> HRESULT QueryInterface
(const IID& iid , _InterfaceType** p ) throw();
参 数
iid
- 个 接 口 指 针 的 IID
p
- 个 原 始 接 口 指 针
注 释
在 封 装 的 接 口 指 针 上 用 说 明 的 IID 调 用 IUnknown::QueryInterface, 并 在 p 中返 回 查 询 的 原 始 接 口 指 针 。 这 一 例 程 返 回 HRESULT 以 表 示 是 成 功 还 是 失 败 。Microsoft 特 殊 处 结 束
_com_ptr_t::Release
Microsoft 特 殊 处 →
void Release() throw(_com_error);
注 释
在 封 装 的 接 口 指 针 上 调 用 IUnknown::Release 函 数 。 如 果 指 针 是 NULL 则 产 生 一个 _POINTER 错 误 。
Microsoft 特 殊 处 结 束
运 算 符
_com_ptr_t::operator =
Microsoft 特 殊 处 →
_com_ptr_t& operator=(Interface* pInterface ) throw();
_com_ptr_t& operator=(int NULL) throw(_com_error);
template<> _com_ptr_t& operator=(const _com_ptr_t& cp ) throw(); template<> _com_ptr_t& operator=(const _variant_t& varSrc ) throw(_com_error);
template<typename _InterfacePtr> _com_ptr_t& operator=(const
_InterfacePtr& p)
throw(_com_error);
注 释
把 一 个 接 口 指 针 赋 值 给 一 个 _com_ptr_t 对 象 :
-
operator=( pInterface ) 封 装 一 个 同 此 灵 敏 指 针 类 型 相 同 的 原 始 接口 指 针 。 调 用 AddRef 函 数 以 增 加 对 象 封 装 的 接 口 指 针 的 引 用 计 数 , 调 用 Release 为 以 前 封 装 的 指 针 减 少 引 用 次 数 。
-
operator=(NULL) 把 一 个 灵 敏 指 针 设 为 NULL 。 此 NULL 参 数 必 须 是0 。
-
operator=( cp ) 把 一 个 灵 敏 指 针 设 置 为 同 此 灵 敏 指 针 有 相 同 类 型的 另 一 实 例 的 拷 贝 。 调 用 AddRef 函 数 以 增 加 对 象 封 装 的 接 口 指 针的 引 用 计 数 , 并 调 用 Release 为 以 前 封 装 的 指 针 减 少 引 用 次 数 。
-
operator=( varSrc ) 用 一 个 _variant_t 对 象 设 置 一 个 灵 敏 指 针 。 封装 的 VARIANT 必 须 是 VT_DISPATCH 类 型 或 者 是 VT_UNKNOWN 类型 , 或者 是 可 以 转 换 为 上 述 两 者 之 一 的 类 型 。 如 果 函 数 QueryInterface 以带 一 个 E_NOINTERFACE 错 误 的 失 败 而 告 终 , 则 构 造 一 个 NULL 灵 敏 指针 。 其 它 任 何 错 误 将 会 产 生 一 个 _com_error 。
-
operator=( p ) 把 一 个 灵 敏 指 针 设 置 为 一 个 有 不 同 类 型 的 灵 敏 指 针或 者 一 个 不 同 的 原 始 指 针 。 调 用 QueryInterface 函 数 以 找 出 此 灵敏 指 针 类 型 的 接 口 指 针 。 如 果 函 数 QueryInterface 以 带 一 个E_NOINTERFACE 错 误 的 失 败 而 告 终 , 则 构 造 一 个 NULL 灵 敏 指 针 。 其它 任 何 错 误 将 会 产 生 一 个 _com_error 。
Microsoft 特 殊 处 结 束
_com_ptr_t 关 系 运 算 符
Microsoft 特 殊 处 →
template<typename _InterfacePtr> bool operator==(_InterfacePtr p )
throw(_com_error);
template<> bool operator==(Interface* p ) throw(_com_error); template<> bool operator==(_com_ptr_t& p ) throw(); template<> bool operator==(int NULL) throw(_com_error);
template<typename _InterfacePtr> bool operator!=(_InterfacePtr p )
throw(_com_error);
template<> bool operator!=(Interface* p ) throw(_com_error);
template<> bool operator!=(_com_ptr_t& p ) throw(_com_error); template<> bool operator!=(int NULL) throw(_com_error); template<typename _InterfacePtr> bool operator<(_InterfacePtr p )
throw(_com_error);
template<typename _InterfacePtr> bool operator>(_InterfacePtr p )
throw(_com_error);
template<typename _InterfacePtr> bool operator<=(_InterfacePtr p )
throw(_com_error);
template<typename _InterfacePtr> bool operator>=(_InterfacePtr p )
throw(_com_error)
注 释
把 一 个 灵 敏 指 针 同 另 外 一 个 灵 敏 指 针 、 原 始 接 口 指 针 或 者 NULL 进 行 比 较 。 除 了对 NULL 指 针 的 测 试 , 这 些 操 作 首 先 由 IUnknown 查 询 指 针 , 然 后 比 较 结 果 。Microsoft 特 殊 处 结 束
_com_ptr_t Extractors
Microsoft 特 殊 处 →
operator Interface*() const throw();
operator Interface&() const throw(_com_error); Interface& operator*() const throw(_com_error); Interface* operator->() const throw(_com_error); Interface** operator&() throw();
operator bool() const throw();
注 释
-
operator Interface* 返 回 封 装 的 接 口 指 针 , 其 值 可 能 是 NULL 。
-
operator Interface& 返 回 对 封 装 的 接 口 指 针 的 引 用 , 如 果 指 针 是NULL 就 发 出 一 个 错 误 。
-
operator* 在 指 针 间 接 引 用 中 , 让 一 个 灵 敏 指 针 对 象 行 为 就 象 一 个实 际 封 装 的 接 口 一 样 。
-
operator-> 在 指 针 间 接 引 用 中 , 让 一 个 灵 敏 指 针 对 象 行 为 就 象 一个 实 际 封 装 的 接 口 一 样 。
-
operator& 释 放 任 何 封 装 的 接 口 指 针 , 用 NULL 代 替 它 , 并 返 回 封 装指 针 的 地 址 。 这 使 得 一 个 灵 敏 指 针 可 以 作 为 地 址 传 递 给 函 数 , 该 函数 有 一 个 外 部 参 数 , 通 过 它 此 函 数 能 返 回 一 个 接 口 指 针 。
-
operator bool 使 得 灵 敏 指 针 能 够 用 于 条 件 表 达 式 。 如 果 指 针 不是 NULL, 这 一 操 作 返 回 真 。
Microsoft 特 殊 处 结 束
关 系 函 数 模 板
Microsoft 特 殊 处 →
template<typename _InterfaceType> bool operator==(int NULL,
_com_ptr_t<_InterfaceType>& p ) throw(_com_error); template<typename _Interface, typename _InterfacePtr> bool operator==
(_Interface* i , _com_ptr_t<_InterfacePtr>& p ) throw(_com_error);
template<typename _Interface> bool operator!=(int NULL,
_com_ptr_t<_Interface>& p ) throw(_com_error);
template<typename _Interface, typename _InterfacePtr> bool operator!=
(_Interface* i , _com_ptr_t<_InterfacePtr>& p ) throw(_com_error); template<typename _Interface> bool operator<(int NULL,
_com_ptr_t<_Interface>& p ) throw(_com_error);
template<typename _Interface, typename _InterfacePtr> bool operator<
(_Interface* i , _com_ptr_t<_InterfacePtr>& p ) throw(_com_error); template<typename _Interface> bool operator>(int NULL, _com_ptr_t<
_Interface>& p ) throw(_com_error);
template<typename _Interface, typename _InterfacePtr> bool operator>
(_Interface* i , _com_ptr_t<_InterfacePtr>& p ) throw(_com_error); template<typename _Interface> bool operator<=(int NULL, _com_ptr_t<
_Interface>& p ) throw(_com_error);
template<typename _Interface, typename _InterfacePtr> bool operator<=
(_Interface* i , _com_ptr_t<_InterfacePtr>& p ) throw(_com_error); template<typename _Interface> bool operator>=(int NULL, _com_ptr_t<
_Interface>& p ) throw(_com_error);
template<typename _Interface, typename _InterfacePtr> bool operator>=
(_Interface* i , _com_ptr_t<_InterfacePtr>& p ) throw(_com_error);
参 数
i
- 个 原 始 接 口 指 针 。
p
- 个 灵 敏 指 针 。
注 释
这 些 函 数 模 板 允 许 灵 敏 指 针 出 现 在 比 较 运 算 符 右 边 的 比 较 。 以 上 这 些 不 是
_com_ptr_t 的 成 员 函 数 。
Microsoft 特 殊 处 结 束
_bstr_t
Microsoft 特 殊 处 →
一 个 _bstr_t 对 象 封 装 了 BSTR 数 据 类 型 。 通 过 对 函 数 SysAllocString 和SysFreeString 以 及 其 他 一 些 BSTR APIs 的 调 用 , 该 类 管 理 资 源 的 分 配 和 回 收 。类 _bstr_t 采 用 引 用 计 数 来 避 免 过 度 的 开 销 。
#include <comdef.h>
构造函 数
_bstr_t 构造一个 _bstr_t 对 象
操 作
copy 构造一个封装的 BSTR 的拷贝
length 返回一个封装的 BSTR 的长度
运算 符
operator = 对一个已有的 _bstr_t 对象赋新值
operator += 在一个 _bstr_t 对象的尾部增加新的字符
operator + 连接两个字符串
operator ! 检查封装的 BSTR 是否是一个空串
operator ==, !=, <, >, <=,
>=
比较两个 _bstr_t 对象
operator wchar_t*, char* 从封装的 Unicode 或多字节 BSTR 对象中提取
指针
Microsoft 特 殊 处 结 束成 员 函 数
_bstr_t::_bstr_t
Microsoft 特 殊 处 →
_bstr_t() throw();
_bstr_t(const _bstr_t& s1 ) throw();
_bstr_t(const char* s2 ) throw(_com_error);
_bstr_t(const wchar_t* s3 ) throw(_com_error);
_bstr_t(const _variant_t& var ) throw (_com_error);
_bstr_t(BSTR bstr , bool fCopy ) throw (_com_error);
参 数
s1
- 个 要 拷 贝 的 _bstr_t 对 象 。
s2
- 个 多 字 节 的 字 符 串 。
s3
- 个 单 代 码 字 符 串 。
var
- 个 _variant_t 对 象 。
bstr
- 个 已 存 在 的 BSTR 对 象 。
fCopy
如 果 是 假 ,bstr 参 数 将 同 一 个 新 的 对 象 相 联 , 并 也 会 调 用 函 数 SysAllocString 创 建 一 个 拷 贝 。
注 释
构 造 一 个 _bstr_t 对 象 。
-
_bstr_t() 构 造 一 个 封 装 一 个 NULL BSTR 对 象 的 缺 省 _bstr_t 对象 。
-
_bstr_t(_bstr_t& s1) 把 一 个 _bstr_t 对 象 构 造 为 另 一 个 的 拷 贝 。这 是 一 个 “ 影 子 ” 拷 贝 , 因 为 它 只 增 加 对 封 装 的 BSTR 对 象 的 引 用 计数 , 而 不 是 创 建 一 个 新 的 对 象 。
-
_bstr_t(char* s2 ) 通 过 调 用 SysAssocString 函 数 创 建 新 的 BSTR
对 象 来 构 造 一 个 _bstr_t 对 象 , 并 封 装 此 BSTR 对 象 。 此 构 造 函 数 首先 采 用 一 个 从 多 字 节 至 单 代 码 的 转 换 。
-
_bstr_t(wchar_t* s3 ) 通 过 调 用 SysAssocString 函 数 创 建 新 的BSTR 对 象 来 构 造 一 个 _bstr_t 对 象 , 并 封 装 此 BSTR 对 象 。
-
_bstr_t(_variant_t& var ) 通 过 从 封 装 的 VARIANT 对 象 中 提 取BSTR 对 象 来 从 一 个 _variant_t 对 象 构 造 _bstr_t 对 象 。
-
_bstr_t(BSTR bstr, bool fCopy ) 从 一 个 已 存 在 的 BSTR 对 象 ( 同wchar_t* 字 符 串 相 反 ) 中 构 造 一 个 _bstr_t 对 象 。 如 果 fCopy 是 假 , 则 提 供 的 BSTR 将 同 新 的 对 象 连 接 , 并 不 是 通 过 调 用 函 数SysAllocString 创 建 一 个 新 的 拷 贝 。 在 类 型 库 头 文 件 中 的 包 装 器(wrapper) 函 数 使 用 这 种 方 法 封 装 并 取 一 个 BSTR 对 象 拥 用 者 , 该 方法 是 在 一 个 _bstr_t 对 象 中 通 过 接 口 方 法 返 回 。
Microsoft 特 殊 处 结 束
_bstr_t::copy
Microsoft 特 殊 处 →
BSTR copy() const throw(_com_error);
注 释
返 回 一 个 封 装 的 BSTR 对 象 的 最 新 分 配 的 拷 贝 。
Microsoft 特 殊 处 结 束
_bstr_t::length
Microsoft 特 殊 处 →
unsigned int length () const throw();
注 释
返 回 一 个 封 装 的 BSTR 对 象 的 长 度 。
Microsoft 特 殊 处 结 束运 算 符
_bstr_t::operator =
Microsoft 特 殊 处 →
_bstr_t& operator=(const _bstr_t& s1 ) throw ();
_bstr_t& operator=(const char* s2 ) throw(_com_error);
_bstr_t& operator=(const wchar_t* s3 ) throw(_com_error);
_bstr_t& operator=(const _variant_t& var ) throw(_com_error);
参 数
s1
- 个 要 赋 值 给 已 存 在 的 _bstr_t 对 象 的 _bstr_t 对 象 。
s2
- 个 要 赋 值 给 已 存 在 的 _bstr_t 对 象 的 多 字 节 字 符 串 。
s3
- 个 要 赋 值 给 已 存 在 的 _bstr_t 对 象 的 单 代 码 字 符 串 。
var
- 个 要 赋 值 给 已 存 在 的 _bstr_t 对 象 的 _variant_t 对 象 。
注 释
对 一 个 已 存 在 的 _bstr_ 对 象 赋 一 个 新 值 。
Microsoft 特 殊 处 结 束
_bstr_t::operator +=, +
Microsoft 特 殊 处 →
_bstr_t& operator+=(const _bstr_t& s1 ) throw(_com_error);
_bstr_t operator+(const _bstr_t& s1 ) const throw(_com_error); friend _bstr_t operator+(const char* s2 , const _bstr_t& s1 ); friend _bstr_t operator+(const wchar_t* s3 , const _bstr_t& s1 ); 参 数
s1
- 个 _bstr_t 对 象 。
s2
- 个 多 字 节 字 符 串 。
s3
- 个 单 代 码 字 符 串 。
注 释
这 些 操 作 完 成 字 符 串 的 连 接 :
-
operator+=( s1 ) 把 s1 封 装 对 象 BSTR 中 的 字 符 加 到 此 对 象 封 装 的BSTR 的 尾 部 。
-
operator+( s1 ) 把 该 对 象 的 BSTR 同 s1 中的 BSTR 相 连 并 返 回 新 的
_bstr_t 。
-
operator+( s2 , s1 ) 把 一 个 多 字 节 字 符 串 s2( 转 换 为 Unicode 型 ) 同 s1 中 封 装 的 BSTR 相 连 , 并 返 回 新 的 _bstr_t 。
-
operator+( s3 , s1 ) 把 一 个 单 代 码 字 符 串 s3 同 s1 中 封 装 的 BSTR 相连 , 并 返 回 新 的 _bstr_t 。
Microsoft 特 殊 处 结 束
_bstr_t::operator !
Microsoft 特 殊 处 →
bool operator!() const throw();
注 释
检 查 封 装 的 BSTR 对 象 是 否 为 NULL 字 符 串 。 如 果 是 返 回 真 , 否 则 返 回 假 。
Microsoft 特 殊 处 结 束
_bstr_t 关 系 运 算 符
Microsoft 特 殊 处 →
bool operator==(const _bstr_t& str ) const throw(); bool operator!=(const _bstr_t& str ) const throw(); bool operator<(const _bstr_t& str ) const throw(); bool operator>(const _bstr_t& str ) const throw(); bool operator<=(const _bstr_t& str ) const throw(); bool operator>=(const _bstr_t& str ) const throw();
注 释
这 些 操 作 按 字 典 次 序 比 较 两 个 _bstr_t 对 象 。 如 果 能 进 行 比 较 , 则 返 回 真 ; 否 则返 回 假 。
Microsoft 特 殊 处 结 束
_bstr_t::wchar_t*, _bstr_t::char*
Microsoft 特 殊 处 →
operator const wchar_t*() const throw(); operator wchar_t*() const throw();
operator const char*() const throw(_com_error); operator char*() const throw(_com_error);
注 释
这 些 操 作 可 用 于 提 取 封 装 的 单 代 码 或 多 字 节 BSTR 对 象 的 原 始 指 针 。 这 些 运 算 符返 回 指 向 实 际 内 部 的 缓 冲 区 的 指 针 , 因 此 结 果 字 符 串 是 不 能 被 修 改 的 。Microsoft 特 殊 处 结 束
_variant_t
Microsoft 特 殊 处 →
一 个 _variant_t 对 象 封 装 了 VARIANT 数 据 类 型 。 该 类 管 理 的 分 配 和 回 收 , 并 在合 适 的 时 候 对 函 数 VariantInit 和 VariantClear 进 行 调 用 。
#include <comdef.h>
构造函 数
_variant_t 构 造 一 个 _variant_t 对象
运算 符
Attach 把一个 VARIANT 对象连接到一个 _variant_t 对象中
Clear 清除封装的 VARIANT 对象
ChangeType 把一个 _variant_t 对象的类型改变为说明的 VARTYPE Detach 把一个 VARIANT 对象从一个 _variant_t 对象中除去连
接
SetString 把一个字符串赋值给一个 _variant_t 对象
运算 符
operator = 对 一 个 已 存 在 的 _variant_t 对 象 赋 以 新值。
operator ==, != 比较两个 _variant_t 对象相等还是不等。
Extractors 从一个封装的 VARIATN 对象中提取数据。
Microsoft 特 殊 处 结 束
成 员 函 数
_variant_t::_variant_t
Microsoft 特 殊 处 →
_variant_t() throw();
_variant_t(const VARIANT& varSrc ) throw(_com_error);
_variant_t(const VARIANT* pVarSrc ) throw(_com_error);
_variant_t(const _variant_t& var_t_Src ) throw(_com_error);
_variant_t(VARIANT& varSrc, bool fCopy ) throw(_com_error);
_variant_t(short sSrc , VARTYPE vtSrc = VT_I2) throw(_com_error);
_variant_t(long lSrc , VARTYPE vtSrc = VT_I4) throw(_com_error);
_variant_t(float fltSrc ) throw();
_variant_t(double dblSrc , VARTYPE vtSrc = VT_R8) throw(_com_error);
_variant_t(const CY& cySrc ) throw();
_variant_t(const _bstr_t& bstrSrc ) throw(_com_error);
_variant_t(const wchar_t * wstrSrc ) throw(_com_error);
_variant_t(const char* strSrc ) throw(_com_error);
_variant_t(bool bSrc) throw();
_variant_t(IUnknown* pIUknownSrc , bool fAddRef = true) throw();
_variant_t(IDispatch* pDispSrc , bool fAddRef = true) throw();
_variant_t(const DECIMAL& decSrc ) throw();
_variant_t(BYTE bSrc ) throw();
参 数
varSrc
要 被 拷 贝 到 一 个 新 的 _variant_t 对 象 的 VARIANT 对 象 。
pVarSrc
要 被 拷 贝 到 一 个 新 的 _variant_t 对 象 的 VARIANT 对 象 的 指 针 。
var_t_Src
要 被 拷 贝 到 一 个 新 的 _variant_t 对 象 的 _variant_t 对 象 。
fCopy
如 果 是 假 , 则 提 供 的 VARIANT 对 象 就 同 新 的 _variant_t 对 象 连 接 , 而 不 会 调 用VariantCopy 以 创 建 一 个 新 的 拷 贝 。
ISrc , sSrc
一 个 要 拷 贝 到 新 的 _variant_t 对 象 中 的 整 型 值 。
vtSrc
为 新 _variant_t 对 象 的 VARTYPE 。
fltSrc, dblSrc
- 个 要 拷 贝 到 新 的 _variant_t 对 象 中 的 数 字 值 。
cySrc
- 个 要 拷 贝 到 新 的 _variant_t 对 象 中 的 CY 对 象 。
bstrSrc
- 个 要 拷 贝 到 新 的 _variant_t 对 象 中 的 _bstr_t 对 象 。
strSrc, wstrSrc
- 个 要 拷 贝 到 新 的 _variant_t 对 象 中 的 字 符 串 。
bSrc
- 个 要 拷 贝 到 新 的 _variant_t 对 象 中 的 布 尔 型 值 。
pIUknownSrc
将 要 封 装 在 新 的 _variant_t 对 象 中 的 指 向 VT_UNKNOWN 对 象 的 COM 接 口 指 针 。
pDispSrc
将 要 封 装 在 新 的 _variant_t 对 象 中 的 指 向 VT_DISPATCH 对 象 的 COM 接 口 指 针 。
decSrc
- 个 要 拷 贝 到 新 的 _variant_t 对 象 中 的 十 进 制 值 。
bSrc
- 个 要 拷 贝 到 新 的 _variant_t 对 象 中 的 字 节 值 。
注 释
构 造 一 个 _variant_t 对 象 。
-
_variant_t() 构 造 一 个 空 的 _variant_ 对 象 VT_EMPTY 。
-
_variant_t(VARIANT& varSrc ) 用 一 个 VARIANT 对 象 的 拷 贝 构 造 一个 variant_t 对 象 。 variant 类 型 被 保 留 。
-
_variant_t(VARIANT* pVarSrc ) 用 一 个 VARIANT 对 象 的 拷 贝 构 造一 个 variant_t 对 象 。 variant 类 型 被 保 留 。
-
_variant_t( _variant_t & var_t_Src ) 从 其 它 的 _variant_t 对 象 中 构造 一 个 _variant_t 对 象 。 variant 类 型 被 保 留 。
-
_variant_t(VARIANT& varSrc , bool fCopy ) 从 其 它 已 存 在 的VARIANT 对 象 中 构 造 一 个 _variant_t 对 象 。 如 果 fCopy 是 假 , 则VARIANT 对 象 将 同 新 的 对 象 连 接 而 不 会 创 建 一 个 拷 贝 。
-
_variant_t(short sSrc , VARTYPE vtSrc = VT_I2) 从 一 个 短 整 型值 中 构 造 一 个 有 VT_I2 或 者 VT_BOOL 类 型 的 _variant_t 对 象 。 任 何其 它 的 VARTYPE 会 导 致 一 个 E_INVALIDARG 错 误 。
-
_variant_t(long lSrc , VARTYPE vtSrc = VT_I4) 从 一 个 长 整 型 值中 构 造 一 个 有 VT_I4 或者 VT_BOOL 或 者 VT_ERROR 类 型 的 _variant_t 对 象 。 任 何 其 它 的 VARTYPE 会 导 致 一 个 E_INVALIDARG 错 误 。
-
_variant_t(float fltSrc ) 从 一 个 浮 点 数 值 中 构 造 一 个 有 VT_R4 类型 的 _variant_t 对 象 。
-
_variant_t(double dblSrc , VARTYPE vtSrc = VT_R8) 从 一 个 双 精度 型 数 值 中 构 造 一 个 有 VT_R8 或 者 VT_DATE 类 型 的 _variant_t 对象 。 任 何 其 它 的 VARTYPE 会 导 致 一 个 E_INVALIDARG 错 误 。
-
_variant_t(CY& cySrc) 从 一 个 CY 对 象 中 构 造 一 个 有 VT_CY 类 型的 _variant_t 对 象 。
-
_variant_t(_bstr_t& bstrSrc ) 从 一 个 _bstr_t 对 象 中 构 造 一 个 有VT_BSTR 类 型 的 _variant_t 对 象 。 将 会 分 配 一 个 新 的 BSTR 。
-
_variant_t(wchar_t * wstrSrc ) 从 一 个 Unicode 型 字 符 串 中 构 造一 个 有 VT_BSTR 类 型 的 _variant_t 对 象 。 将 会 分 配 一 个 新 的 BSTR 。
-
_variant_t(char* strSrc) 从 一 个 字 符 串 中 构 造 一 个 有 VT_BSTR 类 型 的 _variant_t 对 象 。 将 会 分 配 一 个 新 的 BSTR 。
-
_variant_t(bool bSrc ) 从 一 个 Bool 型 值 中 构 造 一 个 有 VT_BOOL 类 型 的 _variant_t 对 象 。
-
_variant_t(IUnknown* pIUknownSrc , bool fAddRef = true) 从
一 个 COM 接 口 指 针 中 构 造 一 个 有 VT_UNKNOWN 类 型 的 _variant_t 对象 。 如 果 fAddRef 的 值 是 真 , 对 提 供 的 接 口 指 针 调 用 AddRef 函 数 以匹 配 当 _variant_t 对 象 在 消 毁 时 将 要 调 用 的 Release 函 数 。 程 序 员有 责 任 对 提 供 的 接 口 指 针 调 用 Release 。 如 果 fAddRef 是假 , 由 此 构造 函 数 对 提 供 的 接 口 指 针 有 所 有 用 , 并 且 也 不 对 提 供 的 接 口 指 针 调用 Release 。
- _variant_t(IDispatch* pDispSrc , bool fAddRef = true) 从 一 个
COM 接 口 指 针 中 构 造 一 个 有 VT_DISPATCH 类 型 的 _variant_t 对 象 。如 果 fAddRef 的 值 是 真 , 对 提 供 的 接 口 指 针 调 用 AddRef 函 数 以 匹 配当 _variant_t 对 象 在 消 毁 时 将 要 调 用 的 Release 函 数 。 程 序 员 有 责任 对 提 供 的 接 口 指 针 调 用 Release 。 如 果 fAddRef 是 假 , 由 此 构 造 函数 对 提 供 的 接 口 指 针 有 所 有 用 , 并 且 也 不 对 提 供 的 接 口 指 针 调 用Release 。
- _variant_t(DECIMAL& decSrc ) 从 一 个 数 字 值 构 造 一 个 具 有
VT_DECIMAL 类 型 的 _variant_t 对 象 。
- _variant_t(BYTE bSrc ) 从 一 个 BYTE 值 构 造 一 个 具 有 VT_UI1 类 型 的
_variant_t 对 象 。
Microsoft 特 殊 处 结 束
_variant_t::Attach
Microsoft 特 殊 处 →
void Attach(VARIANT& varSrc ) throw(_com_error);
参 数
varSrc
一 个 将 要 同 此 _variant_t 对 象 连 接 的 VARIANT 对 象 。
注 释
通 过 封 装 此 VARIANT 而 取 得 其 所 有 权 。 这 一 成 员 函 数 释 放 任 何 存 在 的 封 装 的VARIANT, 然 后 拷 贝 所 提 供 的 VARIANT, 并 把 它 的 VARTYPE 设 置 为 VT_EMPTY 以 使得 其 资 源 仅 仅 只 能 由 _variant_t 的 析 构 函 数 释 放 。
Microsoft 特 殊 处 结 束
_variant_t::Clear
Microsoft 特 殊 处 →
void Clear() throw(_com_error);
注 释
对 封 装 的 VARIANT 对 象 调 用 VariantClear 。
Microsoft 特 殊 处 结 束
_variant_t::ChangeType
Microsoft 特 殊 处 →
void ChangeType(VARTYPE vartype , const _variant_t* pSrc = NULL) throw(_com_error);
参 数
vartype
_variant_t 对 象 的 VARTYPE 。
- 个 指 向 要 被 转 换 的 _variant_t 对 象 的 指 针 。 如 果 它 的 值 是 NULL, 则 会 适 当 地进 行 转 换 。
注 释
此 成 员 函 数 转 换 一 个 _variant_t 对 象 为 被 说 明 的 VARTYPE 。 如 果 pSrc 是 NULL, 会 适 当 地 进 行 转 换 , 否 则 , 此 _variant_t 对 象 会 从 pSrc 拷 贝 并 进 行 转 换 。Microsoft 特 殊 处 结 束
_variant_t::Detach
Microsoft 特 殊 处 →
VARIANT Detach() throw(_com_error);
返 回 值
封 装 的 VARIANT
注 释
提 取 并 返 回 封 装 的 VARIANT, 然 后 清 除 _variant_t 对 象 但 并 不 消 毁 它 。 此 成 员 函数 从 封 装 中 移 去 VARIANT 并 把 _variant_t 对 象 的 VARTYPE 设 置 为 VT_EMPTY 。 可通 过 调 用 Varia n tInit 函 数 释 放 返 回 的 VARIANT 。
Microsoft 特 殊 处 结 束
_variant_t::SetString
Microsoft 特 殊 处 →
void SetString(const char* pSrc ) throw(_com_error);
参 数
指 向 一 个 多 字 节 字 符 串 的 指 针 。
注 释
把 一 个 多 字 节 字 符 串 转 换 为 单 代 码 BSTR 对 象 , 然 后 把 它 赋 给 _variant_t 对 象 。
Microsoft 特 殊 处 结 束运 算 符
_variant_t::operator =
Microsoft 特 殊 处 →
_variant_t& operator=(const VARIANT& varSrc ) throw(_com_error);
_variant_t& operator=(const VARIANT* pVarSrc ) throw(_com_error);
_variant_t& operator=(const _variant_t& var_t_Src ) throw(_com_error);
_variant_t& operator=(short sSrc ) throw(_com_error);
_variant_t& operator=(long lSrc ) throw(_com_error);
_variant_t& operator=(float fltSrc ) throw(_com_error);
_variant_t& operator=(double dblSrc ) throw(_com_error);
_variant_t& operator=(const CY& cySrc ) throw(_com_error);
_variant_t& operator=(const _bstr_t& bstrSrc ) throw(_com_error);
_variant_t& operator=(const wchar_t* wstrSrc ) throw(_com_error);
_variant_t& operator=(const char* strSrc ) throw(_com_error);
_variant_t& operator=(IDispatch* pDispSrc ) throw(_com_error);
_variant_t& operator=(bool bSrc ) throw(_com_error);
_variant_t& operator=(IUnknown* pSrc ) throw(_com_error);
_variant_t& operator=(const DECIMAL& decSrc ) throw(_com_error);
_variant_t& operator=(BYTE bSrc ) throw(_com_error);
注 释
这 些 运 算 符 把 一 个 新 的 值 赋 给 _variant_t 对象 :
-
operator=( varSrc ) 把 一 个 已 存 在 的 VARIANT 赋 给 一 个 _variant_t 对 象 。
-
operator=( pVarSrc ) 把 一 个 已 存 在 的 VARIANT 赋 给 一 个
_variant_t 对 象 。
- operator=( var_t_Src ) 把 一 个 已 存 在 的 _variant_t 赋 给 一 个
_variant_t 对 象 。
-
operator=( sSrc ) 把 一 个 短 整 型 值 赋 给 一 个 _variant_t 对 象 。
-
operator=( lSrc ) 把 一 个 长 整 型 值 赋 给 一 个 _variant_t 对 象 。
-
operator=( fltSrc ) 把 一 个 float 数 值 赋 给 一 个 _variant_t 对 象 。
-
operator=( dblSrc ) 把 一 个 double 数 值 赋 给 一 个 _variant_t 对象 。
-
operator=( cySrc ) 把 一 个 CY 对 象 赋 给 一 个 _variant_t 对 象 。
-
operator=( bstrSrc ) 把 一 个 BSTR 对 象 赋 给 一 个 _variant_t 对 象 。
-
operator=( wstrSrc ) 把 一 个 Unicode 字 符 串 赋 给 一 个 _variant_t 对 象 。
-
operator=( strSrc ) 把 一 个 多 字 节 字 符 串 赋 给 一 个 _variant_t 对
象 。
-
operator=( bSrc ) 把 一 个 Bool 值 赋 给 一 个 _variant_t 对 象 。
-
operator=( pDispSrc ) 把 一 个 VT_DISPATCH 对 象 赋 给 一 个
_variant_t 对 象 。
- operator=( pIUnknownSrc ) 把 一 个 VT_UNKNOWN 对 象 赋 给 一 个
_variant_t 对 象 。
-
operator=( decSrc ) 把 一 个 十 进 制 值 赋 给 一 个 _variant_t 对 象 。
-
operator=( bSrc ) 把 一 个 字 节 值 赋 给 一 个 _variant_t 对 象 。
Microsoft 特 殊 处 结 束
_variant_t 关 系 运 算 符
Microsoft 特 殊 处 →
bool operator==(const VARIANT& varSrc ) const throw(_com_error); bool operator==(const VARIANT* pSrc ) const throw(_com_error); bool operator!=(const VARIANT& varSrc ) const throw(_com_error); bool operator!=(const VARIANT* pSrc ) const throw(_com_error); 参 数
varSrc
- 个 要 同 _variant_t 对 象 进 行 比 较 的 VARIANT
pSrc
指 向 要 同 _variant_t 对 象 进 行 比 较 的 VARIANT 的 指 针
注 释
把 一 个 _variant_t 对 象 同 一 个 VARIANT 进 行 比 较 , 检 查 是 否 相 等 。 如 果 比 较 可以 进 行 , 返 回 真 , 否 则 返 回 假 。
Microsoft 特 殊 处 结 束
_variant_t 提 取 符
Microsoft 特 殊 处 →
operator short() const throw(_com_error); operator long() const throw(_com_error); operator float() const throw(_com_error); operator double() const throw(_com_error); operator CY() const throw(_com_error); operator bool() const throw(_com_error); operator DECIMAL() const throw(_com_error); operator BYTE() const throw(_com_error); operator _bstr_t() const throw(_com_error); operator IDispatch*() const throw(_com_error); operator IUnknown*() const throw(_com_error); 注 释
从 一 个 封 装 的 VARIANT 中 提 取 原 始 数 据 。 如 果 VARIANT 还 不 是 正 确 的 类 型 , 则 采
用 函 数 VariantChangeType 试 图 进 行 转 换 , 若 失 败 会 产 生 一 个 错 误 。
-
operator short() 提 取 一 个 短 整 型 值 。
-
operator long() 提 取 一 个 长 整 型 值 。
-
operator float() 提 取 一 个 float 型 数 值 。
-
operator double() 提 取 一 个 double 型 数 值 。
-
operator CY() 提 取 一 个 CY 对 象 。
-
operator bool() 提 取 一 个 BOOL 型 值 。
-
operator DECIMAL() 提 取 一 个 十 进 制 数 值 。
-
operator BYTE() 提 取 一 个 BYTE 型 数 值 。
-
operator _bstr_t() 提 取 一 个 封 装 在 _bstr_t 对 象 中 的 字 符 串 。
-
operator IDispatch*() 从 一 个 封 装 的 VARIANT 中 提 取 一 个dispinterface 指 针 。 对 结 果 指 针 调 用 了 AddRef 函数 , 故 有 责 任 调用 Release 去 释 放 它 。
-
operator IUnknown*() 从 一 个 封 装 的 VARIANT 中 提 取 一 个 COM 接口 指 针 。 对 结 果 指 针 调 用 了 AddRef 函 数 , 故 有 责 任 调 用 Release 去释 放 它 。
Microsoft 特 殊 处 结 束
附 录 D 图 表
本 附 录 包 含 以 下 一 些 图 表 :
-
ASCII 字 符 代 码
-
ASCII 多 语 言 代 码
-
ANSI 字 符 代 码
-
关 键 字 代 码
ASCII 字 符 代 码
ASCII 字 符 代 码 表 含 有 扩 展 ASCII 字 符 集 的 十 进 制 和 十 六 进 制 值 。 这 些 扩 展 字符 集 包 括 ASCII 字 符 集 和 128 个 其 它 为 图 形 和 画 线 的 字 符 , 通 常 叫 作 “ IBM 字 符集 ” 。
-
图 表 1( 代 码 0 ~ 127)
-
图 表 2( 代 码 128 ~ 255)
ASCII 多 语 言 代 码
在 IBM 字 符 集 上 存 在 着 很 多 不 同 的 变 型 , 称 为 “ 代 码 页 ”。 在 一 些 欧 洲 国 家 出 售的 系 统 中 作 用 的 多 语 言 代 码 是 代 码 页 850, 其 中 含 有 较 少 的 图 形 字 符 、 较 多 的 重音 字 符 以 及 其 它 特 殊 字 符 。
ANSI 字 符 代 码
ANSI 字 符 代 码 表 列 出 了 在 Windows 程 序 中 使 用 的 扩 展 字 符 。ANSI 字 符 集 中 从 32 ~ 126 是 来 自 于 ASCII 字 符 集 的 可 显 示 代 码 。 显 示 为 实 心 块 的 ANSI 字 符 是 未 定 义
的 字 符 以 及 在 输 出 设 备 上 会 表 现 得 不 同 的 字 符 。
关 键 字 代 码
有 些 键 , 如 功 能 键 、 光 标 键 以 及 ALT+KEY 的 组 合 键 没 有 ASCII 代 码 。 当 一 个 键 被按 下 的 时 候 , 在 键 盘 中 的 微 处 理 器 产 生 一 个 两 字 节 的 “ 扩 展 扫 描 码 ”。 第 一 个 字节 ( 低 位 ) 包 含 了 ASCII 码 ( 如 果 有 的 话 ) 。 第 二 个 字 节 ( 高位 ) 含 有 扫 描 码 — — 当键 盘 的 键 被 按 下 或 者 被 释 放 时 由 键 盘 所 产 生 的 一 个 唯 一 码 。 因 为 此 扩 展 扫 描 码比 标 准 ASCII 码 用 得 更 广 泛 , 程 序 可 以 用 它 确 定 哪 些 键 没 有 ASCII 码 。
ASCII 字 符 代 码 图 表 1
ASCII 代 码 127 有 代 码 DEL 。 在 MS-DOS 下 , 这 个 代 码 与 ASCII8(BS) 的 作 用 相 同 。DEL 是 由 CTRL+BKSP 按 键 产 生 的 。
ASCII 字 符 代 码 图 表 2
ASCII 多 语 言 代 码 图 表
ANSI 字 符 代 码 图 表
- 指 出 这 个 字 符 不 被 Windows 支持
T T 指 出 这 个 字 符 仅 在 TrueType 字 体 下 可 用
关 键 字 代 码 图 表 1
关 键 字 代 码 图 表 2
↑ 在 初 始 字 符 时 扩 展 的 代 码 返 回 0(NUL) 或 E0( 十 进 制 224) 。 这 是 键 盘 缓 冲 区中 第 二 个 ( 扩 展 的 ) 带 有 可 用 的 信 号 。
§ 这 些 组 合 键 仅 在 扩 展 的 键 盘 上 识 别 。
£ 这 些 键 仅 在 扩 展 的 键 盘 上 可 用 。 大 多 数 在 光 标 / 控 制 键 盘 区 。 如 果 从 键 盘 端口 (60h) 读 扫 描 码 , 它 以 两 个 字 节 (E0h) 后 跟 正 常 扫 描 码 方 式 出 现 。 但 是 , 当 通 过BIOS 中 断 16h 读 ENTER 和 / 键 时 , 只 看 见 E0h, 因 为 该 中 断 仅 给 出 一 位 扫 描 码 。
↑ ↑ 在 MS-DOS 下 ,SHIFT+PRTSC 引 起 中 断 5, 它 打 印 屏 幕 , 除 非 己 经 定 义 一 个 中 断处 理 器 代 替 该 缺 省 的 中 断 5 处 理 器 。