You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
4.5 KiB
193 lines
4.5 KiB
/*+--------------------------------------------------------------------------
|
|
*
|
|
* Microsoft Windows
|
|
* Copyright (C) Microsoft Corporation, 1993
|
|
*
|
|
* File: propset.h
|
|
*
|
|
* Contents: OLE Appendix B property set structure definitions
|
|
*
|
|
---------------------------------------------------------------------------*/
|
|
|
|
#ifndef _PROPSET_HXX_
|
|
#define _PROPSET_HXX_
|
|
#include "propmac.hxx"
|
|
|
|
/* CBMAXPROPSETSTREAM must be a power of 2.*/
|
|
#define CBMAXPROPSETSTREAM (256 * 1024)
|
|
|
|
/* this is the 'correct' value of 0xFFFE */
|
|
#define PROPSET_BYTEORDER 0xFFFE
|
|
|
|
/* Defines for the high order WORD of dwOSVer:*/
|
|
|
|
#define OSKIND_WINDOWS 0x0000
|
|
#define OSKIND_MACINTOSH 0x0001
|
|
#define OSKIND_WIN32 0x0002
|
|
#define OSKIND_REF 0x0003
|
|
|
|
typedef struct tagFORMATIDOFFSET
|
|
{
|
|
FMTID fmtid;
|
|
DWORD dwOffset;
|
|
} FORMATIDOFFSET;
|
|
|
|
#define CB_FORMATIDOFFSET sizeof(FORMATIDOFFSET)
|
|
|
|
|
|
typedef struct tagPROPERTYSETHEADER /* ph*/
|
|
{
|
|
WORD wByteOrder; /* Always 0xfffe*/
|
|
WORD wFormat; /* Always 0*/
|
|
DWORD dwOSVer; /* System version*/
|
|
CLSID clsid; /* Application CLSID*/
|
|
DWORD reserved; /* reserved (must be at least 1)*/
|
|
} PROPERTYSETHEADER;
|
|
|
|
#define CB_PROPERTYSETHEADER sizeof(PROPERTYSETHEADER)
|
|
|
|
|
|
typedef struct tagPROPERTYIDOFFSET /* po*/
|
|
{
|
|
DWORD propid;
|
|
DWORD dwOffset;
|
|
} PROPERTYIDOFFSET;
|
|
|
|
#define CB_PROPERTYIDOFFSET sizeof(PROPERTYIDOFFSET)
|
|
|
|
// use these 2 member accessors for unaligned pointers
|
|
// NOTE: these functions need to be changed manually when the structures
|
|
// are changed.
|
|
|
|
inline DWORD PIDOFFSET_GetPropid(PROPERTYIDOFFSET UNALIGNED *ppo)
|
|
{
|
|
#if i386 == 0
|
|
DWORD dwResult;
|
|
memcpy(&dwResult,
|
|
Add2Ptr(ppo, FIELD_OFFSET(PROPERTYIDOFFSET, propid)),
|
|
sizeof(DWORD));
|
|
return dwResult;
|
|
#else
|
|
return ppo->propid;
|
|
#endif
|
|
}
|
|
|
|
inline DWORD PIDOFFSET_GetOffset(PROPERTYIDOFFSET UNALIGNED *ppo)
|
|
{
|
|
#if i386==0
|
|
DWORD dwResult;
|
|
memcpy(&dwResult,
|
|
Add2Ptr(ppo, FIELD_OFFSET(PROPERTYIDOFFSET, dwOffset)),
|
|
sizeof(DWORD));
|
|
return dwResult;
|
|
#else
|
|
return ppo->dwOffset;
|
|
#endif
|
|
}
|
|
|
|
typedef struct tagPROPERTYSECTIONHEADER /* sh*/
|
|
{
|
|
DWORD cbSection;
|
|
DWORD cProperties;
|
|
PROPERTYIDOFFSET rgprop[1];
|
|
} PROPERTYSECTIONHEADER;
|
|
|
|
#define CB_PROPERTYSECTIONHEADER FIELD_OFFSET(PROPERTYSECTIONHEADER, rgprop)
|
|
typedef struct tagSERIALIZEDPROPERTYVALUE /* prop*/
|
|
{
|
|
DWORD dwType;
|
|
BYTE rgb[1];
|
|
} SERIALIZEDPROPERTYVALUE;
|
|
|
|
#define CB_SERIALIZEDPROPERTYVALUE FIELD_OFFSET(SERIALIZEDPROPERTYVALUE, rgb)
|
|
|
|
inline DWORD SPV_GetType(const SERIALIZEDPROPERTYVALUE *pprop)
|
|
{
|
|
#if i386==0
|
|
DWORD dwResult; /* use temp var because it might not be aligned */
|
|
memcpy(&dwResult,
|
|
Add2Ptr(pprop, FIELD_OFFSET(SERIALIZEDPROPERTYVALUE, dwType)),
|
|
sizeof(DWORD));
|
|
return dwResult;
|
|
#else
|
|
return pprop->dwType;
|
|
#endif
|
|
}
|
|
|
|
inline BYTE* SPV_GetRgb(const SERIALIZEDPROPERTYVALUE *pprop)
|
|
{
|
|
return (BYTE*) Add2Ptr(pprop, CB_SERIALIZEDPROPERTYVALUE);
|
|
}
|
|
|
|
typedef struct tagENTRY /* ent*/
|
|
{
|
|
DWORD propid;
|
|
DWORD cch; /* Includes trailing '\0' or L'\0'*/
|
|
char sz[1]; /* WCHAR if UNICODE CodePage*/
|
|
} ENTRY;
|
|
|
|
#define CB_ENTRY FIELD_OFFSET(ENTRY, sz)
|
|
|
|
inline DWORD ENTRY_GetPropid(const ENTRY *pent)
|
|
{
|
|
#if i386 == 0
|
|
DWORD dwResult; /* use temp var because it might not be aligned */
|
|
memcpy(&dwResult,
|
|
Add2Ptr(pent, FIELD_OFFSET(ENTRY, propid)),
|
|
sizeof(DWORD));
|
|
return dwResult;
|
|
#else
|
|
return pent->propid;
|
|
#endif
|
|
}
|
|
|
|
inline void ENTRY_SetPropid(ENTRY *pent, DWORD propid)
|
|
{
|
|
#if i386 == 0
|
|
memcpy(Add2Ptr(pent, FIELD_OFFSET(ENTRY, propid)),
|
|
&propid, sizeof(DWORD));
|
|
#else
|
|
pent->propid = propid;
|
|
#endif
|
|
}
|
|
|
|
inline DWORD ENTRY_GetCch(const ENTRY *pent)
|
|
{
|
|
#if i386 == 0
|
|
DWORD dwResult; /* use temp var because it might not be aligned */
|
|
memcpy(&dwResult,
|
|
Add2Ptr(pent, FIELD_OFFSET(ENTRY, cch)),
|
|
sizeof(DWORD));
|
|
return dwResult;
|
|
#else
|
|
return pent->cch;
|
|
#endif
|
|
}
|
|
|
|
inline void ENTRY_SetCch(ENTRY *pent, DWORD cch)
|
|
{
|
|
#if i386 == 0
|
|
memcpy(Add2Ptr(pent, FIELD_OFFSET(ENTRY, cch)),
|
|
&cch, sizeof(DWORD));
|
|
#else
|
|
pent->cch = cch;
|
|
#endif
|
|
}
|
|
|
|
inline char* ENTRY_GetSz(const ENTRY *pent)
|
|
{
|
|
// note: since sz is an array, doing pent->sz is okay even when pent is
|
|
// not aligned properly
|
|
|
|
return (char*) Add2Ptr(pent, CB_ENTRY);
|
|
}
|
|
|
|
typedef struct tagDICTIONARY /* dy*/
|
|
{
|
|
DWORD cEntries;
|
|
ENTRY rgEntry[1];
|
|
} DICTIONARY;
|
|
|
|
#define CB_DICTIONARY FIELD_OFFSET(DICTIONARY, rgEntry)
|
|
|
|
#endif /* _PROPSET_HXX_*/
|