Dec 172017
 
Microsoft documentation/specifications for the MAPI message handling protocol/API.
File MAPISPEC.ZIP from The Programmer’s Corner in
Category Tutorials + Patches
Microsoft documentation/specifications for the MAPI message handling protocol/API.
File Name File Size Zip Size Zip Type
IPROP.DOC 108828 23270 deflated
MAPICOV.DOC 18124 6051 deflated
MAPIS.DOC 105388 26785 deflated
MAPIX.DOC 222611 60607 deflated
MAPIX400.DOC 68393 19267 deflated
SPI.ZIP 178079 167468 deflated
TABLE.DOC 132766 29345 deflated
TXSTREAM.DOC 35296 12129 deflated

Download File MAPISPEC.ZIP Here

Contents of the IPROP.DOC file


-1@-{;y "("XVpVL?"+H((F4zFFF



MAPI 1.0
title "Property Interface"Property Interface
subject IPropertyIProperty
Revision 107
October 1, 1992

Warning: This is an early release of final product documentation. The software is still in development. The information in this documentation may be inaccurate or may not accurately represent the functionality of the final product. Microsoft assumes no responsibility for any damages that might result either directly or indirectly from these inaccuracies.
Contents
TOC \oIntroduction1
Constants1
Property Tags1
Property Types1
Property Attributes2
Data Structures3
Property Tag Array3
Attribute Array3
GUID and IID3
Property Value4
HRESULT and SCODE7
Property Problem7
Property Problem Array8
IProperty Interface8
Release()9
GetProps()9
GetAttribs()10
GetPropList()10
OpenProperty()11
SetProps()11
DeleteProps()12
SetPropFromSource()13
Usage Guidelines13
Property Value Alignment13
Property Types13
MAPI 1.0 Restrictions14
Error Returns15
Errors returned by functions15
Error Codes returned in lieu of Property Value15

Introduction
Messages, attachments and other objects in MAPI are principally composed of things we call properties. Examples of properties include the subject line of a message, the name of a user, or the body of an attachment. Each property contains a value of interest to the person who reads the message or to a transport that handles a message during delivery. An application uses the IProperty interface, described in this document, to read, write, and modify the properties of MAPI objects.
Opening an object, and thus getting access to this interface, is described in the Messaging Client API document. The same document describes how to release an object, and thus dispose of this interface.
Constants
Property Tags
Properties are referenced by a 32 bit unsigned integer known as the Property Tag. The tag contains two pieces of information. The high order 16 bits contain the Property Type, which indicates the format, such as string or integer, of the property value. The low order 16 bits contain the property ID, which identifies that property. A property may be assigned any ID from 0 to 65535. Pictorially, the property tag is shown below.
3116
150

Type
ID


The following constants and macros allow access to the fields in the tag:
#define PROP_ID_MASK0x0000FFFF// Mask for Property ID

#define PROP_ID(ulPropTag)((ulPropTag) & PROP_ID_MASK)
#define PROP_TYPE(ulPropTag)((ulPropTag) >> 16)

#define PROP_TAG(ulPropType,ulPropID) ((((ULONG)(ulPropType))<<16)|(ulPropID))
Property Types
A Property Type is encoded into the 16 high-order bits of a Property Tag. Constants are defined for each of the recognized types, as described below.
The following table contains the constants used to identify the single value property types in a Property Tag.
Constant
Value
Description

PT_UNSPECIFIED
0x0000
(Reserved for interface use) type doesn't matter to caller

PT_NULL
0x0001
This property has no value

PT_LONG
0x0003
A signed 32-bit value

PT_DOUBLE
0x0005
A floating point double

PT_CURRENCY
0x0006
Signed 64-bit integer interpreted as a decimal number with 4 digits to the right of the decimal point.

PT_BOOLEAN
0x000B
Boolean value (32 bit) (0 is false, non-zero is true)

PT_DATETIME
0x0020
DateTime value. A 64-bit integer which contains the number of 100ns periods since January 1, 1601.

PT_OBJECT
0x0021
An object embedded in a property.

PT_STRING8
0x0022
A null terminated 8-bit character string

PT_WCSTRING
0x0023
A null terminated Unicode string

PT_LONGLONG
0x0024
An unsigned 64-bit integer value

PT_ULONG
0x0025
An unsigned 32-bit integer

PT_GUID
0x0026
A Globally Unique ID (128-bits)

PT_BINARY
0x0027
Uninterpreted (counted byte array)

PT_ERROR
0x00FF
(Reserved for interface use) a 32-bit error value returned in place of an actual value


The following table contains the constants used to identify the multi value property types:
Constant
Value
Description

MV_FLAG
0x0800
Multi value flag

PT_MV_GUID
(MV_FLAG | PT_GUID)
Array of Globally Unique IDs

PT_MV_ULONG
(MV_FLAG | PT_ULONG)
Array of unsigned double words

PT_MV_LONG
(MV_FLAG | PT_LONG)
Array of signed double words

PT_MV_LONGLONG
(MV_FLAG | PT_LONGLONG)
Array of unsigned quad words

PT_MV_DOUBLE
(MV_FLAG | PT_DOUBLE)
Array of floating point doubles

PT_MV_CURRENCY
(MV_FLAG | PT_CURRENCY)
Array of currency values

PT_MV_DATETIME
(MV_FLAG | PT_DATETIME)
Array of DateTime

PT_MV_WCSTRING
(MV_FLAG | PT_WCSTRING)
Array of Unicode strings

PT_MV_STRING8
(MV_FLAG | PT_STRING8)
Array of 8-bit character strings

PT_MV_BOOLEAN
(MV_FLAG | PT_BOOLEAN)
Array of booleans

PT_MV_BINARY
(MV_FLAG | PT_BINARY)
Array of uninterpreted byte arrays


Property Attributes
This is a 32 bit field associated with each property that contains API-enforced flags. On return from a GetAttribs() operation, this field reflects the attributes of the property in question. The following list defines the API-enforced attributes:
#define PROPATTR_MANDATORY(0x00000001)
#define PROPATTR_READABLE(0x00000002)
#define PROPATTR_WRITABLE(0x00000004)

Furthermore, these error values may be returned in place of an attribute value:
#define PROPATTR_NOT_PRESENT(0x40000000)
#define PROPATTR_ERROR(0x80000000)

Where:
PROPATTR_MANDATORY: indicates that the property is mandatory (it cannot be removed).
PROPATTR_READABLE: indicates whether the property is readable (by any process, not just the current one).
PROPATTR_WRITABLE: indicates whether the property is writable (by any process, not just the current one).
PROPATTR_NOT_PRESENT: (returned from the GetAttribs() methods) indicates that the specified property does not exist on the object.
PROPATTR_ERROR: (returned from the GetAttribs() methods) indicates that there was an error accessing the specified property.
Data Structures
Property Tag Array
An array of property tags. The count of items precedes the items.
typedef struct _SPropTagArray {
ULONGcValues;
[size_is(cValues)]ULONGaPropTag[];
} SPropTagArray, far * LPSPropTagArray;

Where:
cValues: indicates the number of property tags in the array.
aPropTag[]: is an array of property tags.
Attribute Array
An array of attributes. The count of attributes precedes the attributes.
typedef struct _SPropAttrArray {
ULONGcValues;
[size_is(cValues)]ULONGaPropAttr[];
} SPropAttrArray, far * LPSPropAttrArray;

Where:
cValues: indicates the number of property attribute descriptors in the array.
aPropAttr[]: is an array of attribute values.
GUID and IID
A Global Unique IDentifier (GUID) is a 16-byte value which uniquely identifies something.
typedef struct GUID
{
BYTE bits[16];
} GUID, far * LPGUID;

An Interface IDentifier (IID) is a GUID which identifies a particular interface to an object:
typedef GUID IID, far * LPIID;
Property Value
A property value structure holds a Property Tag, which identifies the property and its type, along with a value for the property. The value may be directly contained within the structure or may be represented by a pointer to the value, depending on what the type is. Typically short values, such as integers and dates, are contained within the structure itself. Long values, such as strings or arrays of strings, are referenced by a pointer in the structure. When dealing with multiple properties at once the application uses arrays of these property values.
The diagram below illustrates some of the simple property values and how they are stored in the Property Value structure:
EMBED MSDraw \* mergeformat

typedef WCHAR far *WCString;// UNICODE string
typedef char far *LPSTR;// standard windows definition

typedef char CURRENCY[8];// currency value * 10000

typedef __int64 LONGLONG;// 64-bit integer

typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, far *LPFILETIME;

typedef struct _SBinary
{
ULONGcb;
[size_is(cb)]BYTEfar *pb;// -> raw data
} SBinary;

The diagram below illustrates some of the multi-valued properties and how they are contained in the Property Value structure:
EMBED MSDraw \* mergeformat

typedef struct _SULongArray
{
ULONGcValues;
[size_is(cValues)]ULONGfar *pul;
} SULongArray;

typedef struct _SLongArray
{
ULONGcValues;
[size_is(cValues)]LONGfar *pl;
} SLongArray;

typedef struct _SLongLongArray
{
ULONGcValues;
[size_is(cValues)]LONGLONGfar *pll;
} SLongLongArray;


typedef struct _SBooleanArray
{
ULONGcValues;
[size_is(cValues)]ULONGfar *pb;
} SBooleanArray;

typedef struct _SDateTimeArray
{
ULONGcValues;
[size_is(cValues)]FILETIMEfar *pft;
} SDateTimeArray;

typedef struct _SCurrencyArray
{
ULONGcValues;
[size_is(cValues)]CURRENCYfar *pcur;
} SCurrencyArray;

typedef struct _SBinaryArray
{
ULONGcValues;
[size_is(cValues)]SBinaryfar *pbin;
} SBinaryArray;

typedef struct _SDoubleArray
{
ULONGcValues;
[size_is(cValues)]doublefar *pdbl;
} SDoubleArray;

typedef struct _SGUIDArray
{
ULONGcValues;
[size_is(cValues)]GUIDfar *pguid;
} SGUIDArray;

typedef struct _SWCStringArray
{
ULONGcValues;
[size_is(cValues)]WCStringfar *pwcstr;
} SWCStringArray;

typedef struct _SLPSTRArray
{
ULONGcValues;
[size_is(cValues)]LPSTRfar *pstr;
} SLPSTRArray;

Some of the property calls pass multiple values on a single call. Arrays of Property Values are passed in this way.
EMBED MSDraw \* mergeformat

typedef struct _SPropValue
{
ULONG PropTag;

ULONGreserved;

[switch_is (PROP_TYPE(PropTag))]union _PV
{
[case(PT_ULONG)]ULONGul;
[case(PT_LONG)]LONGl;
[case(PT_LONGLONG)]LONGLONGll;
[case(PT_BOOLEAN)]ULONGb;
[case(PT_DATETIME)]FILETIMEft;
[case(PT_CURRENCY)]CURRENCYcur;
[case(PT_BINARY)]SBinarybin;
[case(PT_DOUBLE)]doubledbl;
[case(PT_GUID)]GUID far *pguid;
[case(PT_WCSTRING)]WCStringpwcstr;
[case(PT_STRING8)]LPSTRpstr;
[case(PT_MV_ULONG)]SULongArray mvul;
[case(PT_MV_LONG)]SLongArray mvl;
[case(PT_MV_LONGLONG)]SLongLongArray mvll;
[case(PT_MV_BOOLEAN)]SBooleanArray mvb;
[case(PT_MV_DATETIME)]SDateTimeArray mvdt;
[case(PT_MV_CURRENCY)]SCurrencyArray mvcur;
[case(PT_MV_BINARY)]SBinaryArray mvbin;
[case(PT_MV_DOUBLE)]SDoubleArray mvdbl;
[case(PT_MV_GUID)]SGUIDArray mvpguid;
[case(PT_MV_WCSTRING)]SWCStringArray mvpwcstr;
[case(PT_MV_STRING8)]SLPSTRArray mvpstr;
[case(PT_ERROR)]ULONGerr;// errors go here
[case(PT_NULL, PT_OBJECT)]
[default]ULONGx;// no usable value
} Value;

} SPropValue, far * LPSPropValue;


Where:
PropTag: contains the property ID and type and thus which arm of the union encodes the property value. If MV_FLAG is set, the property type value denotes a multi valued type. If MV_FLAG is clear, the property type value denotes a single value. Furthermore, the type of the multi valued property can be determined by masking out MV_FLAG. See the section on property types for the constant definitions.
Value: is a discriminated union containing the actual value.
HRESULT and SCODE
Most of the methods of IProperty return a 32-bit error value, called an HRESULT, which can be used to access information about what error occurred.
typedef unsigned longHRESULT;

An HRESULT value of 0 indicates no error. From other values one can obtain a status code from a HRESULT variable by using the GetSCode routine, as follows:
typedef unsigned longSCODE;

SCODE scode;
HRESULT hresult;

hresult = arbitrary function call;

if (hresult)
{
scode = GetSCode(hresult);
Display error based on scode;
}
Property Problem
An indication of an error resulting from an attempted property modification or deletion operation.

typedef struct _SPropProblem {
ULONGulIndex;
ULONGulPropTag;
HRESULThresult;
} SPropProblem;

Where:
ulIndex: specifies the index of the tag in the property tag array parameter.
ulPropTag: specifies the property involved.
hresult: specifies the property problem encountered during the update. The status codes associated with the hresult can be one of:
#define PROBLEM_BAD_VALUE1
#define PROBLEM_CANNOT_MODIFY_PROPERTY2
#define PROBLEM_INVALID_TYPE3
#define PROBLEM_NO_SUCH_PROPERTY4
Where:
PROBLEM_BAD_VALUE: indicates that the value did not meet some criteria associated with the value (schema-check failures will return this error).
PROBLEM_CANNOT_MODIFY_PROPERTY: indicates that an attempt was made to modify or delete a property that cannot be modified.
PROBLEM_INVALID_TYPE: indicates that the type of the value was not appropriate for the property, or that an unknown type was specified.
PROBLEM_NO_SUCH_PROPERTY: indicates that the property does not exist.
Property Problem Array
An array of property Problems.

typedef struct _SPropProblemArray {
ULONGcValues;
[size_is(cValues)]SPropProblemaProblem[];
} SPropProblemArray, far * LPSPropProblemArray;

Where:
cValues: indicates the number of property problems in the array.
aProblem: is an array of cValues property problems.
IProperty Interface
The following sections describe the methods available through the IProperty interface. The descriptions are for the caller using the C programming language, where lpObj is a pointer to an open object that supports the IProperty interface.
As a general rule, none of the [out] parameters of these calls can be relied upon if the function returns an error. The values are undefined, and may be implementation dependent when an error is returned.
Release()
This function releases an open object
(*lpObj)->Release([in]lpObj)
object pointerlpObjPointer to the open object

Each object used by the application should eventually be released by calling this function. Releasing an object does not imply the destruction of underlying data, simply that access to the underlying data is no longer needed. The memory buffers used to access the object are freed, and often the subroutines that provide the access as well.
After releasing an object the application must not use the object pointer any more.
GetProps()
This function retrieves the values of one or more properties.
hResult = (*lpObj)->GetProps([in]lpObj, [in]lpPropTagArray, [out]lpcValues, [out]lppPropArray)
object pointerlpObjPointer to the open object
LPSPropTagArraylpPropTagArrayPointer to a counted array of property tags. If this pointer is NULL then all properties are returned.
ULONG far *lpcValuesPointer to a variable in which the number of elements in the lppPropArray parameter is placed. LPSPropValue far*lppPropArrayPointer to a variable in which the address of the returned array of property values is placed.

return valuehResult PROP_E_SECURITY_VIOLATION; PROP_E_NO_PROPERTIES; PROP_W_ERRORS_RETURNED; PROP_E_CALL_FAILED

To get the values of one or more properties the caller sets up a counted array of Property Tags in an SPropTagArray structure. Pass the pointer to the array, and pointers to the variables to be filled in.
The order of the properties in the returned lppPropArray structure exactly matches the order in which the properties were requested in lpPropTagArray.
If the call succeeded overall but access to one or more properties failed, the function returns the warning PROP_W_ERRORS_RETURNED. The calling application should then check the Property Tag of each of the returned properties to determine which ones failed. Those that fail have their Property Type set to PT_ERROR and their value (a ULONG) indicates which error occurred.
If there are no properties, PROP_E_NO_PROPERTIES is returned.
The contents of properties of type PT_OBJECT are to be accessed using the OpenProperty() call (see below). It is not an error to request the value of a property of type PT_OBJECT using GetProps(), but the data in the return SPropValue structure contains no useful information.
The caller must free the returned structure by calling MAPIFreeBuffer(*lppPropArray), but only if the function returns zero or the error PROP_W_ERRORS_RETURNED.
GetAttribs()
This function retrieves the attributes of one or more properties.
hResult = (*lpObj)->GetAttribs([in]lpObj, [in]lpPropTagArray, [out]lppPropAttrArray)
object pointerlpObjPointer to the open object
LPSPropTagArraylpPropTagArrayPointer to a counted array of property tags. Must not be NULL.
LPSPropAttrArray far * lppPropAttrArrayPointer to a variable in which the address of the returned property attribute array is placed.

return valuehResult PROP_E_SECURITY_VIOLATION; PROP_E_NO_PROPERTIES; PROP_W_ERRORS_RETURNED; PROP_E_CALL_FAILED

This call returns attributes describing each of the specified properties. The order of the properties in the returned lppPropAttrArray structure exactly matches the order in which the properties were requested in lpPropTagArray.
If there is a problem such as lack of resources which causes the entire call to fail, an error is returned. If there are no properties, PROP_E_NO_PROPERTIES is returned.
If the call generally succeeds but access to some attributes failed, the function returns the warning PROP_W_ERRORS_RETURNED. The individual errors (PROPATTR_NOT_PRESENT or PROPATTR_ERROR) are found instead of attributes in appropriate positions in the returned array.
There is no corresponding method to modify attributes.
The caller must free the returned structure by calling MAPIFreeBuffer(*lppPropAttrArray), but only if zero or PROP_W_ERRORS_RETURNED is returned by the call.
GetPropList()
This function returns a list of all the properties currently accessible.
hResult = (*lpObj)->GetPropList([in]lpObj, [out]lppPropTagArray)
object pointerlpObjPointer to the open object
LPSPropTagArray far *lppPropTagArrayPointer to a variable in which the address of a counted array of property tags is placed.

return valuehResult PROP_E_SECURITY_VIOLATION; PROP_E_NO_PROPERTIES; PROP_E_CALL_FAILED
The Property Tag for each property is returned by this call. If there are no properties, this method returns PROP_E_NO_PROPERTIES.
The caller must free the returned structure by calling MAPIFreeBuffer(*lppPropTagArray).
OpenProperty()
This method requests that an interface be opened on a property. Most commonly this is used to request a TextStream interface for access to the contents of a large text or binary property.
hResult = (*lpObj)->OpenProperty([in]lpObj, [in]ulPropTag, [in]lpiid, [out]lppUnk)
object pointerlpObjPointer to the open object
ULONGulPropTagThe property tag for the desired property. Only the ID bits of the tag are used; the type bits are ignored.
LPIIDlpiidPointer to the GUID identifying which interface is desired.
LPIUnknown far*lppUnkPointer to a variable where the newly created interface pointer is placed.


return valuehResult PROP_E_SECURITY_VIOLATION; PROP_E_NOT_SUPPORTED; PROP_E_OPEN_FAILURE; PROP_E_CALL_FAILED
This call opens an interface to access a specified property. This is the only way to access a property of type PT_OBJECT, and may be used on other properties depending on the implementation.
Interfaces are identified by an Interface ID ("IID") which is simply a 16-byte constant (a "GUID") assigned to represent the interface.
A particular implementation may limit access to only certain properties or property types, and to specific interfaces on those properties. If a requested interface is not available on the given property the function returns the error PROP_E_NOT_SUPPORTED. If opening the interface simply fails, it returns PROP_E_OPEN_FAILURE.
The caller is responsible for recasting the returned pointer to the one appropriate for the interface. When the caller is done using the opened interface it should be released.
SetProps()
This function sets the value of one or more properties.
hResult = (*lpObj)->SetProps([in]lpObj, [in]cValues, [in]lpPropArray, [out]lppProblems)
object pointerlpObjPointer to the open object
ULONGcValuesThe number of elements in lpPropArray.
LPSPropValuelpPropArrayPointer to the first in an array of property value structures.
LPSPropProblemArray far * lppProblemsPointer to a variable in which the address of a property problem structure is returned. If NULL then no problems are returned even if there is an error.
return valuehResult PROP_E_SECURITY_VIOLATION; PROP_E_MODIFY_FAILURE; PROP_E_CALL_FAILED

This call passes a number of Property Value structures. The Property Tag in each indicates which property is having its value set and the value indicates what should be stored.
If a tag for a nonexistent property is passed, and the implementation supports the creation of new properties, then the new property is added to the object. Depending on the implementation, it is also possible to change the type and value of a stored property at the same time by passing in a Property Tag containing a different type than was previously used with a given Property ID.
If the call fails completely, a non-zero value is returned in hResult.
If the call succeeds overall (returns a zero in hResult), but there are problems with setting some or all of the selected values, and a non-NULL is passed for lppProblems, then a SPropProblemArray structure is returned with details about each problem. For example, if a property type is invalid or not supported, the error PROBLEM_INVALID_TYPE is returned for that property in the lppProblems structure. A call may successfully set some of the requested properties, but not others. Exactly which failed can be determined by looking at the lppProblems structure. The value returned in lppProblems is only valid if 0 is returned in hResult. If an error occurs on the call such that a non-zero value is returned for hResult then the contents of *lppProblems is undefined. In particular, do not use or free the structure if an error occurs on the call.
The caller must free the returned structure by calling MAPIFreeBuffer(*lppProblems), but only if the call succeeded overall.
DeleteProps()
This function deletes the given list of properties.
hResult = (*lpObj)->DeleteProps([in]lpObj, [in]lpPropTagArray, [out]lpProblems)
object pointerlpObjPointer to the open object
LPSPropTagArraylpPropTagArrayPointer to a counted array of property tags. Must not be NULL. The type field in each tag is ignored; only the ID field is used.
LPSPropProblemArray far* lppProblemsPointer to a variable in which the address of a property problem structure will be returned. If NULL then no problem array structure is returned even if there is an error.
return valuehResult PROP_E_SECURITY_VIOLATION; PROP_E_MODIFY_FAILURE; PROP_E_CALL_FAILED
Not all objects allow properties to be deleted. If the call fails completely, a non-zero value is returned in hResult.
If zero is returned in hResult, see the description of the lppProblems structure on SetProps() above. The caller must free the returned structure by calling MAPIFreeBuffer(*lppProblems), but only if a zero is returned in hResult.
SetPropFromSource()
This method is used to set the value of a property by passing an interface to where to the value can be gotten, instead of passing the value itself. Most commonly this is used when setting the contents of a large text or binary property using the data available on an open stream.
hResult = (*lpObj)->SetPropFromSource([in]lpObj, [in]ulPropTag, [in]lpiid, [in]lUnk)
object pointerlpObjPointer to the open object
ULONGulPropTagThe property tag for the property to be set.
LPIIDlpiidThe type of interface passed in lpUnk.
LPIUnknownlpUnkInterface pointer from which the value will be read.
return valuehResult PROP_E_SECURITY_VIOLATION; PROP_E_NOT_SUPPORTED; PROP_E_MODIFY_FAILURE; PROP_E_CALL_FAILED
This method sets the value of a property to the data that is available on the given interface.
Some implementations create a new property, or change the type of an existing property, depending on the Property Tag passed in ulPropTag.
A particular IProperty implementation may limit this operation to particular properties or property types, and to specific types of sources. If a requested operation is not supported, it returns the error PROP_E_NOT_SUPPORTED.
Usage Guidelines
Property Value Alignment
Each Property Value structure is 16 bytes long, with internal 8-byte values aligned in the middle of the structure. This allows users of this interface, on future CPUs where 8-byte alignment for 8-byte values is required (or simply faster) to allocate an array of Property Values on an 8-byte boundary and automatically all internal values have the proper byte-alignment.
Callers of these interfaces who write code on such future CPUs should use memory allocation routines that allocate the SPropValue arrays on 8-byte boundaries.
Property Types
Applications that wish to extend the types of data that can be stored in an object should store their data in properties of type PT_BIANRY. When data is read out of such a property it will be unchanged from how it was stored.
Applications which wish to store simple small properties, such as single character or 16-bit integer, may store them in any appropriately larger property, such as ULONG.
Do not use type codes in the Property Type field of Property Tags that are not defined in this document.
There are situations where a caller may know the Property ID for a particular property, but not its (current) type. In such cases the caller can form a Property Tag for the property from the 16-bit ID and the type code PT_UNSPECIFIED. In the SPropValue array that is returned by GetProps() the Property Tag will contain the correct type code for the value that is returned. This mechanism is simpler than the alternative, which is to read the entire SPropTagArray with GetPropList() and scan it to determine which type code is currently used for the given Property ID.
Similarly to the above, some implementations will support changing the type code associated with a property ID by simply calling SetProps where a Property Tag is formed from the existing 16-bit ID and the new Property Type. For example, some Directory Services might allow changing the Home Phone Number property from PT_WCSTRING (unicode) to PT_MV_WCSTRING (array of unicode) if the user gets two home phone numbers.
The error code property type (PT_ERROR) is reserved for use by the interface. It is returned in a SPropValue array when there is an error accessing an individual property. The error code is contained in the 32-bit value field that is returned.
MAPI 1.0 Restrictions
Applications and service providers for MAPI 1.0 should meet the following restrictions.
Applications designed for wide distribution should not require service providers to support multi-valued properties. Many service providers written for MAPI 1.0 do not support such properties. An application that requires such support may be very useful in certain contexts but only where such support is available.
Some service providers may return multi-valued properties to the application. Therefore, applications designed for wide distribution should not crash if they find a multi-valued property in an object. Service providers to newly developed messaging systems designed specifically for MAPI are more likely to provide such support than service providers written to access existing messaging systems.
Service providers are encouraged to expose strings to the calling application in the character set appropriate to the platform. Thus an application running on a UNICODE platform should see, as a return from GetPropList(), that all text properties are of type PT_WCSTRING. An application running on a platform where strings are terminated by a single 8-bit byte (including DBCS) should see, on the exact same object, that all text properties are of type PT_STRING8. Providers which can thus support both types of platforms can achieve more widespread distribution than providers which can not.
The 16-bit Property ID range in MAPI is divided into ranges. One range of IDs is available for use in custom message classes. These IDs will mean different things in different messages, depending on the message class. Other ranges are reserved. By convention, property IDs 0x0000 and 0xFFFF are never used in any MAPI object.
Error Returns
Errors returned by functions
The following table defines some of the status codes that may be returned by the IProperty interface functions. The errors are returned indirectly by way of hResult. The following codes may be gotten from the hResult:
Error
Value
Description

PROP_E_NO_PROPERTIES
0x0001
No properties are available

PROP_E_SECURITY_VIOLATION
0x0002
A security error occurred. The caller did not have the necessary access rights for this operation.

PROP_E_CALL_FAILED
0x0003
The call failed for reasons such as lack of resources, network crash, or the like -- severe problems that are not directly related to this interface, but which could cause a method to fail.

PROP_W_ERRORS_RETURNED
0x000A
One or more errors occurred during an operation, although the call did not fail completely. For GetProps(), examine the Property Value types for each property to determine which one(s) returned an error. For GetAttribs(), error flags are returned instead of the attributes. For SetProps() and DeleteProps(), examine the returned Property Problem Array.

PROP_E_MODIFY_FAILURE
0x000B
A problem occurred in attempting to set or delete property values.

PROP_E_NOT_SUPPORTED
0x000C
The requested property may not be accessed as requested through the OpenProperty() or SetPropFromSource() call.

PROP_E_OPEN_FAILURE
0x000D
The property could not be opened with the requested interface.


Error Codes returned in lieu of Property Value
In the event of an error during a property retrieval operation, an error value is returned in lieu of the property value. The caller simply examines the property type to see if an error has been returned. The following table defines the status codes that might be returned in the Property Value structure.
Error
Value
Description

PROP_E_SECURITY_VIOLATION
0x0002
The callee does not have the rights to access the requested property.

PROP_E_NONEXISTENT
0x000E
The requested property does not exist.

PROP_E_TOO_BIG
0x000F
The requested property is too large to be accessed by GetProps().

PROP_E_WRITE_ONLY
0x0010
The property is a write-only property and may not be read.

PROP_E_UNEXPECTED_TYPE
0x0011
The type of the property value is not the expected type provided by the caller.


Copyright 1991, 1992 Microsoft Corporation. All Rights Reserved.

Copyright 1991, 1992 Microsoft Corporation. All Rights Reserved.

title Property Interface

title Property Interface

PAGE16

PAGE15

Microsoft Confidential

Microsoft Confidential



x[z}(stuz/stu} stZ:c#DAJ?Ab 8H
p|??@pG,"C`$@A @$X8 H@6JM\981@q(Fa@0" ?@0 _m@?$C7@?-pMO'@h@&H?G)NG"L@?GcM)E.h
"@g0 @/"@``80&@K\f:(8aD0`G il@(CZ&MrEdMicrosoft DrawZ&MrEdnn \
Times New Roman_
&MrEd
&LZt&LZt&MrEdTb--_Q&MrEdTloQ
&
&MrEd~!.Times New Roman-
2
DOUBLE
&
Times New RomanR-2
/}&VGTimes New Roman-2
one of the following2
(Not all possibilities
2
are shown):&V/2
oThe.Times New RomanR-
2
ValueTimes New Romans -2
might be
&

&
Times New RomanR-2
ZO
Value (ULONG)&Ln&MrEdTvsQ&MrEdTQ
&
2
-OValue (DOUBLE)2
OValue (WCString)&L4N&MrEdT<9Q&MrEdTFIQ
&
&L(&MrEdTQ&MrEdT #Q
&
2
OValue (Binary)&L&MrEdTX[Q&MrEdTVSQ
&

2
OValue (GUID).Times New Romans -
2
ULONG2
UNICODE *&Y-&MrEd%yy--&MrEd$aya
&

2
BYTE *
2
?GUID *&5-&MrEd%-&MrEd$-
&
.Times New RomanR-2
!"Unicode String", NULL-terminated&&-&MrEd%-&MrEd$
&
2
[Array of Bytes]
&
2
3GUIDTimes New Roman-2
OOther Values include:
2
=Signed LONG2
BOOLEAN2
Date/Time2
lLONGLONG&R
&MrEdZ&
-)
W&MrEdZ$


!
W
&
Times New RomanR-2
}U
Value (Error).Times New Roman-2

2


Error code2
!2
2
w
Byte Count2
a.Times New RomanR-2
VAn Error value is returned2
8
\in the event of an error2

P(such as non-existent property).@Times New Roman-2
Simple-Value Properties.Times New RomanR-42
;)YA property has Simple-Value if it contains a single scalar data item (such as an integer,22
)Vboolean, etc.) or a simple basic item such as a string, sized array of bytes, or GUID.Times New Roman-2
etc.&/Times New RomanR-2
LProperty Value.Times New Roman-
2
~Property Tag&MrEd'0--4#&&MrEd&-"&:
2
|Value2
u|(64 bits: format2
based on type)
&

&
2

(reserved)&MrEd'0-,#
&
-&MrEd$%*YG|rB\^ru^"System--''r
uWZrz"::.Z&MrEdMicrosoft DrawZ&MrEdC:Helvtica&MrEd
vUv

K

.Times New Roman-2
z}.ATimes New Roman-2


Multi-Value Properties-&MrEd$%4~9oM9&xQ
Times New Roman-2
SWCStringArray&g

&g

&g

&MrEdo
_--bl
&MrEdo
]Zl
&MrEdo
y


v
l

&
&MrEdo
x
{
l
-&MrEd%p





B
l

&MrEd%p
7

a

7

a
7
Ba
l7
a
7
a
7

&
Times New Roman$c-
2
Av
Unicode * 1
2
v
Unicode * 2
2

v
Unicode * n
&
&C--&MrEd$;'-&MrEd%((
&
&
QTimes New Roman-2
A
"Unicode String"Times New Roman$c-2

(NULL-Terminated)
&
&q
&!&MrEdp--s&MrEdmj
&
.Times New Roman-2
Array *Times New Roman$c-
2
UCount--&MrEd$C
C
@i
,C
-&MrEd%Q
,L
,,
&

&
&Uu.Times New RomanT`-
2
fSBinaryArray&MrEdp
--m
Times New Roman-2

SBinary 1&MrEdp
RUm
2
7
SBinary 2&MrEdp
mpm
2
X
SBinary n&MrEdp
R
Om
-&MrEd%q
|

|
|Cm|||&MrEd%q



CmTimes New Roman$c-2
}Times New Roman-2
41
[Array of Bytes]--&MrEd$
5

-&MrEd
%\jF&QE&MrEdY--V&MrEd=@
&
.Times New Roman$c-2

Byte Count.Times New Roman-
2
&A
BYTE *-&MrEd%MM&~o
u&~u&MrEd-&MrEdmp
&
.Times New Roman$c-2
JArray *Times New Roman-
2
Count--&MrEd$A
A
g
A
-&MrEd%O
J
22
&

&
.Times New Roman$c-
2
SULONGArray&i
X&MrEdq
P--Sn
Times New RomanT`-2
8
ULONG 1
&
&MrEdq
PMn
2

ULONG 2&MrEdq
nkn
2

ULONG n&MrEdq
lon
-&MrEd%r



Dn&MrEd%r
*
T
*
T*DTn*T*T*Times New Roman$c-2
VHArrays of doubles,2
Hsigned LONGS, etc.2
Nare also built in this2
:Nfashion.&p
& &MrEd^-a&MrEd[X
&
.Times New RomanT`-2
Array *Times New Roman$c-
2
CCount--&MrEd$B
B
.h
B
-&MrEd%P
K

&
&.Times New Roman-2

SGUIDArray&MrEdr
;--8o
Times New Roman$c-
2

GUID 1&MrEdr
o

2

GUID n&MrEdr
o
-&MrEd%s

8

8E8o88&MrEd%q
O
y
O
yOCymOyOyO&3q
*&3!*&MrEd;-8&MrEd"%
&
.Times New Roman-2
Array *Times New Roman$c-
2
Count--&MrEd$C
VC
i
lC
V-&MrEd%Q
lL
ll
&
.Times New RomanT`-2
9
16 bytes each
&
&4U.Times New Roman$c-2
ione of the following2
(Not all possibilities
2
>Iare shown):&Af2
The.Times New RomanT`-
2
ValueTimes New Roman$c-2
might be
&

&
Times New RomanT`-2
Property Value.Times New Roman$c-
2
gProperty Tag&MrEd]-Y&TX&MrEd\P-TX&i'N
2
pValue2
(64 bits: format2
7based on type)
&

&
2

(reserved)&MrEd]- Y"System--''>>>>>:)3v pppp))))Z&MrEdMicrosoft DrawZ&MrEdXXHelvm)_
&MrEdM#M
&MrEd8--8&MrEd-&MrEdrv~.Times New Roman6-
2
1st Property.
2
dValue.
2
2nd Property.
2
HValue-&MrEd%9u /s'&MrEds--o&&MrEd~.
2
Nth Property.
2
`Value
&
-&MrEd%>9?u{?/Eq2Times New Roman-2
L}&MrEd
%8pTimes New Romanu-2
}Times New Roman-2
0The Property Value here may be a Simple-Value or2
ua Multi-Value.@Times New Romanu-2
Property Value ArrayTimes New Roman-32
OWA Property Value Array is used to describe a collection of properties. Each property in52
\the array is described by a property tag and the actual value (or a pointer to it). Embedded*2
Ewithin the property tag is the type of the property value and its ID.--&MrEd$
Z":Z
Z&MrEd%q##&eTimes New Roman-2
Property
2
PValue Array
&
2
Property Value.Times New Roman-
2
<7Property Tag&MrEda-e&'&MrEd-#&~
2
A6Value2
6(64 bits: format2
Nbased on type)
&

