C O leSafeArray

COleSafeArray 类 是 用 于 处 理 任 意 类 型 和 维 数 的 数 组 的 类 。 COleSafeArray 是从OLE VARIANT 结 构 派 生 而 来 的 。 OLE SAFEARRAY 成 员 函 数 在 可 以 通 过COleSafeArray 来 访 问 , 就 象 是 特 别 为 一 维 的 字 节 数 组 所 设 计 的 一 个 成 员 函 数集 。

#include <afxdisp.h>

请 参 阅 COleVariant , CRecordset, CDatabase

CO leSafeArray 类 成 员

Construction

COleSafeArray 构 造 一 个 COleSafeArray 对象

Operations

Attach 给 COleSafeArray 对 象 以 存 在 的 VARIANT 数 组 的控 制

Clear 释 放 基 VARIANT 中 的 所 有 数 据

Detach 将 VARIANT 数 组 从 COleSafeArray 对 象 中 分 离 出来 ( 这 将 使 数 据 不 会 被 释 放 )

W in32 API W rappers

AccessData 获 取 一 个 指 向 数 组 数 据 的 指 针

AllocData 为 数 组 分 配 内 存

AllocDescriptor 为 安 全 数 组 描 述 符 分 配 内 存

Copy 创 建 一 个 已 存 在 的 数 组 的 拷 贝

Create 创 建 一 个 安 全 数 组

Destroy 销 毁 一 个 已 经 存 在 的 数 组

DestroyData 销 毁 一 个 安 全 数 组 中 的 数 据DestroyDescriptor 销 毁 一 个 安 全 数 组 的 描 述 符GetDim 返 回 数 组 的 维 数

GetElement 获 取 安 全 数 组 中 的 一 个 单 一 元 素

GetElemSize 返 回 安 全 数 组 中 一 个 元 素 的 按 字 节 表 示 的 大 小

GetLBound 返 回 一 个 安 全 数 组 任 一 维 的 下 界

续 表

GetUBound 返 回 一 个 安 全 数 组 任 一 维 的 上 界

Lock 增 加 一 个 数 组 的 加 锁 计 数 , 并 将 一 个 指 向 数 组 数据 的 指 针 放 到 数 组 描 述 符 中

PtrOfIndex 返 回 一 个 指 向 被 索 引 的 元 素 的 指 针

PutElement 将 一 个 单 一 的 元 素 放 入 数 组 中

Redim 改 变 一 个 安 全 数 组 的 最 不 重 要 ( 最 右 边 ) 的 边 界

UnaccessData 减 小 一 个 数 组 的 加 锁 计 数 , 并 使 由 AccessData 获

得 的 指 针 无 效

Unlock 减 小 一 个 数 组 的 加 锁 以 使 它 能 被 释 放 或 改 变 大 小

One-Dimensional Array Operations

CreateOneDim 创 建 一 个 一 维 的 COleSafeArray 对 象

GetOneDimSize 返 回 一 个 一 维 的 COleSafeArray 对 象 中 的 元 素 个

ResizeOneDim 改 变 一 个 一 维 的 COleSafeArray 对 象 中 的 元 素 个

Operators

Operator = 将 一 些 值 ( 包 括 SAFEARRAY , VARIANT , ColeVariant , 或 ColeSafeArray 对 象 ) 拷 贝 到COleSafeArray 对 象 中

Operator == 比 较 两 个 不 同 的 数 组( SAFEARRAY , VARIAN T , ColeVarian t, 或 COleSafeArray 对 象 )

Operator << 向 转 储 描 述 表 输 出 一 个 COleSafeArray 对 象 的 内容

Operator LPVARIANT 访 问 COleSafeArray 对 象 的 基 VARIANT 结构

O perator LPCVARIANT 访 问 COleSafeArray 对 象 的 基 VARIANT 结构

成 员 函 数

CO leSafeArray::AccessData

void AccessData( void* ppvData );

ppvData

指 向 数 组 数 据 的 指 针 的 指 针 。

说 明

此 成 员 函 数 用 来 返 回 一 个 指 向 数 组 数 据 的 指 针 。 如 果 出 错 , 则 函 数 抛 出 一 个

