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.
793 lines
16 KiB
793 lines
16 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
|
//
|
|
// File: ocperf.cpp
|
|
//
|
|
// Contents: OleCreate performance test
|
|
//
|
|
// Classes: CBareServer
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 01-Jan-95 alexgo author
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <windows.h>
|
|
#include <ole2.h>
|
|
#include <stdio.h>
|
|
|
|
#include <initguid.h>
|
|
|
|
DEFINE_GUID(CLSID_BareServer, 0xce3d5220, 0x25fa, 0x11ce, 0x90, 0xeb, 0x00,
|
|
0x00, 0x4c, 0x75, 0x2a, 0x63);
|
|
|
|
class CBareServer : public IOleObject, public IDataObject,
|
|
public IPersistStorage
|
|
{
|
|
|
|
public:
|
|
|
|
// IUnknown methods
|
|
|
|
STDMETHOD(QueryInterface) ( REFIID riid, LPVOID FAR* ppvObj);
|
|
STDMETHOD_(ULONG,AddRef) (void);
|
|
STDMETHOD_(ULONG,Release) (void);
|
|
|
|
// IDataObject methods
|
|
|
|
STDMETHOD(GetData) ( LPFORMATETC pformatetcIn,
|
|
LPSTGMEDIUM pmedium );
|
|
STDMETHOD(GetDataHere) ( LPFORMATETC pformatetc,
|
|
LPSTGMEDIUM pmedium );
|
|
STDMETHOD(QueryGetData) ( LPFORMATETC pformatetc );
|
|
STDMETHOD(GetCanonicalFormatEtc) ( LPFORMATETC pformatetc,
|
|
LPFORMATETC pformatetcOut);
|
|
STDMETHOD(SetData) ( LPFORMATETC pformatetc,
|
|
LPSTGMEDIUM pmedium, BOOL fRelease);
|
|
STDMETHOD(EnumFormatEtc) ( DWORD dwDirection,
|
|
LPENUMFORMATETC FAR* ppenumFormatEtc);
|
|
STDMETHOD(DAdvise) ( FORMATETC FAR* pFormatetc, DWORD advf,
|
|
IAdviseSink FAR* pAdvSink,
|
|
DWORD FAR* pdwConnection);
|
|
STDMETHOD(DUnadvise) ( DWORD dwConnection);
|
|
STDMETHOD(EnumDAdvise) ( LPENUMSTATDATA FAR* ppenumAdvise);
|
|
|
|
// IOleObject methods
|
|
|
|
STDMETHOD(SetClientSite) ( LPOLECLIENTSITE pClientSite);
|
|
STDMETHOD(GetClientSite) ( LPOLECLIENTSITE FAR* ppClientSite);
|
|
STDMETHOD(SetHostNames) ( LPCOLESTR szContainerApp,
|
|
LPCOLESTR szContainerObj);
|
|
STDMETHOD(Close) ( DWORD reserved);
|
|
STDMETHOD(SetMoniker) ( DWORD dwWhichMoniker, LPMONIKER pmk);
|
|
STDMETHOD(GetMoniker) ( DWORD dwAssign, DWORD dwWhichMoniker,
|
|
LPMONIKER FAR* ppmk);
|
|
STDMETHOD(InitFromData) ( LPDATAOBJECT pDataObject,
|
|
BOOL fCreation,
|
|
DWORD dwReserved);
|
|
STDMETHOD(GetClipboardData) ( DWORD dwReserved,
|
|
LPDATAOBJECT FAR* ppDataObject);
|
|
STDMETHOD(DoVerb) ( LONG iVerb,
|
|
LPMSG lpmsg,
|
|
LPOLECLIENTSITE pActiveSite,
|
|
LONG lindex,
|
|
HWND hwndParent,
|
|
const RECT FAR* lprcPosRect);
|
|
STDMETHOD(EnumVerbs) ( IEnumOLEVERB FAR* FAR* ppenumOleVerb);
|
|
STDMETHOD(Update) (void);
|
|
STDMETHOD(IsUpToDate) (void);
|
|
STDMETHOD(GetUserClassID) ( CLSID FAR* pClsid);
|
|
STDMETHOD(GetUserType) ( DWORD dwFormOfType,
|
|
LPOLESTR FAR* pszUserType);
|
|
STDMETHOD(SetExtent) ( DWORD dwDrawAspect, LPSIZEL lpsizel);
|
|
STDMETHOD(GetExtent) ( DWORD dwDrawAspect, LPSIZEL lpsizel);
|
|
STDMETHOD(Advise)(IAdviseSink FAR* pAdvSink,
|
|
DWORD FAR* pdwConnection);
|
|
STDMETHOD(Unadvise)( DWORD dwConnection);
|
|
STDMETHOD(EnumAdvise) ( LPENUMSTATDATA FAR* ppenumAdvise);
|
|
STDMETHOD(GetMiscStatus) ( DWORD dwAspect,
|
|
DWORD FAR* pdwStatus);
|
|
STDMETHOD(SetColorScheme) ( LPLOGPALETTE lpLogpal);
|
|
|
|
// IPeristStorage methods
|
|
|
|
STDMETHOD(GetClassID) ( LPCLSID pClassID);
|
|
STDMETHOD(IsDirty) (void);
|
|
STDMETHOD(InitNew) ( LPSTORAGE pstg);
|
|
STDMETHOD(Load) ( LPSTORAGE pstg);
|
|
STDMETHOD(Save) ( LPSTORAGE pstgSave, BOOL fSameAsLoad);
|
|
STDMETHOD(SaveCompleted) ( LPSTORAGE pstgNew);
|
|
STDMETHOD(HandsOffStorage) ( void);
|
|
|
|
|
|
CBareServer();
|
|
|
|
private:
|
|
|
|
~CBareServer();
|
|
|
|
ULONG _cRefs;
|
|
IStorage * _pstg;
|
|
IOleClientSite * _pclientsite;
|
|
IOleAdviseHolder * _poaholder;
|
|
|
|
};
|
|
|
|
CBareServer::CBareServer()
|
|
{
|
|
_cRefs = 1;
|
|
_pstg = NULL;
|
|
_pclientsite = NULL;
|
|
_poaholder = NULL;
|
|
}
|
|
|
|
CBareServer::~CBareServer()
|
|
{
|
|
if( _poaholder )
|
|
{
|
|
_poaholder->Release();
|
|
_poaholder = NULL;
|
|
}
|
|
|
|
if( _pclientsite )
|
|
{
|
|
_pclientsite->Release();
|
|
_pclientsite = NULL;
|
|
}
|
|
|
|
if( _pstg )
|
|
{
|
|
_pstg->Release();
|
|
_pstg = NULL;
|
|
}
|
|
}
|
|
|
|
// IUnknown methods
|
|
|
|
STDMETHODIMP CBareServer::QueryInterface ( REFIID riid, LPVOID FAR* ppvObj)
|
|
{
|
|
HRESULT hresult = NOERROR;
|
|
|
|
if( IsEqualIID(riid, IID_IUnknown) )
|
|
{
|
|
*ppvObj = (void *)(IOleObject *)this;
|
|
}
|
|
else if( IsEqualIID(riid, IID_IOleObject) )
|
|
{
|
|
*ppvObj = (void *)(IOleObject *)this;
|
|
}
|
|
else if( IsEqualIID(riid, IID_IDataObject) )
|
|
{
|
|
*ppvObj = (void *)(IDataObject *)this;
|
|
}
|
|
else if( IsEqualIID(riid, IID_IPersistStorage) )
|
|
{
|
|
*ppvObj = (void *)(IPersistStorage *)this;
|
|
}
|
|
else
|
|
{
|
|
hresult = E_NOINTERFACE;
|
|
*ppvObj = NULL;
|
|
}
|
|
|
|
if( hresult == NOERROR )
|
|
{
|
|
AddRef();
|
|
}
|
|
|
|
return hresult;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CBareServer::AddRef(void)
|
|
{
|
|
_cRefs++;
|
|
return _cRefs;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CBareServer::Release(void)
|
|
{
|
|
_cRefs--;
|
|
|
|
if( _cRefs == 0 )
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
return _cRefs;
|
|
}
|
|
|
|
// IDataObject methods
|
|
|
|
STDMETHODIMP CBareServer::GetData ( LPFORMATETC pformatetcIn,
|
|
LPSTGMEDIUM pmedium )
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::GetDataHere ( LPFORMATETC pformatetc,
|
|
LPSTGMEDIUM pmedium )
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::QueryGetData ( LPFORMATETC pformatetc )
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::GetCanonicalFormatEtc ( LPFORMATETC pformatetc,
|
|
LPFORMATETC pformatetcOut)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::SetData ( LPFORMATETC pformatetc,
|
|
LPSTGMEDIUM pmedium, BOOL fRelease)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::EnumFormatEtc ( DWORD dwDirection,
|
|
LPENUMFORMATETC FAR* ppenumFormatEtc)
|
|
{
|
|
*ppenumFormatEtc = NULL;
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::DAdvise ( FORMATETC FAR* pFormatetc, DWORD advf,
|
|
IAdviseSink FAR* pAdvSink,
|
|
DWORD FAR* pdwConnection)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::DUnadvise ( DWORD dwConnection)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::EnumDAdvise ( LPENUMSTATDATA FAR* ppenumAdvise)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
// IOleObject methods
|
|
|
|
STDMETHODIMP CBareServer::SetClientSite ( LPOLECLIENTSITE pClientSite)
|
|
{
|
|
_pclientsite = pClientSite;
|
|
_pclientsite->AddRef();
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::GetClientSite ( LPOLECLIENTSITE FAR* ppClientSite)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CBareServer::SetHostNames ( LPCOLESTR szContainerApp,
|
|
LPCOLESTR szContainerObj)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::Close ( DWORD reserved)
|
|
{
|
|
printf("close called\n");
|
|
|
|
if( _poaholder )
|
|
{
|
|
_poaholder->SendOnClose();
|
|
}
|
|
|
|
CoDisconnectObject((IOleObject *)this, 0);
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::SetMoniker ( DWORD dwWhichMoniker, LPMONIKER pmk)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::GetMoniker ( DWORD dwAssign, DWORD dwWhichMoniker,
|
|
LPMONIKER FAR* ppmk)
|
|
{
|
|
*ppmk = NULL;
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::InitFromData ( LPDATAOBJECT pDataObject,
|
|
BOOL fCreation,
|
|
DWORD dwReserved)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::GetClipboardData ( DWORD dwReserved,
|
|
LPDATAOBJECT FAR* ppDataObject)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::DoVerb ( LONG iVerb,
|
|
LPMSG lpmsg,
|
|
LPOLECLIENTSITE pActiveSite,
|
|
LONG lindex,
|
|
HWND hwndParent,
|
|
const RECT FAR* lprcPosRect)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::EnumVerbs ( IEnumOLEVERB FAR* FAR* ppenumOleVerb)
|
|
{
|
|
return OLE_S_USEREG;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::Update (void)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::IsUpToDate (void)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::GetUserClassID ( CLSID FAR* pClsid)
|
|
{
|
|
*pClsid = CLSID_BareServer;
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::GetUserType ( DWORD dwFormOfType,
|
|
LPOLESTR FAR* pszUserType)
|
|
{
|
|
return OLE_S_USEREG;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::SetExtent ( DWORD dwDrawAspect, LPSIZEL lpsizel)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::GetExtent ( DWORD dwDrawAspect, LPSIZEL lpsizel)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::Advise (IAdviseSink FAR* pAdvSink,
|
|
DWORD FAR* pdwConnection)
|
|
{
|
|
|
|
printf("Advise called\n");
|
|
|
|
HRESULT hresult;
|
|
|
|
if( !_poaholder )
|
|
{
|
|
hresult = CreateOleAdviseHolder(&_poaholder);
|
|
}
|
|
|
|
if( _poaholder )
|
|
{
|
|
hresult = _poaholder->Advise(pAdvSink, pdwConnection);
|
|
}
|
|
|
|
return hresult;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::Unadvise ( DWORD dwConnection)
|
|
{
|
|
if( _poaholder )
|
|
{
|
|
return _poaholder->Unadvise(dwConnection);
|
|
}
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::EnumAdvise ( LPENUMSTATDATA FAR* ppenumAdvise)
|
|
{
|
|
if( _poaholder )
|
|
{
|
|
return _poaholder->EnumAdvise(ppenumAdvise);
|
|
}
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::GetMiscStatus ( DWORD dwAspect,
|
|
DWORD FAR* pdwStatus)
|
|
{
|
|
return OLE_S_USEREG;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::SetColorScheme ( LPLOGPALETTE lpLogpal)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
// IPeristStorage methods
|
|
|
|
STDMETHODIMP CBareServer::GetClassID ( LPCLSID pClassID)
|
|
{
|
|
*pClassID = CLSID_BareServer;
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::IsDirty (void)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::InitNew ( LPSTORAGE pstg)
|
|
{
|
|
printf("InitNew called\n");
|
|
|
|
_pstg = pstg;
|
|
_pstg->AddRef();
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::Load ( LPSTORAGE pstg)
|
|
{
|
|
_pstg = pstg;
|
|
_pstg->AddRef();
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::Save ( LPSTORAGE pstgSave, BOOL fSameAsLoad)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::SaveCompleted ( LPSTORAGE pstgNew)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareServer::HandsOffStorage ( void)
|
|
{
|
|
_pstg->Release();
|
|
_pstg = NULL;
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
// class factory
|
|
|
|
class CBareFactory : public IClassFactory
|
|
{
|
|
|
|
public:
|
|
STDMETHOD(QueryInterface) (REFIID iid, LPVOID FAR* ppvObj);
|
|
STDMETHOD_(ULONG,AddRef) (void);
|
|
STDMETHOD_(ULONG,Release) (void);
|
|
STDMETHOD(CreateInstance) (LPUNKNOWN pUnkOuter, REFIID iid,
|
|
LPVOID FAR* ppv);
|
|
STDMETHOD(LockServer) ( BOOL fLock );
|
|
|
|
CBareFactory();
|
|
|
|
private:
|
|
ULONG _cRefs;
|
|
};
|
|
|
|
CBareFactory::CBareFactory()
|
|
{
|
|
_cRefs = 1;
|
|
}
|
|
|
|
STDMETHODIMP CBareFactory::QueryInterface (REFIID iid, LPVOID FAR* ppvObj)
|
|
{
|
|
if( IsEqualIID(iid, IID_IClassFactory) ||
|
|
IsEqualIID(iid, IID_IUnknown) )
|
|
{
|
|
*ppvObj = this;
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
else
|
|
{
|
|
*ppvObj = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CBareFactory::AddRef (void)
|
|
{
|
|
_cRefs++;
|
|
return _cRefs;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CBareFactory::Release (void)
|
|
{
|
|
_cRefs--;
|
|
|
|
if( _cRefs == 0 )
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
return _cRefs;
|
|
}
|
|
|
|
STDMETHODIMP CBareFactory::CreateInstance (LPUNKNOWN pUnkOuter, REFIID iid,
|
|
LPVOID FAR* ppv)
|
|
{
|
|
*ppv = (IOleObject *)new CBareServer();
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareFactory::LockServer ( BOOL fLock )
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
// Client Site
|
|
|
|
class CBareClientSite : public IOleClientSite
|
|
{
|
|
public:
|
|
|
|
STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
|
|
STDMETHOD_(ULONG, AddRef)();
|
|
STDMETHOD_(ULONG, Release)();
|
|
|
|
// *** IOleClientSite methods ***
|
|
STDMETHOD(SaveObject)();
|
|
STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker,
|
|
LPMONIKER FAR* ppmk);
|
|
STDMETHOD(GetContainer)(LPOLECONTAINER FAR* ppContainer);
|
|
STDMETHOD(ShowObject)();
|
|
STDMETHOD(OnShowWindow)(BOOL fShow);
|
|
STDMETHOD(RequestNewObjectLayout)();
|
|
|
|
CBareClientSite();
|
|
|
|
private:
|
|
|
|
ULONG _cRefs;
|
|
};
|
|
|
|
CBareClientSite::CBareClientSite()
|
|
{
|
|
_cRefs = 1;
|
|
}
|
|
|
|
STDMETHODIMP CBareClientSite::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
|
|
{
|
|
if( IsEqualIID(riid, IID_IUnknown) ||
|
|
IsEqualIID(riid, IID_IOleClientSite) )
|
|
{
|
|
*ppvObj = this;
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
else
|
|
{
|
|
*ppvObj = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CBareClientSite::AddRef()
|
|
{
|
|
_cRefs++;
|
|
return _cRefs;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CBareClientSite::Release()
|
|
{
|
|
_cRefs--;
|
|
|
|
if( _cRefs == 0 )
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
return _cRefs;
|
|
}
|
|
|
|
// *** IOleClientSite methods ***
|
|
STDMETHODIMP CBareClientSite::SaveObject()
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareClientSite::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker,
|
|
LPMONIKER FAR* ppmk)
|
|
{
|
|
*ppmk = NULL;
|
|
return E_FAIL;
|
|
}
|
|
|
|
STDMETHODIMP CBareClientSite::GetContainer(LPOLECONTAINER FAR* ppContainer)
|
|
{
|
|
*ppContainer = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDMETHODIMP CBareClientSite::ShowObject()
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareClientSite::OnShowWindow(BOOL fShow)
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CBareClientSite::RequestNewObjectLayout()
|
|
{
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
void RunServerSide(void)
|
|
{
|
|
DWORD dwcf = 0;
|
|
HWND hwnd;
|
|
MSG msg;
|
|
|
|
IClassFactory *pcf = new CBareFactory();
|
|
|
|
WNDCLASS wc;
|
|
|
|
// Register Clipboard window class
|
|
//
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = DefWindowProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 4;
|
|
wc.hInstance = NULL;
|
|
wc.hIcon = NULL;
|
|
wc.hCursor = NULL;
|
|
wc.hbrBackground = NULL;
|
|
wc.lpszMenuName = NULL;
|
|
wc.lpszClassName = "BareServerWindow";
|
|
|
|
// don't bother checking for errors
|
|
RegisterClass(&wc);
|
|
|
|
hwnd = CreateWindow("BareServerWindow","",WS_POPUP,CW_USEDEFAULT,
|
|
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
|
|
NULL,NULL,NULL,NULL);
|
|
|
|
CoRegisterClassObject( CLSID_BareServer, pcf, CLSCTX_LOCAL_SERVER,
|
|
REGCLS_MULTIPLEUSE, &dwcf );
|
|
|
|
while (GetMessage(&msg, NULL, NULL, NULL))
|
|
{
|
|
TranslateMessage(&msg); /* Translates virtual key codes */
|
|
DispatchMessage(&msg); /* Dispatches message to window */
|
|
}
|
|
|
|
CoRevokeClassObject(dwcf);
|
|
}
|
|
|
|
void RunContainerSide()
|
|
{
|
|
DWORD dwStart, dwFinish, i;
|
|
HRESULT hresult;
|
|
IStorage *pstg;
|
|
IOleObject *poo;
|
|
IOleClientSite *pcs;
|
|
|
|
hresult = StgCreateDocfile(NULL, STGM_CREATE | STGM_READWRITE |
|
|
STGM_SHARE_EXCLUSIVE,
|
|
0, &pstg);
|
|
|
|
if( hresult != NOERROR )
|
|
{
|
|
printf("CreateDocFile failed! (%lx)\n", hresult);
|
|
exit(hresult);
|
|
}
|
|
|
|
pcs = (IOleClientSite *)new CBareClientSite();
|
|
|
|
// prime the server
|
|
|
|
hresult = OleCreate( CLSID_BareServer, IID_IOleObject, OLERENDER_NONE,
|
|
NULL, pcs, pstg, (void **)&poo);
|
|
|
|
if( hresult != NOERROR )
|
|
{
|
|
printf("OleCreate failed! (%lx)\n", hresult);
|
|
exit(hresult);
|
|
}
|
|
|
|
hresult = OleRun(poo);
|
|
|
|
if( hresult != NOERROR )
|
|
{
|
|
printf("OleRun failed! (%lx)\n", hresult);
|
|
exit(hresult);
|
|
}
|
|
|
|
poo->Close(0);
|
|
poo->Release();
|
|
poo = NULL;
|
|
|
|
pcs->Release();
|
|
pcs = NULL;
|
|
|
|
for( i = 0; i < 100; i++ )
|
|
{
|
|
|
|
pcs = (IOleClientSite *)new CBareClientSite();
|
|
|
|
dwStart = GetTickCount();
|
|
|
|
hresult = OleCreate(CLSID_BareServer, IID_IOleObject, OLERENDER_NONE,
|
|
NULL, pcs, pstg, (void **)&poo);
|
|
|
|
if( hresult == NOERROR )
|
|
{
|
|
hresult = OleRun(poo);
|
|
}
|
|
|
|
dwFinish = GetTickCount();
|
|
|
|
if( hresult == NOERROR )
|
|
{
|
|
poo->Close(0);
|
|
poo->Release();
|
|
poo = NULL;
|
|
|
|
printf("%ld\n", dwFinish - dwStart);
|
|
}
|
|
else
|
|
{
|
|
printf("%ld failed! (%lx)\n", i, hresult);
|
|
}
|
|
|
|
pcs->Release();
|
|
pcs = NULL;
|
|
}
|
|
|
|
pstg->Release();
|
|
}
|
|
|
|
|
|
int main( int argc, char **argv )
|
|
{
|
|
OleInitialize(NULL);
|
|
|
|
if( argc == 2 )
|
|
{
|
|
// assume -Embedding
|
|
RunServerSide();
|
|
}
|
|
else
|
|
{
|
|
RunContainerSide();
|
|
}
|
|
|
|
OleUninitialize();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|