&
&MrEd`-\2
:
(reserved)"System--''t)MSDraw37/
Z&MrEdMicrosoft DrawZ&MrEdnn \
Times New Roman_
&MrEd
&LZt&LZt&MrEdTb--_Q&MrEdTloQ
&
&MrEd~!.Times New Roman-
2
DOUBLE
&
Times New RomanR-2
/}&VGTimes New Roman-2
one of the following2
(Not all possibilities
2
are shown):&V/2
oThe.Times New RomanR-
2
ValueTimes New Romans -2
might be
&

&
Times New RomanR-2
ZO
Value (ULONG)&Ln&MrEdTvsQ&MrEdTQ
&
2
-OValue (DOUBLE)2
OValue (WCString)&L4N&MrEdT<9Q&MrEdTFIQ
&
&L(&MrEdTQ&MrEdT #Q
&
2
OValue (Binary)&L&MrEdTX[Q&MrEdTVSQ
&

2
OValue (GUID).Times New Romans -
2
ULONG2
UNICODE *&Y-&MrEd%yy--&MrEd$aya
&

2
BYTE *
2
?GUID *&5-&MrEd%-&MrEd$-
&
.Times New RomanR-2
!"Unicode String", NULL-terminated&&-&MrEd%-&MrEd$
&
2
[Array of Bytes]
&
2
3GUIDTimes New Roman-2
OOther Values include:
2
=Signed LONG2
BOOLEAN2
Date/Time2
lLONGLONG&R
&MrEdZ&
-)
W&MrEdZ$


!
W
&
Times New RomanR-2
}U
Value (Error).Times New Roman-2

2


Error code2
!2
2
w
Byte Count2
a.Times New RomanR-2
VAn Error value is returned2
8
\in the event of an error2

P(such as non-existent property).@Times New Roman-2
Simple-Value Properties.Times New RomanR-42
;)YA property has Simple-Value if it contains a single scalar data item (such as an integer,22
)Vboolean, etc.) or a simple basic item such as a string, sized array of bytes, or GUID.Times New Roman-2
etc.&/Times New RomanR-2
LProperty Value.Times New Roman-
2
~Property Tag&MrEd'0--4#&&MrEd&-"&:
2
|Value2
u|(64 bits: format2
based on type)
&

&
2

(reserved)&MrEd'0-,#
&
-&MrEd$%*YG|rB\^ru^"System--''r
uWZr
METAFILEPICT3X371/
Z&MrEdMicrosoft DrawZ&MrEdnn \
Times New Roman_
&MrEd
&LZt&LZt&MrEdTb--_Q&MrEdTloQ
&
&MrEd~!.Times New Roman-
2
DOUBLE
&
Times New RomanR-2
/}&VGTimes New Roman-2
one of the following2
(Not all possibilities
2
are shown):&V/2
oThe.Times New RomanR-
2
ValueTimes New Romans -2
might be
&

&
Times New RomanR-2
ZO
Value (ULONG)&Ln&MrEdTvsQ&MrEdTQ
&
2
-OValue (DOUBLE)2
OValue (WCString)&L4N&MrEdT<9Q&MrEdTFIQ
&
&L(&MrEdTQ&MrEdT #Q
&
2
OValue (Binary)&L&MrEdTX[Q&MrEdTVSQ
&

2
OValue (GUID).Times New Romans -
2
ULONG2
UNICODE *&Y-&MrEd%yy--&MrEd$aya
&

2
BYTE *
2
?GUID *&5-&MrEd%-&MrEd$-
&
.Times New RomanR-2
!"Unicode String", NULL-terminated&&-&MrEd%-&MrEd$
&
2
[Array of Bytes]
&
2
3GUIDTimes New Roman-2
OOther Values include:
2
=Signed LONG2
BOOLEAN2
Date/Time2
lLONGLONG&R
&MrEdZ&
-)
W&MrEdZ$


!
W
&
Times New RomanR-2
}U
Value (Error).Times New Roman-2

2


Error code2
!2
2
w
Byte Count2
a.Times New RomanR-2
VAn Error value is returned2
8
\in the event of an error2

P(such as non-existent property).@Times New Roman-2
Simple-Value Properties.Times New RomanR-42
;)YA property has Simple-Value if it contains a single scalar data item (such as an integer,22
)Vboolean, etc.) or a simple basic item such as a string, sized array of bytes, or GUID.Times New Roman-2
etc.&/Times New RomanR-2
LProperty Value.Times New Roman-
2
~Property Tag&MrEd'0--4#&&MrEd&-"&:
2
|Value2
u|(64 bits: format2
based on type)
&

&
2

(reserved)&MrEd'0-,#
&
-&MrEd$%*YG|rB\^ru^"System--''r
uWZrDMSDraw`":.
Z&MrEdMicrosoft DrawZ&MrEdC:Helvtica&MrEd
vUv

