该数据结构用在COM对象之间传递使用, 头文件中定义的数据结构如下:
typedef struct tagSTGMEDIUM { DWORD tymed; /* [switch_is][switch_type] */ union { /* [case()] */ HBITMAP hBitmap; /* [case()] */ HMETAFILEPICT hMetaFilePict; /* [case()] */ HENHMETAFILE hEnhMetaFile; /* [case()] */ HGLOBAL hGlobal; /* [case()] */ LPOLESTR lpszFileName; /* [case()] */ IStream *pstm; /* [case()] */ IStorage *pstg; /* [default] */ /* Empty union arm */ } ; /* [unique] */ IUnknown *pUnkForRelease; } uSTGMEDIUM;
该结构通过 tymed来表示 联合体中的那个数据成员有效,取值可以如下:
typedef [transmit_as(long)] enum tagTYMED { TYMED_HGLOBAL = 1, TYMED_FILE = 2, TYMED_ISTREAM = 4, TYMED_ISTORAGE = 8, TYMED_GDI = 16, TYMED_MFPICT = 32, TYMED_ENHMF = 64, TYMED_NULL = 0 } TYMED;
TYMED_FILE表示STGMEDIUM中的lpszFileName有效, 其他与此类似,可以参看msdn来
如果数据是一个TYMED_HGLOBAL , 可以通过如下读取:
DWORD dwDataLength = pBindInfo->cbstgmedData; if (pBindInfo->stgmedData.tymed & TYMED_HGLOBAL) { char* pSrc = (char*)::GlobalLock(pBindInfo->stgmedData.hGlobal); m_pCallback->SetPostData(pSrc, dwDataLength); ::GlobalUnlock(pBindInfo->stgmedData.hGlobal); }