CMemoryException 或 COleException 。

请 参 阅 COleSafeArray::UnaccessData , SafeArrayAccessData

CO leSafeArray::AllocData

void AllocData();

此 成 员 函 数 用 来 为 一 个 安 全 数 组 分 配 内 存 。 如 果 出 错 , 则 函 数 抛 出 一 个

CMemoryException 或 COleException 。

请 参 阅 COleSafeArray::AllocDescriptor, SafeArrayAllocData

CO leSafeArray::AllocDescriptor

void AllocDescriptor( DWORD dwDims );

参 数

dwDims

安 全 数 组 中 的 维 数 。

此 函 数 用 来 为 一 个 安 全 数 组 的 描 述 符 分 配 内 存 。 如 果 出 错 , 则 函 数 抛 出 一 个

CMemoryException 或 COleException 。

请 参 阅 COleSafeArray::AllocData , SafeArrayAllocDescriptor

CO leSafeArray::Attach

void Attach( VARIANT& varSrc );

参 数

varSrc

是 一 个 VARIANT 对 象 。 参 数 varSrc 必 须 有 VARTYPE VT_ARRAY 。

此 成 员 函 数 将 对 一 个 已 有 的 VARIANT 数 组 中 的 数 据 的 控 制 传 给 COleSafeArray 对 象 。 源 VARIANT 的 类 型 被 设 置 为 VT_EMPTY 。 如 果 当 前 数 组 有 数 据 的 话 , 函 数 将 清 掉 这 些 数 据 。

请 参 阅 COleSafeArray::Detach

CO leSafeArray::Clear

void Clear();

说 明

此 函 数 用 来 清 除 安 全 数 组 。 函 数 通 过 将 对 象 的 VARTYPE 设 置 为 VT_EMPTY

来 清 除 一 个 安 全 数 组 。 数 组 中 的 当 前 内 容 被 释 放 , 数 组 也 被 释 放 了 。

请 参 阅 VariantClear

CO leSafeArray::COle S afeArray

COleSafeArray() ;

COleSafeArray( const SAFEARRAY& saSrc ,VARTYPE vtSrc ); COleSafeArray( LPCSAFEARRAY psaSrc , VARTYPE vtSrc ) ;

COleSafeArray( const COleSafeArray& saSrc ); COleSafeArray( const VARIANT& varSrc ); COleSafeArray( LPCVARIANT pSrc ); COleSafeArray( const COleVariant& varSrc );

参 数

saSrc

要 被 拷 贝 到 新 的 COleSafeArray 对 象 中 去 的 已 经 存 在 的 COleSafeArray 对象 或 SAFEARRAY 。

vtSrc

新的 COleSafeArray 对 象 的 VARTYPE 。

psaSrc

一 个 指 向 要 被 拷 贝 到 新 的 COleSafeArray 对 象 中 去 的 SAFEARRAY 的 指

varSrc

要 被 拷 贝 到 新 的 COleSafeArray 对 象 中 去 的 已 经 存 在 的 V A R IANT 或 者

COleVariant 。

pSrc

一 个 指 向 要 被 拷 贝 到 新 的 COleSafeArray 对 象 中 去 的 VARIANT 对 象 的 指

说 明

所 有 这 些 构 造 函 数 都 创 建 一 个 新 的 COleSafeArray 对 象 。 如 果 没 有 参 数 , 则 创

建 的 是 一 个 空 的 COleSafeArray 对 象 ( VT_EMPTY ) 。 如 果 COleSafeArray 是从 另 一 个 数 组 拷 贝 来 的 , 并 且 这 个 数 组 的 VARTYPE 并 不 是 完 全 确 定 的 ( 一 个COleSafeArray, COleVariant , 或 者 VARIANT ) , 则 源 数 组 中 的 VARTYPE 被保 留 , 并 且 不 需 要 说 明 。 如 果 COleSafeArray 是 从 另 一 个 数 组 拷 贝 而 来 , 并 且该 数 组 的 VARTYPE 是 不 知 道 的 , 则 VARTYPE 必 须 用 vtSrc 参 数 来 指 定 。