K

.Times New Roman-2
z}.ATimes New Roman-2


Multi-Value Properties-&MrEd$%4~9oM9&xQ
Times New Roman-2
SWCStringArray&g

&g

&g

&MrEdo
_--bl
&MrEdo
]Zl
&MrEdo
y


v
l

&
&MrEdo
x
{
l
-&MrEd%p





B
l

&MrEd%p
7

a

7

a
7
Ba
l7
a
7
a
7

&
Times New Roman$c-
2
Av
Unicode * 1
2
v
Unicode * 2
2

v
Unicode * n
&
&C--&MrEd$;'-&MrEd%((
&
&
QTimes New Roman-2
A
"Unicode String"Times New Roman$c-2

(NULL-Terminated)
&
&q
&!&MrEdp--s&MrEdmj
&
.Times New Roman-2
Array *Times New Roman$c-
2
UCount--&MrEd$C
C
@i
,C
-&MrEd%Q
,L
,,
&

&
&Uu.Times New RomanT`-
2
fSBinaryArray&MrEdp
--m
Times New Roman-2

SBinary 1&MrEdp
RUm
2
7
SBinary 2&MrEdp
mpm
2
X
SBinary n&MrEdp
R
Om
-&MrEd%q
|

|
|Cm|||&MrEd%q



CmTimes New Roman$c-2
}Times New Roman-2
41
[Array of Bytes]--&MrEd$
5

-&MrEd
%\jF&QE&MrEdY--V&MrEd=@
&
.Times New Roman$c-2

Byte Count.Times New Roman-
2
&A
BYTE *-&MrEd%MM&~o
u&~u&MrEd-&MrEdmp
&
.Times New Roman$c-2
JArray *Times New Roman-
2
Count--&MrEd$A
A
g
A
-&MrEd%O
J
22
&

&
.Times New Roman$c-
2
SULONGArray&i
X&MrEdq
P--Sn
Times New RomanT`-2
8
ULONG 1
&
&MrEdq
PMn
2

ULONG 2&MrEdq
nkn
2

ULONG n&MrEdq
lon
-&MrEd%r



Dn&MrEd%r
*
T
*
T*DTn*T*T*Times New Roman$c-2
VHArrays of doubles,2
Hsigned LONGS, etc.2
Nare also built in this2
:Nfashion.&p
& &MrEd^-a&MrEd[X
&
.Times New RomanT`-2
Array *Times New Roman$c-
2
CCount--&MrEd$B
B
.h
B
-&MrEd%P
K

&
&.Times New Roman-2

SGUIDArray&MrEdr
;--8o
Times New Roman$c-
2

GUID 1&MrEdr
o

2

GUID n&MrEdr
o
-&MrEd%s

8

8E8o88&MrEd%q
O
y
O
yOCymOyOyO&3q
*&3!*&MrEd;-8&MrEd"%
&
.Times New Roman-2
Array *Times New Roman$c-
2
Count--&MrEd$C
VC
i
lC
V-&MrEd%Q
lL
ll
&
.Times New RomanT`-2
9
16 bytes each
&
&4U.Times New Roman$c-2
ione of the following2
(Not all possibilities
2
>Iare shown):&Af2
The.Times New RomanT`-
2
ValueTimes New Roman$c-2
might be
&

&
Times New RomanT`-2
Property Value.Times New Roman$c-
2
gProperty Tag&MrEd]-Y&TX&MrEd\P-TX&i'N
2
pValue2
(64 bits: format2
7based on type)
&

&
2

(reserved)&MrEd]- Y"System--''>>>>>
METAFILEPICT:hH":.
Z&MrEdMicrosoft DrawZ&MrEdC:Helvtica&MrEd
vUv

