Leaked source code of windows server 2003
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

//+-------------------------------------------------------------------------
//
// 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;
}