如 果 出 错 , 则 函 数 抛 出 一 个 CMemoryException 或 COleException 。

请 参 阅 VariantCopy

CO leSafeArray::Copy

void Copy( LPSAFEARRAY* ppsa );

参 数

ppsa

指 向 一 个 特 定 区 域 的 指 针 , 在 这 个 特 定 区 域 中 将 返 回 新 的 数 组 描 述 符 。

说 明

创 建 一 个 已 经 存 在 的 安 全 数 组 的 拷 贝 。 如 果 出 错 , 则 函 数 抛 出 一 个

CMemoryException 或 COleException 。

请 参 阅 SafeArrayCopy

CO leSafeArray::Create

void Create( VARTYPE vtSrc , DWORD dwDim s , DWORD* rgElements );

void Create( VARTYPE vtSrc , DWORD dwDim s, SAFEARRAYBOUND*

rgsabounds );

参 数

vtSrc

是 数 组 的 基 本 类 型 ( 也 就 是 说 , 数 组 的 每 一 个 元 素 的 VARTYPE ) 。VARTYPE 被 限 制 在 可 变 类 型 的 一 个 子 集 。 不 能 设 置 为 VT_ARRAY 和VT_BYREF 标 志 。 对 数 组 来 说 VT_ARRAY 和 VT_BYREF 是 无 效 的 基 本类 型 。 所 有 其 它 的 类 型 都 是 合 法 的 。

dwDims

数 组 中 的 维 数 。 在 数 组 创 建 之 后 , 可 以 用 Redim 来 改 变 这 个 值 。

rgElements

指 向 一 个 数 组 的 指 针 。 该 数 组 中 记 录 着 被 创 建 的 数 组 的 每 一 维 的 元 素 个

数 。

rgsabounds

指 向 一 个 分 配 给 数 组 的 界 线 向 量 ( 每 一 维 一 个 ) 的 指 针 。

说 明

此 函 数 用 来 给 数 组 分 配 和 初 始 化 数 据 。 如 果 必 要 的 话 , 这 个 函 数 将 清 除 当 前 的数 组 数 据 。 如 果 出 错 , 则 函 数 抛 出 一 个 CMemoryException 。

请 参 阅 SafeArrayCreate

CO leSafeArray::CreateOneDim

void CreateOneDim( VARTYPE vtSrc , DWORD dwElememts , const void* pvSrcData = NULL,long nLBound = 0 );

参 数

vtSrc

是 数 组 的 基 本 类 型 ( 也 就 是 说 , 数 组 的 每 一 个 元 素 的 VARTYPE ) 。

dwElements

数 组 的 维 数 。 在 数 组 被 创 建 之 后 可 以 用 ResizeOne D im 来 改 变 这 个 值 。

pvSrcData

指 向 要 拷 贝 到 数 组 中 去 的 数 据 的 指 针 。

nL B ound

数 组 的 下 界 。

说 明

此 函 数 用 来 创 建 一 个 一 维 的 COleSafeArray 对 象 。 函 数 为 数 组 分 配 并 初 始 化 数据 , 如 果 指 针 pvSrcData 不 是 NULL , 则 将 指 定 的 数 据 拷 贝 到 数 组 中 。

如 果 出 错 , 则 函 数 抛 出 一 个 CMemoryException 。

请 参 阅 COleSafeArray::GetOneDimSize , COleSafeArray::ResizeOneDim ,

COleSafeArray::Create

CO leSafeArray::Destroy

void Destroy();

说 明

此 函 数 用 来 销 毁 一 个 已 经 存 在 的 数 组 描 述 符 和 数 组 中 的 所 有 数 据 。 如 果 数 组 中保 存 有 对 象 , 则 每 一 个 对 象 都 被 释 放 。 如 果 出 错 , 则 函 数 抛 出 一 个CMemoryException 或 COleException 。

请 参 阅 COleSafeArray::DestroyData , COleSafeArray::DestroyDescriptor ,

SafeArrayDestroy

CO leSafeArray::DestroyData

void DestroyData() ;

说 明

