SAFEARRAY構造体

「SAFEARRAY構造体」の編集履歴(バックアップ)一覧に戻る

SAFEARRAY構造体 - (2009/01/26 (月) 16:25:38) の編集履歴(バックアップ)



SAFEARRAYとは

主にCOM経由でのデータのやりとりを行う際に使われる。
VBの配列に似た性質を持っていて、各次元毎に配列の長さが決められたりする。
各要素をVARIANT型で持つことで、かなり柔軟な情報格納ができる。
…、けど使うのはなんとなく煩雑な気がするし、正直めんどい。
COMを通じてExcelデータの取得、指定レンジオブジェクトへのデータの書き込みなどを
行う際には使わざるを得なくなる。
まぁVBのデータ型を持ってこれる配列、と認識しておいてもいいのでは?



宣言されてるところ

パス
c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\
OAIdl.h
OleAuto.h



メンバ

typedef struct tagSAFEARRAY
{
   USHORT cDims;
   USHORT fFeatures;
   ULONG cbElements;
   ULONG cLocks;
   PVOID pvData;
   SAFEARRAYBOUND rgsabound[ 1 ];
} SAFEARRAY;

cDims
配列の次元
fFeatures
SafeArrayルーチンによって使われるフラグ。SafeArrayXXXX()系の関数内部で参照される
cbElements
配列の要素のサイズ。ポインタが指すデータサイズは含まない。おそらくVARIANT型の要素を幾つ持っているか的なサイズ。
cLocks
対応するUnlockなしでのLockされた回数。Lockネストの深さだと思われ。
pvData
データへのVoid型ポインタ
rgsabound
各次元への境界(次元ごとに持ってると思われ)。
おそらくリニアに持っている配列データの区切り位置を指すのでは。

rgsaboundメンバは一番左の次元(例えばa[2][3][4]なら[2]の部分)がrgsabound[0]に格納され、一番右の次元がrgsabound[cDims-1]に格納される。
もし配列がC文法的に [2][5]と指定されていたら、配列は2つの要素を持つrgsaboundを擁する。
要素0は lLbound=0, cElements=2, 要素1はlLbound=0, cElements=5となる

fFeaturesフラグは配列がどのように解放されるかに影響する記述部分。
配列の解放については配列が持っているVARIANT要素の参照は無視して行うことができる。
指定できるフラグについては以下のとおり。

#define FADF_AUTO 0x0001
配列はスタック上に割り当てられる
#define FADF_STATIC 0x0002
配列は静的に割り当てられる
#define FADF_EMBEDDED 0x0004
配列は構造体に組み込まれる
#define FADF_FIXEDSIZE 0x0010
配列はリサイズ、再割り当てできない
#define FADF_BSTR 0x0100
BSTR型の配列
#define FADF_UNKNOWN 0x0200
IUnknown*型の配列
#define FADF_DISPATCH 0x0400
IDispatch*型の配列
#define FADF_VARIANT 0x0800
VARIANT型の配列
#define FADF_RESERVED 0xF0E8
このビットは将来のために予約済み

以上を見ても分かるとおり、COM用の配列という香りがプンプンしとる
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。