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

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1993.
  5. //
  6. // File: ocperf.cpp
  7. //
  8. // Contents: OleCreate performance test
  9. //
  10. // Classes: CBareServer
  11. //
  12. // Functions:
  13. //
  14. // History: dd-mmm-yy Author Comment
  15. // 01-Jan-95 alexgo author
  16. //
  17. //--------------------------------------------------------------------------
  18. #include <windows.h>
  19. #include <ole2.h>
  20. #include <stdio.h>
  21. #include <initguid.h>
  22. DEFINE_GUID(CLSID_BareServer, 0xce3d5220, 0x25fa, 0x11ce, 0x90, 0xeb, 0x00,
  23. 0x00, 0x4c, 0x75, 0x2a, 0x63);
  24. class CBareServer : public IOleObject, public IDataObject,
  25. public IPersistStorage
  26. {
  27. public:
  28. // IUnknown methods
  29. STDMETHOD(QueryInterface) ( REFIID riid, LPVOID FAR* ppvObj);
  30. STDMETHOD_(ULONG,AddRef) (void);
  31. STDMETHOD_(ULONG,Release) (void);
  32. // IDataObject methods
  33. STDMETHOD(GetData) ( LPFORMATETC pformatetcIn,
  34. LPSTGMEDIUM pmedium );
  35. STDMETHOD(GetDataHere) ( LPFORMATETC pformatetc,
  36. LPSTGMEDIUM pmedium );
  37. STDMETHOD(QueryGetData) ( LPFORMATETC pformatetc );
  38. STDMETHOD(GetCanonicalFormatEtc) ( LPFORMATETC pformatetc,
  39. LPFORMATETC pformatetcOut);
  40. STDMETHOD(SetData) ( LPFORMATETC pformatetc,
  41. LPSTGMEDIUM pmedium, BOOL fRelease);
  42. STDMETHOD(EnumFormatEtc) ( DWORD dwDirection,
  43. LPENUMFORMATETC FAR* ppenumFormatEtc);
  44. STDMETHOD(DAdvise) ( FORMATETC FAR* pFormatetc, DWORD advf,
  45. IAdviseSink FAR* pAdvSink,
  46. DWORD FAR* pdwConnection);
  47. STDMETHOD(DUnadvise) ( DWORD dwConnection);
  48. STDMETHOD(EnumDAdvise) ( LPENUMSTATDATA FAR* ppenumAdvise);
  49. // IOleObject methods
  50. STDMETHOD(SetClientSite) ( LPOLECLIENTSITE pClientSite);
  51. STDMETHOD(GetClientSite) ( LPOLECLIENTSITE FAR* ppClientSite);
  52. STDMETHOD(SetHostNames) ( LPCOLESTR szContainerApp,
  53. LPCOLESTR szContainerObj);
  54. STDMETHOD(Close) ( DWORD reserved);
  55. STDMETHOD(SetMoniker) ( DWORD dwWhichMoniker, LPMONIKER pmk);
  56. STDMETHOD(GetMoniker) ( DWORD dwAssign, DWORD dwWhichMoniker,
  57. LPMONIKER FAR* ppmk);
  58. STDMETHOD(InitFromData) ( LPDATAOBJECT pDataObject,
  59. BOOL fCreation,
  60. DWORD dwReserved);
  61. STDMETHOD(GetClipboardData) ( DWORD dwReserved,
  62. LPDATAOBJECT FAR* ppDataObject);
  63. STDMETHOD(DoVerb) ( LONG iVerb,
  64. LPMSG lpmsg,
  65. LPOLECLIENTSITE pActiveSite,
  66. LONG lindex,
  67. HWND hwndParent,
  68. const RECT FAR* lprcPosRect);
  69. STDMETHOD(EnumVerbs) ( IEnumOLEVERB FAR* FAR* ppenumOleVerb);
  70. STDMETHOD(Update) (void);
  71. STDMETHOD(IsUpToDate) (void);
  72. STDMETHOD(GetUserClassID) ( CLSID FAR* pClsid);
  73. STDMETHOD(GetUserType) ( DWORD dwFormOfType,
  74. LPOLESTR FAR* pszUserType);
  75. STDMETHOD(SetExtent) ( DWORD dwDrawAspect, LPSIZEL lpsizel);
  76. STDMETHOD(GetExtent) ( DWORD dwDrawAspect, LPSIZEL lpsizel);
  77. STDMETHOD(Advise)(IAdviseSink FAR* pAdvSink,
  78. DWORD FAR* pdwConnection);
  79. STDMETHOD(Unadvise)( DWORD dwConnection);
  80. STDMETHOD(EnumAdvise) ( LPENUMSTATDATA FAR* ppenumAdvise);
  81. STDMETHOD(GetMiscStatus) ( DWORD dwAspect,
  82. DWORD FAR* pdwStatus);
  83. STDMETHOD(SetColorScheme) ( LPLOGPALETTE lpLogpal);
  84. // IPeristStorage methods
  85. STDMETHOD(GetClassID) ( LPCLSID pClassID);
  86. STDMETHOD(IsDirty) (void);
  87. STDMETHOD(InitNew) ( LPSTORAGE pstg);
  88. STDMETHOD(Load) ( LPSTORAGE pstg);
  89. STDMETHOD(Save) ( LPSTORAGE pstgSave, BOOL fSameAsLoad);
  90. STDMETHOD(SaveCompleted) ( LPSTORAGE pstgNew);
  91. STDMETHOD(HandsOffStorage) ( void);
  92. CBareServer();
  93. private:
  94. ~CBareServer();
  95. ULONG _cRefs;
  96. IStorage * _pstg;
  97. IOleClientSite * _pclientsite;
  98. IOleAdviseHolder * _poaholder;
  99. };
  100. CBareServer::CBareServer()
  101. {
  102. _cRefs = 1;
  103. _pstg = NULL;
  104. _pclientsite = NULL;
  105. _poaholder = NULL;
  106. }
  107. CBareServer::~CBareServer()
  108. {
  109. if( _poaholder )
  110. {
  111. _poaholder->Release();
  112. _poaholder = NULL;
  113. }
  114. if( _pclientsite )
  115. {
  116. _pclientsite->Release();
  117. _pclientsite = NULL;
  118. }
  119. if( _pstg )
  120. {
  121. _pstg->Release();
  122. _pstg = NULL;
  123. }
  124. }
  125. // IUnknown methods
  126. STDMETHODIMP CBareServer::QueryInterface ( REFIID riid, LPVOID FAR* ppvObj)
  127. {
  128. HRESULT hresult = NOERROR;
  129. if( IsEqualIID(riid, IID_IUnknown) )
  130. {
  131. *ppvObj = (void *)(IOleObject *)this;
  132. }
  133. else if( IsEqualIID(riid, IID_IOleObject) )
  134. {
  135. *ppvObj = (void *)(IOleObject *)this;
  136. }
  137. else if( IsEqualIID(riid, IID_IDataObject) )
  138. {
  139. *ppvObj = (void *)(IDataObject *)this;
  140. }
  141. else if( IsEqualIID(riid, IID_IPersistStorage) )
  142. {
  143. *ppvObj = (void *)(IPersistStorage *)this;
  144. }
  145. else
  146. {
  147. hresult = E_NOINTERFACE;
  148. *ppvObj = NULL;
  149. }
  150. if( hresult == NOERROR )
  151. {
  152. AddRef();
  153. }
  154. return hresult;
  155. }
  156. STDMETHODIMP_(ULONG) CBareServer::AddRef(void)
  157. {
  158. _cRefs++;
  159. return _cRefs;
  160. }
  161. STDMETHODIMP_(ULONG) CBareServer::Release(void)
  162. {
  163. _cRefs--;
  164. if( _cRefs == 0 )
  165. {
  166. delete this;
  167. return 0;
  168. }
  169. return _cRefs;
  170. }
  171. // IDataObject methods
  172. STDMETHODIMP CBareServer::GetData ( LPFORMATETC pformatetcIn,
  173. LPSTGMEDIUM pmedium )
  174. {
  175. return E_NOTIMPL;
  176. }
  177. STDMETHODIMP CBareServer::GetDataHere ( LPFORMATETC pformatetc,
  178. LPSTGMEDIUM pmedium )
  179. {
  180. return E_NOTIMPL;
  181. }
  182. STDMETHODIMP CBareServer::QueryGetData ( LPFORMATETC pformatetc )
  183. {
  184. return E_NOTIMPL;
  185. }
  186. STDMETHODIMP CBareServer::GetCanonicalFormatEtc ( LPFORMATETC pformatetc,
  187. LPFORMATETC pformatetcOut)
  188. {
  189. return E_NOTIMPL;
  190. }
  191. STDMETHODIMP CBareServer::SetData ( LPFORMATETC pformatetc,
  192. LPSTGMEDIUM pmedium, BOOL fRelease)
  193. {
  194. return E_NOTIMPL;
  195. }
  196. STDMETHODIMP CBareServer::EnumFormatEtc ( DWORD dwDirection,
  197. LPENUMFORMATETC FAR* ppenumFormatEtc)
  198. {
  199. *ppenumFormatEtc = NULL;
  200. return E_NOTIMPL;
  201. }
  202. STDMETHODIMP CBareServer::DAdvise ( FORMATETC FAR* pFormatetc, DWORD advf,
  203. IAdviseSink FAR* pAdvSink,
  204. DWORD FAR* pdwConnection)
  205. {
  206. return E_NOTIMPL;
  207. }
  208. STDMETHODIMP CBareServer::DUnadvise ( DWORD dwConnection)
  209. {
  210. return E_NOTIMPL;
  211. }
  212. STDMETHODIMP CBareServer::EnumDAdvise ( LPENUMSTATDATA FAR* ppenumAdvise)
  213. {
  214. return E_NOTIMPL;
  215. }
  216. // IOleObject methods
  217. STDMETHODIMP CBareServer::SetClientSite ( LPOLECLIENTSITE pClientSite)
  218. {
  219. _pclientsite = pClientSite;
  220. _pclientsite->AddRef();
  221. return NOERROR;
  222. }
  223. STDMETHODIMP CBareServer::GetClientSite ( LPOLECLIENTSITE FAR* ppClientSite)
  224. {
  225. return E_NOTIMPL;
  226. }
  227. STDMETHODIMP CBareServer::SetHostNames ( LPCOLESTR szContainerApp,
  228. LPCOLESTR szContainerObj)
  229. {
  230. return NOERROR;
  231. }
  232. STDMETHODIMP CBareServer::Close ( DWORD reserved)
  233. {
  234. printf("close called\n");
  235. if( _poaholder )
  236. {
  237. _poaholder->SendOnClose();
  238. }
  239. CoDisconnectObject((IOleObject *)this, 0);
  240. return NOERROR;
  241. }
  242. STDMETHODIMP CBareServer::SetMoniker ( DWORD dwWhichMoniker, LPMONIKER pmk)
  243. {
  244. return NOERROR;
  245. }
  246. STDMETHODIMP CBareServer::GetMoniker ( DWORD dwAssign, DWORD dwWhichMoniker,
  247. LPMONIKER FAR* ppmk)
  248. {
  249. *ppmk = NULL;
  250. return E_NOTIMPL;
  251. }
  252. STDMETHODIMP CBareServer::InitFromData ( LPDATAOBJECT pDataObject,
  253. BOOL fCreation,
  254. DWORD dwReserved)
  255. {
  256. return E_NOTIMPL;
  257. }
  258. STDMETHODIMP CBareServer::GetClipboardData ( DWORD dwReserved,
  259. LPDATAOBJECT FAR* ppDataObject)
  260. {
  261. return E_NOTIMPL;
  262. }
  263. STDMETHODIMP CBareServer::DoVerb ( LONG iVerb,
  264. LPMSG lpmsg,
  265. LPOLECLIENTSITE pActiveSite,
  266. LONG lindex,
  267. HWND hwndParent,
  268. const RECT FAR* lprcPosRect)
  269. {
  270. return NOERROR;
  271. }
  272. STDMETHODIMP CBareServer::EnumVerbs ( IEnumOLEVERB FAR* FAR* ppenumOleVerb)
  273. {
  274. return OLE_S_USEREG;
  275. }
  276. STDMETHODIMP CBareServer::Update (void)
  277. {
  278. return NOERROR;
  279. }
  280. STDMETHODIMP CBareServer::IsUpToDate (void)
  281. {
  282. return NOERROR;
  283. }
  284. STDMETHODIMP CBareServer::GetUserClassID ( CLSID FAR* pClsid)
  285. {
  286. *pClsid = CLSID_BareServer;
  287. return NOERROR;
  288. }
  289. STDMETHODIMP CBareServer::GetUserType ( DWORD dwFormOfType,
  290. LPOLESTR FAR* pszUserType)
  291. {
  292. return OLE_S_USEREG;
  293. }
  294. STDMETHODIMP CBareServer::SetExtent ( DWORD dwDrawAspect, LPSIZEL lpsizel)
  295. {
  296. return NOERROR;
  297. }
  298. STDMETHODIMP CBareServer::GetExtent ( DWORD dwDrawAspect, LPSIZEL lpsizel)
  299. {
  300. return NOERROR;
  301. }
  302. STDMETHODIMP CBareServer::Advise (IAdviseSink FAR* pAdvSink,
  303. DWORD FAR* pdwConnection)
  304. {
  305. printf("Advise called\n");
  306. HRESULT hresult;
  307. if( !_poaholder )
  308. {
  309. hresult = CreateOleAdviseHolder(&_poaholder);
  310. }
  311. if( _poaholder )
  312. {
  313. hresult = _poaholder->Advise(pAdvSink, pdwConnection);
  314. }
  315. return hresult;
  316. }
  317. STDMETHODIMP CBareServer::Unadvise ( DWORD dwConnection)
  318. {
  319. if( _poaholder )
  320. {
  321. return _poaholder->Unadvise(dwConnection);
  322. }
  323. return E_FAIL;
  324. }
  325. STDMETHODIMP CBareServer::EnumAdvise ( LPENUMSTATDATA FAR* ppenumAdvise)
  326. {
  327. if( _poaholder )
  328. {
  329. return _poaholder->EnumAdvise(ppenumAdvise);
  330. }
  331. return E_FAIL;
  332. }
  333. STDMETHODIMP CBareServer::GetMiscStatus ( DWORD dwAspect,
  334. DWORD FAR* pdwStatus)
  335. {
  336. return OLE_S_USEREG;
  337. }
  338. STDMETHODIMP CBareServer::SetColorScheme ( LPLOGPALETTE lpLogpal)
  339. {
  340. return NOERROR;
  341. }
  342. // IPeristStorage methods
  343. STDMETHODIMP CBareServer::GetClassID ( LPCLSID pClassID)
  344. {
  345. *pClassID = CLSID_BareServer;
  346. return NOERROR;
  347. }
  348. STDMETHODIMP CBareServer::IsDirty (void)
  349. {
  350. return NOERROR;
  351. }
  352. STDMETHODIMP CBareServer::InitNew ( LPSTORAGE pstg)
  353. {
  354. printf("InitNew called\n");
  355. _pstg = pstg;
  356. _pstg->AddRef();
  357. return NOERROR;
  358. }
  359. STDMETHODIMP CBareServer::Load ( LPSTORAGE pstg)
  360. {
  361. _pstg = pstg;
  362. _pstg->AddRef();
  363. return NOERROR;
  364. }
  365. STDMETHODIMP CBareServer::Save ( LPSTORAGE pstgSave, BOOL fSameAsLoad)
  366. {
  367. return NOERROR;
  368. }
  369. STDMETHODIMP CBareServer::SaveCompleted ( LPSTORAGE pstgNew)
  370. {
  371. return NOERROR;
  372. }
  373. STDMETHODIMP CBareServer::HandsOffStorage ( void)
  374. {
  375. _pstg->Release();
  376. _pstg = NULL;
  377. return NOERROR;
  378. }
  379. // class factory
  380. class CBareFactory : public IClassFactory
  381. {
  382. public:
  383. STDMETHOD(QueryInterface) (REFIID iid, LPVOID FAR* ppvObj);
  384. STDMETHOD_(ULONG,AddRef) (void);
  385. STDMETHOD_(ULONG,Release) (void);
  386. STDMETHOD(CreateInstance) (LPUNKNOWN pUnkOuter, REFIID iid,
  387. LPVOID FAR* ppv);
  388. STDMETHOD(LockServer) ( BOOL fLock );
  389. CBareFactory();
  390. private:
  391. ULONG _cRefs;
  392. };
  393. CBareFactory::CBareFactory()
  394. {
  395. _cRefs = 1;
  396. }
  397. STDMETHODIMP CBareFactory::QueryInterface (REFIID iid, LPVOID FAR* ppvObj)
  398. {
  399. if( IsEqualIID(iid, IID_IClassFactory) ||
  400. IsEqualIID(iid, IID_IUnknown) )
  401. {
  402. *ppvObj = this;
  403. AddRef();
  404. return NOERROR;
  405. }
  406. else
  407. {
  408. *ppvObj = NULL;
  409. return E_NOINTERFACE;
  410. }
  411. }
  412. STDMETHODIMP_(ULONG) CBareFactory::AddRef (void)
  413. {
  414. _cRefs++;
  415. return _cRefs;
  416. }
  417. STDMETHODIMP_(ULONG) CBareFactory::Release (void)
  418. {
  419. _cRefs--;
  420. if( _cRefs == 0 )
  421. {
  422. delete this;
  423. return 0;
  424. }
  425. return _cRefs;
  426. }
  427. STDMETHODIMP CBareFactory::CreateInstance (LPUNKNOWN pUnkOuter, REFIID iid,
  428. LPVOID FAR* ppv)
  429. {
  430. *ppv = (IOleObject *)new CBareServer();
  431. return NOERROR;
  432. }
  433. STDMETHODIMP CBareFactory::LockServer ( BOOL fLock )
  434. {
  435. return NOERROR;
  436. }
  437. // Client Site
  438. class CBareClientSite : public IOleClientSite
  439. {
  440. public:
  441. STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
  442. STDMETHOD_(ULONG, AddRef)();
  443. STDMETHOD_(ULONG, Release)();
  444. // *** IOleClientSite methods ***
  445. STDMETHOD(SaveObject)();
  446. STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker,
  447. LPMONIKER FAR* ppmk);
  448. STDMETHOD(GetContainer)(LPOLECONTAINER FAR* ppContainer);
  449. STDMETHOD(ShowObject)();
  450. STDMETHOD(OnShowWindow)(BOOL fShow);
  451. STDMETHOD(RequestNewObjectLayout)();
  452. CBareClientSite();
  453. private:
  454. ULONG _cRefs;
  455. };
  456. CBareClientSite::CBareClientSite()
  457. {
  458. _cRefs = 1;
  459. }
  460. STDMETHODIMP CBareClientSite::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
  461. {
  462. if( IsEqualIID(riid, IID_IUnknown) ||
  463. IsEqualIID(riid, IID_IOleClientSite) )
  464. {
  465. *ppvObj = this;
  466. AddRef();
  467. return NOERROR;
  468. }
  469. else
  470. {
  471. *ppvObj = NULL;
  472. return E_NOINTERFACE;
  473. }
  474. }
  475. STDMETHODIMP_(ULONG) CBareClientSite::AddRef()
  476. {
  477. _cRefs++;
  478. return _cRefs;
  479. }
  480. STDMETHODIMP_(ULONG) CBareClientSite::Release()
  481. {
  482. _cRefs--;
  483. if( _cRefs == 0 )
  484. {
  485. delete this;
  486. return 0;
  487. }
  488. return _cRefs;
  489. }
  490. // *** IOleClientSite methods ***
  491. STDMETHODIMP CBareClientSite::SaveObject()
  492. {
  493. return NOERROR;
  494. }
  495. STDMETHODIMP CBareClientSite::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker,
  496. LPMONIKER FAR* ppmk)
  497. {
  498. *ppmk = NULL;
  499. return E_FAIL;
  500. }
  501. STDMETHODIMP CBareClientSite::GetContainer(LPOLECONTAINER FAR* ppContainer)
  502. {
  503. *ppContainer = NULL;
  504. return E_NOINTERFACE;
  505. }
  506. STDMETHODIMP CBareClientSite::ShowObject()
  507. {
  508. return NOERROR;
  509. }
  510. STDMETHODIMP CBareClientSite::OnShowWindow(BOOL fShow)
  511. {
  512. return NOERROR;
  513. }
  514. STDMETHODIMP CBareClientSite::RequestNewObjectLayout()
  515. {
  516. return NOERROR;
  517. }
  518. void RunServerSide(void)
  519. {
  520. DWORD dwcf = 0;
  521. HWND hwnd;
  522. MSG msg;
  523. IClassFactory *pcf = new CBareFactory();
  524. WNDCLASS wc;
  525. // Register Clipboard window class
  526. //
  527. wc.style = 0;
  528. wc.lpfnWndProc = DefWindowProc;
  529. wc.cbClsExtra = 0;
  530. wc.cbWndExtra = 4;
  531. wc.hInstance = NULL;
  532. wc.hIcon = NULL;
  533. wc.hCursor = NULL;
  534. wc.hbrBackground = NULL;
  535. wc.lpszMenuName = NULL;
  536. wc.lpszClassName = "BareServerWindow";
  537. // don't bother checking for errors
  538. RegisterClass(&wc);
  539. hwnd = CreateWindow("BareServerWindow","",WS_POPUP,CW_USEDEFAULT,
  540. CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  541. NULL,NULL,NULL,NULL);
  542. CoRegisterClassObject( CLSID_BareServer, pcf, CLSCTX_LOCAL_SERVER,
  543. REGCLS_MULTIPLEUSE, &dwcf );
  544. while (GetMessage(&msg, NULL, NULL, NULL))
  545. {
  546. TranslateMessage(&msg); /* Translates virtual key codes */
  547. DispatchMessage(&msg); /* Dispatches message to window */
  548. }
  549. CoRevokeClassObject(dwcf);
  550. }
  551. void RunContainerSide()
  552. {
  553. DWORD dwStart, dwFinish, i;
  554. HRESULT hresult;
  555. IStorage *pstg;
  556. IOleObject *poo;
  557. IOleClientSite *pcs;
  558. hresult = StgCreateDocfile(NULL, STGM_CREATE | STGM_READWRITE |
  559. STGM_SHARE_EXCLUSIVE,
  560. 0, &pstg);
  561. if( hresult != NOERROR )
  562. {
  563. printf("CreateDocFile failed! (%lx)\n", hresult);
  564. exit(hresult);
  565. }
  566. pcs = (IOleClientSite *)new CBareClientSite();
  567. // prime the server
  568. hresult = OleCreate( CLSID_BareServer, IID_IOleObject, OLERENDER_NONE,
  569. NULL, pcs, pstg, (void **)&poo);
  570. if( hresult != NOERROR )
  571. {
  572. printf("OleCreate failed! (%lx)\n", hresult);
  573. exit(hresult);
  574. }
  575. hresult = OleRun(poo);
  576. if( hresult != NOERROR )
  577. {
  578. printf("OleRun failed! (%lx)\n", hresult);
  579. exit(hresult);
  580. }
  581. poo->Close(0);
  582. poo->Release();
  583. poo = NULL;
  584. pcs->Release();
  585. pcs = NULL;
  586. for( i = 0; i < 100; i++ )
  587. {
  588. pcs = (IOleClientSite *)new CBareClientSite();
  589. dwStart = GetTickCount();
  590. hresult = OleCreate(CLSID_BareServer, IID_IOleObject, OLERENDER_NONE,
  591. NULL, pcs, pstg, (void **)&poo);
  592. if( hresult == NOERROR )
  593. {
  594. hresult = OleRun(poo);
  595. }
  596. dwFinish = GetTickCount();
  597. if( hresult == NOERROR )
  598. {
  599. poo->Close(0);
  600. poo->Release();
  601. poo = NULL;
  602. printf("%ld\n", dwFinish - dwStart);
  603. }
  604. else
  605. {
  606. printf("%ld failed! (%lx)\n", i, hresult);
  607. }
  608. pcs->Release();
  609. pcs = NULL;
  610. }
  611. pstg->Release();
  612. }
  613. int main( int argc, char **argv )
  614. {
  615. OleInitialize(NULL);
  616. if( argc == 2 )
  617. {
  618. // assume -Embedding
  619. RunServerSide();
  620. }
  621. else
  622. {
  623. RunContainerSide();
  624. }
  625. OleUninitialize();
  626. return 0;
  627. }