SAFEARRAY-Datentyp

Dieser Dokumentation für die Vorschau nur ist und in späteren Versionen geändert. Leere Themen wurden als Platzhalter eingefügt.]

Die Definition für ein sicheres Array hängt von der Betriebssystem-Zielplattform. Auf 32-Bit-Windows-Systemen sowohl die cbElementscLocks Parameter und sind lange Ganzzahlen ohne Vorzeichen und handle-Parameter weggelassen wird. Auf 16-Bit-Windows-Systemen, cbElements und cLockssind unsigned short Ganzzahlen. Der Parameter handle ist Gründen der Abwärtskompatibilität mit früheren Software enthalten. Beispiel:

typedef struct FARSTRUCT tagSAFEARRAY {
   unsigned short cDims;       // Count of dimensions in this array.
   unsigned short fFeatures;   // Flags used by the SafeArray
                        // routines documented below.
#if defined(WIN32)
   unsigned long cbElements;   // Size of an element of the array.
                        // Does not include size of
                        // pointed-to data.
   unsigned long cLocks;      // Number of times the array has been 
                        // locked without corresponding unlock.
#else
   unsigned short cbElements;
   unsigned short cLocks;
   unsigned long handle;      // Used on Macintosh only.
#endif
   void HUGEP* pvData;             // Pointer to the data.
   SAFEARRAYBOUND rgsabound[1];      // One bound for each dimension.
} SAFEARRAY;

Thread-Sicherheit

Alle öffentlichen statischen Member des Datentyps SAFEARRAY sind threadsicher. Instanz-Membern sind garantiert nicht threadsicher.

Betrachten Sie beispielsweise eine Anwendung, die SafeArrayLockSafeArrayUnlock Funktionen und verwendet. Wenn diese Funktionen in der gleichen SAFEARRAY Daten Typinstanz gleichzeitig von verschiedenen Threads aufgerufen werden, kann eine inkonsistente Sperrenanzahl erstellt werden. Dies bewirkt schließlich die SafeArrayUnlock-Funktion E_UNEXPECTED zurückzugeben. Sie können dies verhindern, indem eine eigene Synchronisierung Code bereitstellen.

Hinweise

Das Array rgsabound wird mit der am weitesten links stehende Dimension in rgsabound[0] und die Dimension ganz rechts in rgsabound[cDims - 1] gespeichert. Wenn ein Array als [5] [2] in einer C-ähnlichen Syntax angegeben wurde, würde es zwei Elemente im rgsabound Vektor verfügen. Element 0 hat eine lLbound 0 und ein cElements 2. Element 1 hat eine lLbound 0 und ein cElements 5.

fFeatures Flags beschreiben Attribute eines Arrays, die auswirken können, wie das Array freigegeben wird. Feld fFeatures beschrieben, welche Art von Daten im SAFEARRAY gespeichert ist und wie das Array zugewiesen wird. Dadurch wird das Array freigeben, ohne dessen enthaltende Variante verweisen. Die Bits erfolgt die folgenden Konstanten verwenden:

fFeatures-Flags

Beschreibung

FADF_AUTO 0 X 0001

Ein Array, das auf dem Stapel zugeordnet wird.

FADF_STATIC 0 X 0002

Ein Array, das statisch zugeordnet wird.

FADF_EMBEDDED 0 X 0004

Ein Array, das in einer Struktur eingebettet ist.

FADF_FIXEDSIZE 0 X 0010

Ein Array, die nicht geändert oder neu reserviert werden kann.

FADF_RECORD 0 X 0020

Ein Array, das Datensätze enthält. Wenn dies festgelegt ist, wird es ein Zeiger auf die IRecordinfo Schnittstelle negativen Offset 4 in den Arraydeskriptor.

FADF_HAVEIID 0 X 0040

Ein Array, das eine IID, Schnittstelle identifiziert hat. Wenn dies festgelegt ist, wird es eine GUID negativen Offset 16 im sicheren Arraydeskriptor. Flag wird festgelegt, nur wenn FADF_DISPATCH oder FADF_UNKNOWN ebenfalls festgelegt ist.

FADF_HAVEVARTYPE 0 X 0080

Ein Array mit den VT-Typ. Wenn dies festgelegt ist, wird es ein-Tag VT negativen Offset 4 im Arraydeskriptor, der den Elementtyp angibt.

FADF_BSTR 0 X 0100

Ein Array von BSTRs.

FADF_UNKNOWN 0 X 0200

Ein Array von IUnknown 1.

FADF_DISPATCH 0X0400

Ein Array von IDispatch 1.

FADF_VARIANT 0X0800

Ein Array von Variant.

FADF_RESERVED 0XF0E8

Bits für die zukünftige Verwendung reserviert.