-&link_anchor(1){SAFEARRAYとは} -&link_anchor(2){宣言されてるところ} -&link_anchor(3){メンバ} ---- ***&anchor(1){SAFEARRAYとは} 主にCOM経由でのデータのやりとりを行う際に使われる。 VBの配列に似た性質を持っていて、各次元毎に配列の長さが決められたりする。 各要素を&b(){VARIANT型}で持つことで、かなり柔軟な情報格納ができる。 …、けど使うのはなんとなく煩雑な気がするし、正直めんどい。 COMを通じてExcelデータの取得、指定レンジオブジェクトへのデータの書き込みなどを 行う際には使わざるを得なくなる。 まぁVBのデータ型を持ってこれる配列、と認識しておいてもいいのでは? ---- ***&anchor(2){宣言されてるところ} :パス|c:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\ &b(){&color(blue){OAIdl.h}} &b(){&color(blue){OleAuto.h}} ---- ***&anchor(3){メンバ} 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|各次元への境界(次元ごとに持ってると思われ)。&br()おそらくリニアに持っている配列データの区切り位置を指すのでは。 &b(){rgsabound}メンバは一番左の次元(例えばa[2][3][4]なら[2]の部分)が&b(){rgsabound[0]}に格納され、一番右の次元が&b(){rgsabound[cDims-1]}に格納される。 もし配列がC文法的に &b(){[2][5]}と指定されていたら、配列は2つの要素を持つrgsaboundを擁する。 要素0は &b(){lLbound=0}, &b(){cElements=2}, 要素1は&b(){lLbound=0}, &b(){cElements=5}となる &b(){fFeatures}フラグは配列がどのように解放されるかに影響する記述部分。 配列の解放については配列が持っているVARIANT要素の参照は無視して行うことができる。 指定できるフラグについては以下のとおり。 :&color(blue){#define FADF_AUTO 0x0001}|配列はスタック上に割り当てられる :&color(blue){#define FADF_STATIC 0x0002}|配列は静的に割り当てられる :&color(blue){#define FADF_EMBEDDED 0x0004}|配列は構造体に組み込まれる :&color(blue){#define FADF_FIXEDSIZE 0x0010}|配列はリサイズ、再割り当てできない :&color(blue){#define FADF_BSTR 0x0100}|BSTR型の配列 :&color(blue){#define FADF_UNKNOWN 0x0200}|IUnknown*型の配列 :&color(blue){#define FADF_DISPATCH 0x0400}|IDispatch*型の配列 :&color(blue){#define FADF_VARIANT 0x0800}|VARIANT型の配列 :&color(blue){#define FADF_RESERVED 0xF0E8}|このビットは将来のために予約済み &b(){以上を見ても分かるとおり、COM用の配列という香りがプンプンしとる}