此 函 数 销 毁 一 个 安 全 数 组 中 的 所 有 数 据 。 如 果 数 组 中 保 存 有 对 象 , 则 每 一 个 都被 释 放 。 如 果 出 错 , 则 函 数 抛 出 一 个 CMemoryException 或 COleException 。

请 参 阅 COleSafeArray::DestroyData , COleSafeArray::DestroyDescriptor, SafeArrayDestroyData

CO leSafeArray::DestroyDescriptor

void DestroyDescriptor();

说 明

此 函 数 用 来 销 毁 一 个 安 全 数 组 的 描 述 符 。 如 果 出 错 , 则 函 数 抛 出 一 个

CMemoryException 或 COleException 。

请 参 阅 COleSafeArray::DestroyData , COleSafeArray::DestroyDescriptor, SafeArrayDestroyDescriptor

CO leSafeArray::Detach

VARIANT D e tach();

返 回 COleSafeArray 对 象 中 的 基 VARIANT 值 。

说 明

此 成 员 函 数 用 来 将 VARIANT 数 据 从 COleSafeArray 对 象 中 分 离 出 来 。 函 数 通过 将 对 象 的 VARTYPE 设 置 为 VT_EMPTY 来 分 离 出 安 全 数 组 中 的 数 据 。 调 用者 通 过 调 用 W indows 函 数 VariantClear 来 负 责 释 放 数 组 。

如 果 出 错 , 则 函 数 抛 出 一 个 COleException 。

请 参 阅 COleSafeArray::Attach , VariantClear

CO leSafeArray::GetDim

DWORD GetDim();

安 全 数 组 的 维 数 。

说 明

此 函 数 返 回 COleSafeArray 对 象 中 的 维 数 。

请 参 阅 COleSafeArray::Create , COleSafeArray::Redim , SafeArrayGetDim

CO leSafeArray::GetElement

void GetElement( long* rgIndices , void* pvData );

参 数

rgIndices

指 向 一 个 数 组 的 指 针 。 该 数 组 包 含 安 全 数 组 的 每 一 维 的 索 引 。

pvData

指 向 用 来 放 置 数 组 的 元 素 的 特 定 区 域 的 指 针 。

说 明

此 函 数 用 来 获 取 安 全 数 组 中 的 一 个 单 一 的 元 素 。 在 获 取 元 素 之 前 和 获 取 元 素 之后 , 此 函 数 自 动 调 用 W indows 函数 Safe A rrayLock 和 SafeArrayUnlock 。 如 果 此数 据 元 素 是 一 个 字 符 串 , 对 象 或 可 变 类 型 , 则 函 数 会 用 正 确 的 方 法 来 拷 贝 这 个元 素 。 参 数 pvData 应 该 指 向 足 够 大 的 缓 冲 区 以 保 存 这 个 元 素 。

如 果 出 错 , 函 数 将 抛 出 一 个 CMemoryException 和 COleException 。

请 参 阅 COleSafeArray::PutElemen t, SafeArrayGetElement

CO leSafeArray::GetElemSize

DWORD GetElemSize();

返 回 值

以 字 节 表 示 的 安 全 数 组 中 的 元 素 的 大 小 。

说 明

此 函 数 用 来 获 取 一 个 COleSafeArray 大 小 中 的 一 个 元 素 的 大 小 。

请 参 阅 COleSafeArray::GetDim , SafeArrayGetElemSize

CO leSafeArray::GetBound

void GetBound( D W O R D dwDim , long* pLBound );

参 数

dwDim

要 获 得 其 下 界 的 数 组 的 维 数 。

b pLBound

指 向 要 返 回 下 界 的 位 置 的 指 针 。

说 明

此 成 员 函 数 返 回 一 个 COleSafeArray 对 象 的 任 何 维 的 下 界 。 如 果 出 错 , 则 函 数抛 出 一 个 COleException 。

请 参 阅 COleSafeArray::GetUBound , SafeArrayGetLBound

CO leSafeArray::GetOneDimSize

DWORD GetOneDimSize();

返 回 值

  • 维 安 全 数 组 中 的 元 素 个 数 。

此 成 员 函 数 用 来 返 回 一 个 一 维 的 COleSafeArray 对 象 的 元 素 个 数 。

