SAFEARRAY構造体

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

SAFEARRAY構造体 - (2009/01/27 (火) 13:07:01) のソース

-&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用の配列という香りがプンプンしとる}
ツールボックス

下から選んでください:

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