IPS.CPP
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:15k
源码类别:
Windows编程
开发平台:
Visual C++
- //**********************************************************************
- // File name: ips.cpp
- //
- // Implementation file for the CSimpSvrApp Class
- //
- // Functions:
- //
- // See ips.h for a list of member functions.
- //
- // Copyright (c) 1993-1997 Microsoft Corporation. All rights reserved.
- //**********************************************************************
- #include "pre.h"
- #include "obj.h"
- #include "ips.h"
- #include "app.h"
- #include "doc.h"
- //@@WTK WIN32, UNICODE
- //#include <storage.h>
- DEFINE_GUID(GUID_SIMPLE, 0xBCF6D4A0, 0xBE8C, 0x1068, 0xB6, 0xD4, 0x00, 0xDD, 0x01, 0x0C, 0x05, 0x09);
- //**********************************************************************
- //
- // CPersistStorage::QueryInterface
- //
- // Purpose:
- //
- //
- // Parameters:
- //
- // REFIID riid - Interface being queried for.
- //
- // LPVOID FAR *ppvObj - Out pointer for the interface.
- //
- // Return Value:
- //
- // S_OK - Success
- // E_NOINTERFACE - Failure
- //
- // Function Calls:
- // Function Location
- //
- // CSimpSvrObj::QueryInterface OBJ.CPP
- //
- // Comments:
- //
- //
- //********************************************************************
- STDMETHODIMP CPersistStorage::QueryInterface ( REFIID riid, LPVOID FAR* ppvObj)
- {
- OutputDebugString("In CPersistStorage::QueryInterfacern");
- // need to NULL the out parameter
- return m_lpObj->QueryInterface(riid, ppvObj);
- };
- //**********************************************************************
- //
- // CPersistStorage::AddRef
- //
- // Purpose:
- //
- // Increments the reference count on CPersistStorage and the "object"
- // object.
- //
- // Parameters:
- //
- // None
- //
- // Return Value:
- //
- // The Reference count on the Object.
- //
- // Function Calls:
- // Function Location
- //
- // OuputDebugString Windows API
- // CSimpSvrObj::AddRef OBJ.CPP
- //
- // Comments:
- //
- //
- //********************************************************************
- STDMETHODIMP_(ULONG) CPersistStorage::AddRef ()
- {
- OutputDebugString("In CPersistStorage::AddRefrn");
- ++m_nCount;
- return m_lpObj->AddRef();
- };
- //**********************************************************************
- //
- // CPersistStorage::Release
- //
- // Purpose:
- //
- // Decrements the reference count of CPersistStorage and the
- // "object" object.
- //
- // Parameters:
- //
- // None
- //
- // Return Value:
- //
- // The new reference count
- //
- // Function Calls:
- // Function Location
- //
- // OutputDebugString Windows API
- // CSimpSvrObj::Release OBJ.CPP
- //
- // Comments:
- //
- //
- //********************************************************************
- STDMETHODIMP_(ULONG) CPersistStorage::Release ()
- {
- OutputDebugString("In CPersistStorage::Releasern");
- --m_nCount;
- return m_lpObj->Release();
- };
- //**********************************************************************
- //
- // CPersistStorage::InitNew
- //
- // Purpose:
- //
- // Used to give a new OLE object a ptr to its storage.
- //
- // Parameters:
- //
- // LPSTORAGE pStg - Pointer to the storage
- //
- // Return Value:
- //
- //
- //
- // Function Calls:
- // Function Location
- //
- // OutputDebugString Windows API
- // IStorage::Release OLE
- // IStorage::AddRef OLE
- //
- //
- // Comments:
- //
- //
- //********************************************************************
- STDMETHODIMP CPersistStorage::InitNew (LPSTORAGE pStg)
- {
- OutputDebugString("In CPersistStorage::InitNewrn");
- // release any streams and storages that may be open
- ReleaseStreamsAndStorage();
- m_lpObj->m_lpStorage = pStg;
- // AddRef the new Storage
- if (m_lpObj->m_lpStorage)
- m_lpObj->m_lpStorage->AddRef();
- CreateStreams(m_lpObj->m_lpStorage);
- return S_OK;
- }
- //**********************************************************************
- //
- // CPersistStorage::GetClassID
- //
- // Purpose:
- //
- // Returns the CLSID of this object.
- //
- // Parameters:
- //
- // LPCLSID lpClassID - Out ptr in which to return the CLSID
- //
- // Return Value:
- //
- // S_OK
- //
- // Function Calls:
- // Function Location
- //
- // OutputDebugString Windows API
- //
- //
- // Comments:
- //
- //
- //********************************************************************
- STDMETHODIMP CPersistStorage::GetClassID ( LPCLSID lpClassID)
- {
- OutputDebugString("In CPersistStorage::GetClassIDrn");
- *lpClassID = GUID_SIMPLE;
- return S_OK ;
- };
- //**********************************************************************
- //
- // CPersistStorage::Save
- //
- // Purpose:
- //
- // Instructs the object to save itself into the storage.
- //
- // Parameters:
- //
- // LPSTORAGE pStgSave - Storage in which the object should be saved
- //
- // BOOL fSameAsLoad - TRUE if pStgSave is the same as the storage
- // that the object was originally created with.
- //
- // Return Value:
- //
- // S_OK
- //
- // Function Calls:
- // Function Location
- //
- // OutputDebugString Windows API
- // CPersistStorage::InitNew IPS.CPP
- // CSimpSvrObj::SaveToStorage OBJ.CPP
- //
- //
- // Comments:
- //
- // A real app will want better error checking in this method.
- //
- //********************************************************************
- STDMETHODIMP CPersistStorage::Save ( LPSTORAGE pStgSave, BOOL fSameAsLoad)
- {
- OutputDebugString("In CPersistStorage::Savern");
- // save the data
- m_lpObj->SaveToStorage (pStgSave, fSameAsLoad);
- m_lpObj->m_fSaveWithSameAsLoad = fSameAsLoad;
- m_lpObj->m_fNoScribbleMode = TRUE;
- return S_OK ;
- };
- //**********************************************************************
- //
- // CPersistStorage::SaveCompleted
- //
- // Purpose:
- //
- // Called when the container is finished saving the object
- //
- // Parameters:
- //
- // LPSTORAGE pStgNew - ptr to the new storage
- //
- // Return Value:
- //
- // S_OK
- //
- // Function Calls:
- // Function Location
- //
- // OutputDebugString Windows API
- //
- //
- // Comments:
- //
- //
- //********************************************************************
- STDMETHODIMP CPersistStorage::SaveCompleted ( LPSTORAGE pStgNew)
- {
- OutputDebugString("In CPersistStorage::SaveCompletedrn");
- if (pStgNew)
- {
- ReleaseStreamsAndStorage();
- m_lpObj->m_lpStorage = pStgNew;
- m_lpObj->m_lpStorage->AddRef();
- OpenStreams(pStgNew);
- }
- /* OLE2NOTE: it is only legal to perform a Save or SaveAs operation
- ** on an embedded object. if the document is a file-based document
- ** then we can not be changed to a IStorage-base object.
- **
- ** fSameAsLoad lpStgNew Type of Save Send OnSave
- ** ---------------------------------------------------------
- ** TRUE NULL SAVE YES
- ** TRUE ! NULL SAVE * YES
- ** FALSE ! NULL SAVE AS YES
- ** FALSE NULL SAVE COPY AS NO
- **
- ** * this is a strange case that is possible. it is inefficient
- ** for the caller; it would be better to pass lpStgNew==NULL for
- ** the Save operation.
- */
- if ( pStgNew || m_lpObj->m_fSaveWithSameAsLoad)
- {
- if (m_lpObj->m_fNoScribbleMode)
- m_lpObj->GetOleAdviseHolder()->SendOnSave(); // normally would clear a
- // dirty bit
- m_lpObj->m_fSaveWithSameAsLoad = FALSE;
- }
- m_lpObj->m_fNoScribbleMode = FALSE;
- return S_OK ;
- };
- //**********************************************************************
- //
- // CPersistStorage::Load
- //
- // Purpose:
- //
- // Instructs the object to be loaded from storage.
- //
- // Parameters:
- //
- // LPSTORAGE pStg - Ptr to the storage in which to be loaded
- //
- // Return Value:
- //
- // S_OK
- //
- // Function Calls:
- // Function Location
- //
- // OutputDebugString Windows API
- // CSimpSvrObj::LoadFromStorage OBJ.CPP
- //
- //
- // Comments:
- //
- // A real app will want better error checking in this method.
- //
- //********************************************************************
- STDMETHODIMP CPersistStorage::Load ( LPSTORAGE pStg)
- {
- OutputDebugString("In CPersistStorage::Loadrn");
- // remember the storage
- if (m_lpObj->m_lpStorage)
- {
- m_lpObj->m_lpStorage->Release();
- m_lpObj->m_lpStorage = NULL;
- }
- m_lpObj->m_lpStorage = pStg;
- m_lpObj->m_lpStorage->AddRef();
- OpenStreams(m_lpObj->m_lpStorage);
- m_lpObj->LoadFromStorage();
- return S_OK ;
- };
- //**********************************************************************
- //
- // CPersistStorage::IsDirty
- //
- // Purpose:
- //
- // Returns whether or not the object is dirty w/respect to its
- // Storage
- //
- // Parameters:
- //
- // None
- //
- // Return Value:
- //
- //
- // Function Calls:
- // Function Location
- //
- // OutputDebugString Windows API
- //
- //
- // Comments:
- //
- // This sample does not implement this function, although a
- // real application should.
- //
- //********************************************************************
- STDMETHODIMP CPersistStorage::IsDirty()
- {
- OutputDebugString("In CPersistStorage::IsDirtyrn");
- return S_OK ;
- };
- //**********************************************************************
- //
- // CPersistStorage::HandsOffStorage
- //
- // Purpose:
- //
- // Forces the object to release its handle to its storage.
- //
- // Parameters:
- //
- // None
- //
- // Return Value:
- //
- // S_OK
- //
- // Function Calls:
- // Function Location
- //
- // OutputDebugString Windows API
- // IStorage::Release OLE
- //
- // Comments:
- //
- //
- //********************************************************************
- STDMETHODIMP CPersistStorage::HandsOffStorage ()
- {
- OutputDebugString("In CPersistStorage::HandsOffStoragern");
- ReleaseStreamsAndStorage();
- return S_OK ;
- };
- //**********************************************************************
- //
- // CPersistStorage::CreateStreams
- //
- // Purpose:
- //
- // Creates the streams that are held open for the object's lifetime.
- //
- // Parameters:
- //
- // LPSTORAGE lpStg - Storage in which to create the streams
- //
- // Return Value:
- //
- // S_OK
- //
- // Function Calls:
- // Function Location
- //
- // OutputDebugString Windows API
- // IStorage::Release OLE
- // IStream::Release OLE
- // IStorage::CreateStream OLE
- //
- // Comments:
- //
- //
- //********************************************************************
- void CPersistStorage::CreateStreams(LPSTORAGE lpStg)
- {
- if (m_lpObj->m_lpColorStm)
- m_lpObj->m_lpColorStm->Release();
- if (m_lpObj->m_lpSizeStm)
- m_lpObj->m_lpSizeStm->Release();
- // create a stream to save the colors
- //@@WTK WIN32, UNICODE
- //lpStg->CreateStream ( "RGB",
- lpStg->CreateStream ( OLESTR("RGB"),
- STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
- 0,
- 0,
- &m_lpObj->m_lpColorStm);
- // create a stream to save the size
- //@@WTK WIN32, UNICODE
- //lpStg->CreateStream ( "size",
- lpStg->CreateStream ( OLESTR("size"),
- STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
- 0,
- 0,
- &m_lpObj->m_lpSizeStm);
- }
- //**********************************************************************
- //
- // CPersistStorage::OpenStreams
- //
- // Purpose:
- //
- // Opens the streams in a storage.
- //
- // Parameters:
- //
- // LPSTORAGE lpStg - Storage in which to open the streams.
- //
- // Return Value:
- //
- // S_OK
- //
- // Function Calls:
- // Function Location
- //
- // OutputDebugString Windows API
- // IStorage::Release OLE
- //
- // Comments:
- //
- //
- //********************************************************************
- void CPersistStorage::OpenStreams(LPSTORAGE lpStg)
- {
- if (m_lpObj->m_lpColorStm)
- m_lpObj->m_lpColorStm->Release();
- if (m_lpObj->m_lpSizeStm)
- m_lpObj->m_lpSizeStm->Release();
- // open the color stream
- //@@WTK WIN32, UNICODE
- //lpStg->OpenStream ( "RGB",
- lpStg->OpenStream ( OLESTR("RGB"),
- 0,
- STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
- 0,
- &m_lpObj->m_lpColorStm);
- // open the color stream
- //@@WTK WIN32, UNICODE
- //lpStg->OpenStream ( "size",
- lpStg->OpenStream ( OLESTR("size"),
- 0,
- STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
- 0,
- &m_lpObj->m_lpSizeStm);
- }
- //**********************************************************************
- //
- // CPersistStorage::ReleaseStreamsAndStorage
- //
- // Purpose:
- //
- // Releases the stream and storage ptrs
- //
- // Parameters:
- //
- // None
- //
- // Return Value:
- //
- // S_OK
- //
- // Function Calls:
- // Function Location
- //
- // OutputDebugString Windows API
- // IStorage::Release OLE
- //
- // Comments:
- //
- //
- //********************************************************************
- void CPersistStorage::ReleaseStreamsAndStorage()
- {
- if (m_lpObj->m_lpColorStm)
- {
- m_lpObj->m_lpColorStm->Release();
- m_lpObj->m_lpColorStm = NULL;
- }
- if (m_lpObj->m_lpSizeStm)
- {
- m_lpObj->m_lpSizeStm->Release();
- m_lpObj->m_lpSizeStm = NULL;
- }
- if (m_lpObj->m_lpStorage)
- {
- m_lpObj->m_lpStorage->Release();
- m_lpObj->m_lpStorage = NULL;
- }
- }
- //**********************************************************************
- //
- // CPersistStorage::CreateStreams
- //
- // Purpose:
- //
- // Creates temporary streams in a storage.
- //
- // Parameters:
- //
- // LPSTORAGE lpStg - Pointer to the storage
- //
- // LPSTREAM FAR* lplpTempColor - Color Stream
- //
- // LPSTREAM FAR* lplpTempSize - Size Stream
- //
- // Return Value:
- //
- // S_OK
- //
- // Function Calls:
- // Function Location
- //
- // OutputDebugString Windows API
- // IStorage::Release OLE
- //
- // Comments:
- //
- //
- //********************************************************************
- void CPersistStorage::CreateStreams(LPSTORAGE lpStg, LPSTREAM FAR* lplpTempColor,LPSTREAM FAR* lplpTempSize)
- {
- // create a stream to save the colors
- //@@WTK WIN32, UNICODE
- //lpStg->CreateStream ( "RGB",
- lpStg->CreateStream ( OLESTR("RGB"),
- STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
- 0,
- 0,
- lplpTempColor);
- // create a stream to save the size
- //@@WTK WIN32, UNICODE
- //lpStg->CreateStream ( "size",
- lpStg->CreateStream ( OLESTR("size"),
- STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
- 0,
- 0,
- lplpTempSize);
- }