「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用の配列という香りがプンプンしとる