K

.Times New Roman-2
z}.ATimes New Roman-2


Multi-Value Properties-&MrEd$%4~9oM9&xQ
Times New Roman-2
SWCStringArray&g

&g

&g

&MrEdo
_--bl
&MrEdo
]Zl
&MrEdo
y


v
l

&
&MrEdo
x
{
l
-&MrEd%p





B
l

&MrEd%p
7

a

7

a
7
Ba
l7
a
7
a
7

&
Times New Roman$c-
2
Av
Unicode * 1
2
v
Unicode * 2
2

v
Unicode * n
&
&C--&MrEd$;'-&MrEd%((
&
&
QTimes New Roman-2
A
"Unicode String"Times New Roman$c-2

(NULL-Terminated)
&
&q
&!&MrEdp--s&MrEdmj
&
.Times New Roman-2
Array *Times New Roman$c-
2
UCount--&MrEd$C
C
@i
,C
-&MrEd%Q
,L
,,
&

&
&Uu.Times New RomanT`-
2
fSBinaryArray&MrEdp
--m
Times New Roman-2

SBinary 1&MrEdp
RUm
2
7
SBinary 2&MrEdp
mpm
2
X
SBinary n&MrEdp
R
Om
-&MrEd%q
|

|
|Cm|||&MrEd%q



CmTimes New Roman$c-2
}Times New Roman-2
41
[Array of Bytes]--&MrEd$
5

-&MrEd
%\jF&QE&MrEdY--V&MrEd=@
&
.Times New Roman$c-2

Byte Count.Times New Roman-
2
&A
BYTE *-&MrEd%MM&~o
u&~u&MrEd-&MrEdmp
&
.Times New Roman$c-2
JArray *Times New Roman-
2
Count--&MrEd$A
A
g
A
-&MrEd%O
J
22
&

&
.Times New Roman$c-
2
SULONGArray&i
X&MrEdq
P--Sn
Times New RomanT`-2
8
ULONG 1
&
&MrEdq
PMn
2

ULONG 2&MrEdq
nkn
2

ULONG n&MrEdq
lon
-&MrEd%r



Dn&MrEd%r
*
T
*
T*DTn*T*T*Times New Roman$c-2
VHArrays of doubles,2
Hsigned LONGS, etc.2
Nare also built in this2
:Nfashion.&p
& &MrEd^-a&MrEd[X
&
.Times New RomanT`-2
Array *Times New Roman$c-
2
CCount--&MrEd$B
B
.h
B
-&MrEd%P
K

&
&.Times New Roman-2

SGUIDArray&MrEdr
;--8o
Times New Roman$c-
2

GUID 1&MrEdr
o

2

GUID n&MrEdr
o
-&MrEd%s

8

8E8o88&MrEd%q
O
y
O
yOCymOyOyO&3q
*&3!*&MrEd;-8&MrEd"%
&
.Times New Roman-2
Array *Times New Roman$c-
2
Count--&MrEd$C
VC
i
lC
V-&MrEd%Q
lL
ll
&
.Times New RomanT`-2
9
16 bytes each
&
&4U.Times New Roman$c-2
ione of the following2
(Not all possibilities
2
>Iare shown):&Af2
The.Times New RomanT`-
2
ValueTimes New Roman$c-2
might be
&

&
Times New RomanT`-2
Property Value.Times New Roman$c-
2
gProperty Tag&MrEd]-Y&TX&MrEd\P-TX&i'N
2
pValue2
(64 bits: format2
7based on type)
&

&
2

(reserved)&MrEd]- Y"System--''>>>>>tMSDraw)3Z&MrEdMicrosoft DrawZ&MrEdXXHelvm)_
&MrEdM#M
&MrEd8--8&MrEd-&MrEdrv~.Times New Roman6-
2
1st Property.
2
dValue.
2
2nd Property.
2
HValue-&MrEd%9u /s'&MrEds--o&&MrEd~.
2
Nth Property.
2
`Value
&
-&MrEd%>9?u{?/Eq2Times New Roman-2
L}&MrEd
%8pTimes New Romanu-2
}Times New Roman-2
0The Property Value here may be a Simple-Value or2
ua Multi-Value.@Times New Romanu-2
Property Value ArrayTimes New Roman-32
OWA Property Value Array is used to describe a collection of properties. Each property in52
\the array is described by a property tag and the actual value (or a pointer to it). Embedded*2
Ewithin the property tag is the type of the property value and its ID.--&MrEd$
Z":Z
Z&MrEd%q##&eTimes New Roman-2
Property
2
PValue Array
&
2
Property Value.Times New Roman-
2
<7Property Tag&MrEda-e&'&MrEd-#&~
2
A6Value2
6(64 bits: format2
Nbased on type)
&

&
&MrEd`-\2
:
(reserved)"System--''
METAFILEPICT)3/)3vZ&MrEdMicrosoft DrawZ&MrEdXXHelvm)_
&MrEdM#M
&MrEd8--8&MrEd-&MrEdrv~.Times New Roman6-
2
1st Property.
2
dValue.
2
2nd Property.
2
HValue-&MrEd%9u /s'&MrEds--o&&MrEd~.
2
Nth Property.
2
`Value
&
-&MrEd%>9?u{?/Eq2Times New Roman-2
L}&MrEd
%8pTimes New Romanu-2
}Times New Roman-2
0The Property Value here may be a Simple-Value or2
ua Multi-Value.@Times New Romanu-2
Property Value ArrayTimes New Roman-32
OWA Property Value Array is used to describe a collection of properties. Each property in52
\the array is described by a property tag and the actual value (or a pointer to it). Embedded*2
Ewithin the property tag is the type of the property value and its ID.--&MrEd$
Z":Z
Z&MrEd%q##&eTimes New Roman-2
Property
2
PValue Array
&
2
Property Value.Times New Roman-
2
<7Property Tag&MrEda-e&'&MrEd-#&~
2
A6Value2
6(64 bits: format2
Nbased on type)
&

&
&MrEd`-\2
:
(reserved)"System--''
jkuv|}HR';]jk
z