请 参 阅 COleSafeArray::CreateOneDimSize , COleSafeArray::ResizeOneDim ,

SafeArrayRedim

CO leSafeArray::GetUBound

void GetUBound ( DWORD dwDim , long* pUBound );

参 数

dwDim

要 获 得 其 上 界 的 数 组 的 维 数 。

pUBound

指 向 要 返 回 上 界 的 位 置 的 指 针 。

此 成 员 函 数 返 回 一 个 COleSafeArray 对 象 的 任 何 维 的 上 界 。 如 果 出 错 , 则 函 数抛 出 一 个 COleException 。

请 参 阅 COleSafeArray::GetLBound , SafeArrayGetUBound

CO leSafeArray::Lock

void Lock();

说 明

此 成 员 函 数 用 来 增 加 一 个 数 组 的 加 锁 计 数 , 并 在 数 组 描 述 符 中 放 置 一 个 指 向 数组 数 据 的 指 针 。 如 果 出 错 , 则 函 数 抛 出 一 个 COleException 。

数 组 描 述 符 中 的 指 针 一 直 有 效 , 直 到 调 用 了 Unlock 。 对 Lock 的 调 用 可 以 是 嵌

套 的 ; 这 时 就 需 要 对 Unlock 进 行 相 同 次 数 的 调 用 。当 一 个 数 组 被 锁 住 时 是 不 能 被 删 除 的 。

请 参 阅 COleSafeArray ::Unlock , SafeArrayLock

CO leSafeArray::PtrOfIndex

void PtrOfIndex( long* rgIndices , void** ppvData );

参 数

rgIndices

一 个 索 引 值 数 组 。 这 些 索 引 值 用 来 标 识 数 组 中 的 一 个 元 素 。 元 素 的 索 引 都必 须 被 指 明 。

ppvData

在 返 回 时 , 指 向 由 rgIndices 中 的 值 标 识 的 元 素 。

此 函 数 返 回 一 个 指 向 由 索 引 值 指 定 的 元 素 的 指 针 。

请 参 阅 SafeArrayPtrOfIndex

CO leSafeArray::PutElement

void PutElement( long* rgIndices , LPVOID pvData );

参 数

rgIndices

指 向 一 个 数 组 的 指 针 。 该 数 组 包 含 安 全 数 组 的 每 一 个 元 素 的 索 引 。

pvData

指 向 要 赋 给 数 组 的 数 据 的 指 针 。 VT_DISPATCH , VT_UNKNOWN , 和

VT_BSTR 可 变 类 型 都 是 指 针 , 它 们 不 需 要 其 它 级 别 的 迂 回 。

这 个 函 数 用 来 将 一 个 单 一 的 元 素 赋 给 数 组 。 在 分 配 元 素 之 前 和 分 配 元 素 之 后 , 此 函 数 自 动 调 用 W indows 函 数 SafeArrayLock 和 SafeArrayUnlock 。 如 果 数 据 元素 是 一 个 字 符 串 , 对 象 或 可 变 类 型 , 则 函 数 会 正 确 拷 贝 它 们 , 并 且 如 果 已 经 存在 的 元 素 是 一 个 字 符 串 , 对 象 , 或 可 变 类 型 , 它 们 将 被 清 除 。

注 意 你 可 以 对 一 个 数 组 进 行 多 重 锁 定 , 这 样 当 数 组 被 其 它 操 作 加 锁 时 , 你 仍 然可 以 将 元 素 放 入 这 个 数 组 中 。

如 果 出 错 , 函 数 将 抛 出 一 个 CMemoryException 或 COleException 。

请 参 阅 COleSafeArray::GetElemen t, SafeArrayPutElement

CO leSafeArray::Redim

void Redim( SAFEARRAYBOUND* psaboundNew );

psaboundNew

指 向 一 个 新 的 安 全 数 组 边 界 结 构 的 指 针 , 这 个 边 界 结 构 包 含 新 数 组 的 边界 。 只 有 数 组 的 最 不 重 要 的 维 是 可 以 改 变 的 。

说 明

