读取STGMEDIUM中的数据

该数据结构用在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);
                }
原文地址:https://www.cnblogs.com/kwliu/p/2851102.html