|2>BS.COS]ls
$




$
$
H$|F "!">"?"@"A"r's'''''],d,--F/Q/:1A111111122f3333m4455555566888 8%8*8+8<8A8X:_:d:i:l:u:z::::::::::::;;
FF<
B
BtJ;;;;;;;E>H@V@@@LA[A\AhAiABBBBB'B,B1B8BFBNB^B_BpBuBBBCCwCzCCCiDyDDDGGG!G"GGGGGGGGGGHHHHLH[HHHHHIIIIInJxJJJJJJJJJJJK
KKKK*K/KRK
bRK[KKK#L)LvLzLLLwP~PPPPPPPPPPPPPPPPQQ-Q8QHQSQQQaRhR&U-U`UgUUUVVMWXWzWWWWWWWXX%XXXXXXHYOYTYYY\YhYmYrYyYYYYYYYYYZZO[V[\\-\4\Q\\\j\t\\\\\\\\.^
b.^5^:^?^B^T^Y^^^e^n^u^z^^^^^^^^^_$_)_7_<___``g%gggnnrrrrrrtuou{uuuuuvvvvxxyyzz{E{G{H{N{O{a{b{h{i{o{p{{{{{{{{{{{{{{{{{{{P^Yjku 2G[u+H[uk
(#$(#$(#(#m((#(#(#$(#&
@$$$&

1%.

1%.2k
r
x
z





Gy{t



Y
[
d
l

iLl'd
t"

l'd
t"







}P$(#$(#(# (#$(#l0*







#Sl0*
#XB
SB











_amu(*5=`bnv&BDMUvxl'd
t"




l'd
t"

}}Pl'd
t"

5|%EGSh)B\^n*,;Sfhvl'd
t"

l'd
t"

l'd
t"







h
P$(#$(#4<>A.BR~6ackTil}%Y$(# (#8,(#,(# (# (#xH (#8(#m-(#~-(#z (#xH$(#`(#$(#l'd
t"




3Y* d f !!;!=!V!Y!f!!!! "C"E"b"e"w"""""""###3#6#H#p##########$$*$R$e$g$$$$$$$$$
%5% (#H(#(#$(#%(#B (# (#x$ (# (#@ (#@ (#%(#]$(#A5%F%H%f%i%{%%%%%%%&&&=&@&R&}&&&&&&&&&r'''''''''((1(L(p((((()@)h))))*H*z***+@+v+++ (#xT$ (#x2

(#xh2
(#x2
\
(#x2
(#$(#(# (#(#<++ ,+,-,P,R,T,\,-..A....////////00,0L0O0a0000011/1119111;2Y22222e33l44}-(#-(#z-(#z,(# (#,(#z,(#
(#p@ (#p (#8$(#(#,(#,(#J$(#(#x2
(#x2
(#xT$144445%5S5555566
7778-8^8`89
::X:::t;i??AAABaBBBzC|CCCDEFFiGxGGH7HHHIIV(#$(#p$(#eV(#VV(#$(#@$(#V(#$(#@$(#$(#$(#(#m,(#,(# (#$(#(#:IIJJKLKKLvLyL|LLM6NO2P>PwPPQ;QQTRRReST0UXYYHYYYpZB[[\\].^^^^,_t__G``aaaYccddef?h$(#5(#m$(#$(#$(#e$(#p$(#$(#V(#$(#$(#$(#V(#VV(#V(#$(#@$(#(#$(#:?hijjIklnkpqqqrrrrrrrss4s
$l'VN.#

l'VN.#







$$e$$(#(#m$(# $(#$(#(#$(#$(#tvvv"vgvivvvvvwwXwZw\wwxxxxtoicYO$$$(#(#@$(#l'VN.#




l'VN.#

$$$e$l'VN.#

$xxxxFyHy\ydyyyyyyyyzCzEz]zezzzzz{E{wZULGB(#$(#l'N.#




$l'N.#

$l'N.#

$$e$l'N.#







E{G{d{f{{{{{{{{{{{{{$(#(#(#!AbstractBodyBody Sub Sub SubTitleBody Sub
Body Sub-HangBody Sub Sub
AnnotationTable EntryTable Label
Table HeadAnnotation BoxBylineIllustrationTable Entry - SmallTable Head - SmallFigureTable Label - Small
PseudocodeTitle LargeTitle MediumTitle Small
Time StampLogoBody Sub Sub-HangCaptionTable LableTerm DefinitionPicture ParagraphTable Lable -SmallCode
Method ClauseMethod HeadingAnnotation PublicNormal ParagraphNormal PictureBullet 1Bullet 2Enumerate 1Enumerate 1 subAlgorithmEXB1B2B3B4TIRNRHheader trailKeepNextHKPTPBPB2graphicPAPCPRPGPQPDPMHMPHPLPWtablePNPIPFPYListNumListOneTwoCenter1FuncItemize 1twoItemize 2Itemize 3declItemize (top level)Itemize 4
Description 2
Description 1Itemize 2 no blankItemize 3 no blankPPBoxCode (first)PrototypeXXXFuncTopLarry
Computer Type
List Bullet 1
List Bullet 2FuncProtoParmValHeadFuncProtoParmValList noBullet 1List noBullet 2FuncProtoParmHeaderCover: Group NameboxentryNote 1Note 2List Name 1
List Bullet 3
List Bullet 4Normal (keep next)FuncProtoHeaderFuncProtoParm 1FuncProtoParm 2FuncProtoRetVal
Title NameTitle AuthorTitle RevisionNormal (hidden)List Term 1Code ExampleChar DrawingTypeListTNQ1Q2Q4Q5Q6Q7B5D1D2D3RTP1P2C1C2C3C4C5H1H2H3E0E1E2E3E4E5A1A2A3RFFIQ3HiddenCreditsDescription 2 (last)Method Clause 2Method ListCode 1IssueFFF
B
$0BBB@@D DD0(@@@@@F@@@@@@@@@@D
DDL DDD
DDDDDDDDDDDDDDDDFFFBBBBBBBBBBBBBBBBBBBBBDDFFFFFFFBBB


v



@
p

X J
p


8

h:@(#V
V@x&*
hx&*
x
&*8
F :
@@"@x:
@@ @!@h8p@@@@@@h8p@@@@@@@px@px
$

@"@
L x@!`:&xHP "h@B@B @B!@B#@@ @!@$%&+x
'(bB)x:*8,,Hd!(#
+,0-.p0/@0
0H
12@!3h<$
45678
8p9:;<8(=>?@ABp`pC
DE8FG@0@HhIJ
K0LM8NO8P
Qpx
RSxXx
TU@Vx
X<
Y`Z@[&'()\h]hx
^x
_`&'()ab0c`defg
h
ij@(*10k@@l@mn00o pq@rst@
u
v
w
xy@4z@#@
@{|@}~p0xppp`px&(xxpxp@x@xpxpp`xpx f

3 6

PS
m p#
=@
Zv&p`xp@&`xP)`xP !$8
/
xHP N
/p xHP N
8xx$$

!! #$%$&'&)((*+,-./012367879:;<=>?@ABCDEFGHIJKJLMOPQORQSPOURVQWVXQYRZ[$\ ]^NN`abcdefghijklmnopqrstuvwxyz{|}~V!! $_]z{||__
a! Z#'/\67@uHQ~[f6p]z 0"
&v
F$;RK.^P^k

Y5%+4I?htxE{{TimesSymbol"Helvetica
ChicagoNew YorkGenevaMonacoVeniceZapf DingbatsITC Bookman LightPalatinoZapf ChanceryTimes"Helvetica
1CourierMobileNew Century SchlbkImagesGray ChicagoITC GaramondMicroBostonMicroSoft&ArialTimes New Roman5Courier NewRZapfDingbatsAeriel1LinePrinterArielCG Times (WN).ADV`[Trt %&&]z
:::$!!?LogoMade_From_Template2Version_3TableOfContentsPropTypes-?y^
?yHP LaserJet IIISi PostScriptLPT1:pscriptHP LaserJet IIISi PostScript
VD[
od,XZZ^e>

Yi#,hz%T,%;*4RvProperty InterfaceIPropertyProperty, IPropertyIThis document describes the property-related interfaces of Windows Cairo.
Lester Waters
Rick Segal


 December 17, 2017  Add comments

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)