附 录 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+( s2s1 ) 把 一 个 多 字 节 字 符 串 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

附 录 A 语 法 总 结 - 图1

ASCII 代 码 127 有 代 码 DEL 。 在 MS-DOS 下 , 这 个 代 码 与 ASCII8(BS) 的 作 用 相 同 。DEL 是 由 CTRL+BKSP 按 键 产 生 的 。

ASCII 字 符 代 码 图 表 2

附 录 A 语 法 总 结 - 图2

ASCII 多 语 言 代 码 图 表

附 录 A 语 法 总 结 - 图3

ANSI 字 符 代 码 图 表

  • 指 出 这 个 字 符 不 被 Windows 支持

T T 指 出 这 个 字 符 仅 在 TrueType 字 体 下 可 用

关 键 字 代 码 图 表 1

附 录 A 语 法 总 结 - 图4

关 键 字 代 码 图 表 2

附 录 A 语 法 总 结 - 图5

↑ 在 初 始 字 符 时 扩 展 的 代 码 返 回 0(NUL) 或 E0( 十 进 制 224) 。 这 是 键 盘 缓 冲 区中 第 二 个 ( 扩 展 的 ) 带 有 可 用 的 信 号 。

§ 这 些 组 合 键 仅 在 扩 展 的 键 盘 上 识 别 。

£ 这 些 键 仅 在 扩 展 的 键 盘 上 可 用 。 大 多 数 在 光 标 / 控 制 键 盘 区 。 如 果 从 键 盘 端口 (60h) 读 扫 描 码 , 它 以 两 个 字 节 (E0h) 后 跟 正 常 扫 描 码 方 式 出 现 。 但 是 , 当 通 过BIOS 中 断 16h 读 ENTER 和 / 键 时 , 只 看 见 E0h, 因 为 该 中 断 仅 给 出 一 位 扫 描 码 。

↑ ↑ 在 MS-DOS 下 ,SHIFT+PRTSC 引 起 中 断 5, 它 打 印 屏 幕 , 除 非 己 经 定 义 一 个 中 断处 理 器 代 替 该 缺 省 的 中 断 5 处 理 器 。