IDESCRIP.CPP
/* 
 * IDESCRIP.CPP 
 * Link Source Chapter 9 
 * 
 * Implementation the IDescription interface that doesn't care 
 * what object it works with in this LinkSource sample.  It 
 * is given a storage in which it expects to find a stream 
 * called "Description" containing the text relevant to the 
 * object showing the instance of this interface. 
 * 
 * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved 
 * 
 * Kraig Brockschmidt, Microsoft 
 * Internet  :  kraigb@microsoft.com 
 * Compuserve:  >INTERNET:kraigb@microsoft.com 
 */ 
 
 
#include "linksrc.h" 
 
/* 
 * CImpIDescription:CImpIDescription 
 * CImpIDescription::~CImpIDescription 
 * CImpIDescription::QueryInterface 
 * CImpIDescription::AddRef 
 * CImpIDescription::Release 
 * 
 * Basic object members. 
 */ 
 
CImpIDescription::CImpIDescription(LPUNKNOWN pUnkOuter) 
    { 
    m_cRef=0; 
    m_pUnkOuter=pUnkOuter; 
    m_pIStorage=NULL; 
    return; 
    } 
 
CImpIDescription::~CImpIDescription(void) 
    { 
    return; 
    } 
 
STDMETHODIMP CImpIDescription::QueryInterface(REFIID riid 
    , LPVOID *ppv) 
    { 
    return m_pUnkOuter->QueryInterface(riid, ppv); 
    } 
 
STDMETHODIMP_(ULONG) CImpIDescription::AddRef(void) 
    { 
    ++m_cRef; 
    return m_pUnkOuter->AddRef(); 
    } 
 
STDMETHODIMP_(ULONG) CImpIDescription::Release(void) 
    { 
    --m_cRef; 
    return m_pUnkOuter->Release(); 
    } 
 
 
/* 
 * CImpIDescription::GetText 
 * 
 * Purpose: 
 *  Fills a buffer with our text description. 
 * 
 * Parameters: 
 *  pszText         LPOLESTR to the buffer to fill 
 *  cch             ULONG specifying the length of pszText 
 * 
 * Return Value: 
 *  HRESULT         NOERROR if successful, error otherwise. 
 */ 
 
HRESULT CImpIDescription::GetText(LPOLESTR pszText, ULONG cch) 
    { 
    HRESULT     hr; 
    IStream    *pIStream; 
 
    /* 
     * The description text for this object is contained in 
     * a stream called "Description" (constant SZDESCRIPTION 
     * has this string) found in whatever storage we happen 
     * to have.  This implementation is ignorant of the actual 
     * object that is exposing it. 
     */ 
 
    if (NULL==m_pIStorage) 
        return ResultFromScode(E_FAIL); 
 
    hr=m_pIStorage->OpenStream(SZDESCRIPTION, 0, STGM_DIRECT 
        | STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &pIStream); 
 
    if (FAILED(hr)) 
        return ResultFromScode(E_FAIL); 
 
   #ifdef WIN32ANSI 
    char sz[512]; 
    hr=pIStream->Read((void *)sz, cch*sizeof(TCHAR), NULL); 
MultiByteToWideChar(CP_ACP, 0, sz, -1, pszText, cch);     
   #else 
    hr=pIStream->Read((void *)pszText, cch*sizeof(WCHAR), NULL); 
   #endif 
    pIStream->Release(); 
 
    return SUCCEEDED(hr) ? NOERROR : ResultFromScode(E_FAIL); 
    } 
 
 
 
 
/* 
 * (Internal) 
 * CImpIDescription::SetStorage 
 * 
 * Purpose: 
 *  Provides objects using this interface implementation to 
 *  inform us of the storage in which to look for the 
 *  description stream. 
 * 
 * Parameters: 
 *  pIStorage       IStorage * to hold. 
 * 
 * Return Value: 
 *  None 
 */ 
 
void CImpIDescription::SetStorage(IStorage *pIStorage) 
    { 
    /* 
     * This may be the root storage for the File object, the 
     * sub-storage for the first level object, or a sub-storage 
     * for a second-level object.  Since the object exposing 
     * this interface holds the storage itself, no AddRef is 
     * required. 
     */ 
    m_pIStorage=pIStorage; 
    return; 
    }