此 函 数 用 来 改 变 一 个 安 全 数 组 的 最 不 重 要 的 ( 最 右 边 的 ) 边 界 。 如 果 出 错 , 函数 将 抛 出 一 个 COleException 。

请 参 阅 COleSafeArray::Create , COleSafeArray::GetDim ,

COleSafeArray::ResizeOneDim ,

SafeArrayRedim

void ResizeOneDim( DWORD dwElements );

参 数

dwElements

一 维 安 全 数 组 中 的 元 素 个 数 。

说 明

此 函 数 用 来 改 变 一 个 一 维 COleSafeArray 对 象 的 元 素 个 数 。 如 果 错 误 , 函 数 将抛 出 一 个 COleException 。

请 参 阅 COleSafeArray::Redim , COleSafeArray::GetOneDimSize , COleSafeArray::CreateOneDim , SafeArrayRedim

void UnaccessData();

说 明

此 函 数 用 来 减 小 一 个 数 组 中 的 锁 定 计 数 , 并 使 由 AccessData 获 取 的 指 针 无 效 。如 果 出 错 , 函 数 将 抛 出 一 个 COleException 。

请 参 阅 COleSafeArray::AccessData , SafeArrayUnaccessData

CO leSafeArray::Unlock

void Unlock();

说 明

此 函 数 用 来 减 小 一 个 数 组 的 锁 定 计 数 , 以 使 数 组 能 够 被 释 放 或 改 变 大 小 。 此 函

COleException 。

请 参 阅 COleSafeArray::Lock , SafeArrayUnlock

操 作 符

CO leSafeArray::operator =

COleSafeArray& operator = ( const COleSafeArray& saSrc ); COleSafeArray& operator = ( const VARIANT& varSrc ); COleSafeArray& operator = ( LPCVARIANT pSrc ); COleSafeArray& operator = ( const COleVariant& varSrc );

说 明

这 些 重 载 的 赋 值 操 作 符 将 源 值 拷 贝 到 COleSafeArray 对 象 。 一 个 有 关 每 个 操 作

  • operator = (saSrc) 将 一 个 已 经 存 在 的 COleSafeArray 对 象 拷 贝

    到 这 个 对 象中 。

  • operator = (varSrc) 将 一 个 已 经 存 在 的 VARIANT 或 COleVariant

    数 组 拷 贝到 这 个 对 象 中 。

  • operator = (pSrc) 将 一 个 由 pSrc 访 问 的 VARIANT 数 组 拷 贝 到

    这 个 对 象 中 。

请 参 阅 VariantCopy

CO leSafeArray::operator ==

BOOL operator = = ( const SAFEARRAY& saSrc ) const; BOOL operator = = ( LPCSAFEARRAY pSrc ) const; BOOL operator = = ( const COleSafeArray& saSrc ) const; BOOL operator = = ( const VARIANT& varSrc ) const; BOOL operator = = ( LPCVARIANT pSrc ) const;

BOOL operator = = ( const COleVariant& varSrc ) const;

说 明

这 个 操 作 符 比 较 两 个 数 组 ( SAFEARRAY , VARIANT , COleVariant , 或COleSafeArray 数 组 ) , 如 果 它 们 相 等 则 返 回 非 零 值 ; 否 则 就 返 回 零 。 如 果 两个 数 组 具 有 相 同 的 维 数 , 每 一 维 的 大 小 相 等 , 且 元 素 值 相 等 , 则 它 们 就 是 相 等 。

CO leSafeArray::operator <<

CDumpContext& AFXAPI operato r<<( CDumpContext& dc , COleSafeArray&

saSrc );

说 明

此 强 制 转 换 操 作 符 用 来 访 问 COleSafeArray 对 象 的 基 VARIANT 结 构 。

CO leSafeArray::operator LPVARIANT

operator LPVARIANT();

说 明

此 强 制 转 换 操 作 符 用 来 访 问 COleSafeArray 对 象 的 基 VARIANT 结 构 。

注 意 , 改 变 由 这 个 函 数 的 返 回 指 针 访 问 的 VARIANT 结 构 的 值 , 将 改 变 这 个

COleSafeArray 对 象 的 值 。