//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1993. // // File: attest.cpp // // Contents: upper layer tests to test the apartment thread model // // Classes: CBareFactory // CATTestIPtrs // // Functions: // ATTest // CreateEHelperQuery // LinkObjectQuery // GetClipboardQuery // CreateEHTest // LinkObjectTest // GetClipboardTest // OleLinkMethods // OleObjectMethods // PersistStorageMethods // DataObjectMethods // RunnableObjectMethods // ViewObject2Methods // OleCache2Methods // ExternalConnectionsMethods // CHECK_FOR_THREAD_ERROR (macro) // // History: dd-mmm-yy Author Comment // 04-Jan-95 t-ScottH author // //-------------------------------------------------------------------------- #include "oletest.h" #include "attest.h" #include "initguid.h" DEFINE_GUID(CLSID_SimpSvr, 0xBCF6D4A0, 0xBE8C, 0x1068, 0xB6, 0xD4, 0x00, 0xDD, 0x01, 0x0C, 0x05, 0x09); DEFINE_GUID(CLSID_StdOleLink, 0x00000300, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46); //+------------------------------------------------------------------------- // // Member: CATTestIPtrs::CATTestIPtrs(), public // // Synopsis: constructor // // Effects: // // Arguments: none // // Requires: // // Returns: // // Signals: // // Modifies: // // Derivation: // // Algorithm: // // History: dd-mmm-yy Author Comment // 12-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- CATTestIPtrs::CATTestIPtrs() { _pOleObject = NULL; _pOleCache2 = NULL; _pDataObject = NULL; _pPersistStorage = NULL; _pRunnableObject = NULL; _pViewObject2 = NULL; _pExternalConnection= NULL; _pOleLink = NULL; } //+------------------------------------------------------------------------- // // Member: CATTestIPtrs::Reset(), public // // Synopsis: resets all pointers to NULL // // Effects: releases all objects // // Arguments: none // // Requires: // // Returns: HRESULT // // Signals: // // Modifies: releases all objects and NULLs pointer // // Derivation: // // Algorithm: // // History: dd-mmm-yy Author Comment // 12-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- STDMETHODIMP CATTestIPtrs::Reset() { if (_pOleObject != NULL) { _pOleObject->Release(); _pOleObject = NULL; } if (_pOleCache2 != NULL) { _pOleCache2->Release(); _pOleCache2 = NULL; } if (_pDataObject != NULL) { _pDataObject->Release(); _pDataObject = NULL; } if (_pPersistStorage != NULL) { _pPersistStorage->Release(); _pPersistStorage = NULL; } if (_pRunnableObject != NULL) { _pRunnableObject->Release(); _pRunnableObject = NULL; } if (_pViewObject2 != NULL) { _pViewObject2->Release(); _pViewObject2 = NULL; } if (_pExternalConnection != NULL) { _pExternalConnection->Release(); _pExternalConnection = NULL; } if (_pOleLink != NULL) { _pOleLink->Release(); _pOleLink = NULL; } return NOERROR; } //+------------------------------------------------------------------------- // // Member: CBareFactory::CBareFactory, public // // Synopsis: constructor for the class factory // // Effects: // // Arguments: none // // Returns: void // // Modifies: initializes _cRefs // // Derivation: IClassFactory // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- CBareFactory::CBareFactory() { _cRefs = 1; } //+------------------------------------------------------------------------- // // Member: CBareFactory::QueryInterface, public // // Synopsis: only IUnknown and IClassFactory are supported // // Effects: // // Arguments: [iid] -- the requested interface // [ppvObj]-- where to put the interface pointer // // Returns: HRESULT // // Modifies: ppvObj // // Derivation: IClassFactory // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- 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; } } //+------------------------------------------------------------------------- // // Member: CBareFactory::AddRef, public // // Synopsis: increments the reference count // // Effects: // // Arguments: none // // Returns: ULONG -- the new reference count // // Modifies: // // Derivation: IClassFactory // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- STDMETHODIMP_(ULONG) CBareFactory::AddRef (void) { _cRefs++; return _cRefs; } //+------------------------------------------------------------------------- // // Member: CBareFactory::Release, public // // Synopsis: decrements the reference count // // Effects: deletes object when reference count is zero // // Arguments: none // // Returns: ULONG -- the new reference count // // Modifies: // // Derivation: IClassFactory // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- STDMETHODIMP_(ULONG) CBareFactory::Release (void) { _cRefs--; if( _cRefs == 0 ) { delete this; return 0; } return _cRefs; } //+------------------------------------------------------------------------- // // Member: CBareFactory::CreateInstance, public // // Synopsis: does nothing // // Effects: // // Arguments: [pUnkOuter] -- the controlling unknown for aggregation // [iid] -- the requested interface // [ppvObj] -- where to put the interface pointer // // Returns: HRESULT // // Modifies: // // Derivation: IClassFactory // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- STDMETHODIMP CBareFactory::CreateInstance ( LPUNKNOWN pUnkOuter, REFIID iid, LPVOID FAR* ppv) { return E_NOTIMPL;; } //+------------------------------------------------------------------------- // // Member: CBareFactory::LockServer, public // // Synopsis: does nothing // // Effects: // // Arguments: [flock] -- specifies the lock count // // Returns: HRESULT // // Modifies: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- STDMETHODIMP CBareFactory::LockServer ( BOOL fLock ) { return NOERROR; } //+------------------------------------------------------------------------- // // Function: CHECK_FOR_THREAD_ERROR (macro) // // Synopsis: make sure that the hresult is RPC_E_WRONG_THREAD // // Effects: exits thread if hresult != RPC_E_WRONG // // Arguments: [hresult] -- error code // // Requires: // // Returns: // // Signals: // // Modifies: // // Algorithm: // // History: dd-mmm-yy Author Comment // 09-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- #define CHECK_FOR_THREAD_ERROR(hresult) \ if (hresult != RPC_E_WRONG_THREAD) \ { \ OutputString("Expected RPC_E_WRONG_THREAD but received %x.\r\n", hresult); \ assert(hresult == RPC_E_WRONG_THREAD); \ ExitThread((DWORD)E_UNEXPECTED); \ } // globals CATTestIPtrs g_IPtrs; //+------------------------------------------------------------------------- // // Function: ATTest // // Synopsis: calls the query functions to get pointers to the // supported interfaces // // Effects: // // Arguments: void // // Requires: // // Returns: void // // Signals: // // Modifies: globals g_IPtrs._pOleObject // g_IPtrs._pPersistStorage // g_IPtrs._pDataObject // g_IPtrs._pRunnableObject // g_IPtrs._pViewObject2 // g_IPtrs._pOleCache2 // g_IPtrs._pExternalConnection // g_IPtrs._pOleLink // // Algorithm: // // History: dd-mmm-yy Author Comment // 06-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- void ATTest(void) { HRESULT hresult; hresult = OleInitialize(NULL); assert(hresult == S_OK); // the functions CreateEHelperQuery, LinkObjectQuery and // GetClipboardQuery return either NOERROR or E_UNEXPECTED. // NOERROR is defined as 0 hresult = CreateEHelperQuery(); g_IPtrs.Reset(); hresult |= LinkObjectQuery(); g_IPtrs.Reset(); hresult |= GetClipboardQuery(); vApp.Reset(); vApp.m_wparam = (hresult == NOERROR) ? TEST_SUCCESS : TEST_FAILURE; vApp.m_lparam = (LPARAM)hresult; vApp.m_message = WM_TESTEND; HandleTestEnd(); OleUninitialize(); return; } //+------------------------------------------------------------------------- // // Function: GetClipboardQuery // // Synopsis: get a pointer to IDataObject interface, create a new thread // to test proper exit/error codes, wait for the thread to // complete and return the thread's exit code // // Effects: creates new thread // // Arguments: none // // Requires: // // Returns: HRESULT // // Signals: // // Modifies: g_IPtrs._pDataObject // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- HRESULT GetClipboardQuery(void) { HRESULT hresult; HANDLE hTestInterfaceThread; DWORD dwThreadId = 0; DWORD dwThreadExitCode; hresult = OleGetClipboard( &g_IPtrs._pDataObject ); assert(hresult == S_OK ); hTestInterfaceThread = CreateThread( NULL, // security attributes 0, // stack size (default) (LPTHREAD_START_ROUTINE)&GetClipboardTest, // address of thread function NULL, // arguments of thread function 0, // creation flags &dwThreadId ); // address of new thread ID assert(hTestInterfaceThread != NULL); //ensure that we have a valid thread handle // wait for the thread object so we can examine the error code WaitForSingleObject(hTestInterfaceThread, INFINITE); GetExitCodeThread(hTestInterfaceThread, &dwThreadExitCode); hresult = (HRESULT)dwThreadExitCode; CloseHandle(hTestInterfaceThread); return hresult; } //+------------------------------------------------------------------------- // // Function: LinkObjectQuery // // Synopsis: get a pointer to available interfaces, create a new thread // to test proper exit/error codes, wait for the thread to // complete and return the thread's exit code // // Effects: // // Arguments: none // // Requires: // // Returns: HRESULT // // Signals: // // Modifies: g_IPtrs._pOleObject // g_IPtrs._pPersistStorage // g_IPtrs._pDataObject // g_IPtrs._pRunnableObject // g_IPtrs._pViewObject2 // g_IPtrs._pOleCache2 // g_IPtrs._pOleLink // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- HRESULT LinkObjectQuery(void) { HRESULT hresult; HANDLE hTestInterfaceThread; DWORD dwThreadId = 0; DWORD dwThreadExitCode; hresult = CoCreateInstance( CLSID_StdOleLink, // class ID of the object class NULL, // controlling unknown fro aggregation CLSCTX_INPROC, // context to run executables IID_IOleObject, // the requested interface (void **)&g_IPtrs._pOleObject); // where to store pointer to interface assert(hresult == S_OK); hresult = g_IPtrs._pOleObject->QueryInterface(IID_IPersistStorage, (void **)&g_IPtrs._pPersistStorage); assert(hresult == S_OK); hresult = g_IPtrs._pOleObject->QueryInterface(IID_IDataObject, (void **)&g_IPtrs._pDataObject); assert(hresult == S_OK); hresult = g_IPtrs._pOleObject->QueryInterface(IID_IRunnableObject, (void **)&g_IPtrs._pRunnableObject); assert(hresult == S_OK); hresult = g_IPtrs._pOleObject->QueryInterface(IID_IViewObject2, (void **)&g_IPtrs._pViewObject2); assert(hresult == S_OK); hresult = g_IPtrs._pOleObject->QueryInterface(IID_IOleCache2, (void **)&g_IPtrs._pOleCache2); assert(hresult == S_OK); hresult = g_IPtrs._pOleObject->QueryInterface(IID_IOleLink, (void **)&g_IPtrs._pOleLink); assert(hresult == S_OK); hTestInterfaceThread = CreateThread( NULL, // security attributes 0, // stack size (default) (LPTHREAD_START_ROUTINE)&LinkObjectTest,// address of thread function NULL, // arguments of thread function 0, // creation flags &dwThreadId ); // address of new thread ID assert(hTestInterfaceThread != NULL); //ensure that we have a valid thread handle // wait for the thread object so we can examine the error code WaitForSingleObject(hTestInterfaceThread, INFINITE); GetExitCodeThread(hTestInterfaceThread, &dwThreadExitCode); hresult = (HRESULT)dwThreadExitCode; CloseHandle(hTestInterfaceThread); return hresult; } //+------------------------------------------------------------------------- // // Function: CreateEHelperQuery // // Synopsis: get a pointer to available interfaces, create a new thread // to test proper exit/error codes, wait for the thread to // complete and return the thread's exit code // // Effects: // // Arguments: none // // Requires: // // Returns: HRESULT // // Signals: // // Modifies: g_IPtrs._pOleObject // g_IPtrs._pPersistStorage // g_IPtrs._pDataObject // g_IPtrs._pRunnableObject // g_IPtrs._pViewObject2 // g_IPtrs._pOleCache2 // g_IPtrs._pExternalConnection // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: // //-------------------------------------------------------------------------- HRESULT CreateEHelperQuery(void) { HRESULT hresult; HANDLE hTestInterfaceThread; DWORD dwThreadId = 0; DWORD dwThreadExitCode; CBareFactory *pCF = new CBareFactory; // must use EMBDHLP_DELAYCREATE flag otherwise API will try pCF->CreateInstance // and verify pointer. CBareFactory::CreateInstance is not implemented! hresult = OleCreateEmbeddingHelper( CLSID_SimpSvr, // class ID of the server NULL, // controlling unknown for aggregation EMBDHLP_INPROC_SERVER | EMBDHLP_DELAYCREATE,// flags pCF, // pointer to server's class factory IID_IOleObject, // the requested interface (void **)&g_IPtrs._pOleObject ); // where to store pointer to interface assert(hresult == S_OK); hresult = g_IPtrs._pOleObject->QueryInterface(IID_IPersistStorage, (void **)&g_IPtrs._pPersistStorage); assert(hresult == S_OK); hresult = g_IPtrs._pOleObject->QueryInterface(IID_IDataObject, (void **)&g_IPtrs._pDataObject); assert(hresult == S_OK); hresult = g_IPtrs._pOleObject->QueryInterface(IID_IRunnableObject, (void **)&g_IPtrs._pRunnableObject); assert(hresult == S_OK); hresult = g_IPtrs._pOleObject->QueryInterface(IID_IViewObject2, (void **)&g_IPtrs._pViewObject2); assert(hresult == S_OK); hresult = g_IPtrs._pOleObject->QueryInterface(IID_IOleCache2, (void **)&g_IPtrs._pOleCache2); assert(hresult == S_OK); hresult = g_IPtrs._pOleObject->QueryInterface(IID_IExternalConnection, (void **)&g_IPtrs._pExternalConnection); assert(hresult == S_OK); hTestInterfaceThread = CreateThread( NULL, // security attributes 0, // stack size (default) (LPTHREAD_START_ROUTINE)&CreateEHTest, // address of thread function NULL, // arguments of thread function 0, // creation flags &dwThreadId ); // address of new thread ID assert(hTestInterfaceThread != NULL); //ensure that we have a valid thread handle // wait for the thread object so we can examine the exit/error code WaitForSingleObject(hTestInterfaceThread, INFINITE); GetExitCodeThread(hTestInterfaceThread, &dwThreadExitCode); hresult = (HRESULT)dwThreadExitCode; CloseHandle(hTestInterfaceThread); pCF->Release(); return hresult; } //+------------------------------------------------------------------------- // // Function: GetClipBoardTest // // Synopsis: calls interface method functions and exits thread // // Effects: // // Arguments: none // // Requires: // // Returns: void // // Signals: // // Modifies: // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: all the interface methods are being called from a thread // which is not the owner. The methods should return // RPC_E_WRONG_THREAD error. If an interface method does not // return such error message, it is asserted and the // thread is exited with an E_UNEXPECTED exit code. // //-------------------------------------------------------------------------- void GetClipboardTest(void) { DataObjectMethods(); ExitThread((DWORD)NOERROR); } //+------------------------------------------------------------------------- // // Function: LinkObjectTest // // Synopsis: calls interface method functions and exits thread // // Effects: // // Arguments: none // // Requires: // // Returns: void // // Signals: // // Modifies: // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: all the interface methods are being called from a thread // which is not the owner. The methods should return // RPC_E_WRONG_THREAD error. If an interface method does not // return such error message, it is asserted and the // thread is exited with an E_UNEXPECTED exit code. // //-------------------------------------------------------------------------- void LinkObjectTest(void) { OleObjectMethods(); PersistStorageMethods(); DataObjectMethods(); RunnableObjectMethods(); OleCache2Methods(); ViewObject2Methods(); OleLinkMethods(); ExitThread((DWORD)NOERROR); } //+------------------------------------------------------------------------- // // Function: CreateEHTest // // Synopsis: calls interface method functions and exits thread // // Effects: // // Arguments: none // // Requires: // // Returns: void // // Signals: // // Modifies: // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: all the interface methods are being called from a thread // which is not the owner. The methods should return // RPC_E_WRONG_THREAD error. If an interface method does not // return such error message, it is asserted and the // thread is exited with an E_UNEXPECTED exit code. // //-------------------------------------------------------------------------- void CreateEHTest(void) { ExternalConnectionsMethods(); OleObjectMethods(); PersistStorageMethods(); DataObjectMethods(); RunnableObjectMethods(); ViewObject2Methods(); OleCache2Methods(); ExitThread((DWORD)NOERROR); } //+------------------------------------------------------------------------- // // Function: OleLinkMethods // // Synopsis: Calls all public IOleLink interface methods with NULL // parameters. // // Effects: // // Arguments: none // // Requires: // // Returns: void // // Signals: // // Modifies: // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: The interface methods are called on the wrong thread, thus // an RPC_E_WRONG_THREAD error should be returned from each // method. If not, we assert and then exit the thread. // //-------------------------------------------------------------------------- void OleLinkMethods(void) { HRESULT hresult; hresult = g_IPtrs._pOleLink->SetUpdateOptions(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleLink->GetUpdateOptions(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleLink->SetSourceMoniker(NULL, CLSID_NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleLink->GetSourceMoniker(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleLink->SetSourceDisplayName(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleLink->GetSourceDisplayName(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleLink->BindToSource(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleLink->BindIfRunning(); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleLink->GetBoundSource(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleLink->UnbindSource(); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleLink->Update(NULL); CHECK_FOR_THREAD_ERROR(hresult); return; } //+------------------------------------------------------------------------- // // Function: ExternalConnectionsMethods // // Synopsis: Calls all public IExternalConnection interface methods with NULL // parameters. // // Effects: // // Arguments: none // // Requires: // // Returns: void // // Signals: // // Modifies: // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: The interface methods are called on the wrong thread, thus // an RPC_E_WRONG_THREAD error should be returned from each // method. If not, we assert and then exit the thread. // //-------------------------------------------------------------------------- void ExternalConnectionsMethods(void) { HRESULT hresult; hresult = (HRESULT)g_IPtrs._pExternalConnection->AddConnection(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = (HRESULT)g_IPtrs._pExternalConnection->ReleaseConnection(NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); return; } //+------------------------------------------------------------------------- // // Function: OleObjectMethods // // Synopsis: Calls all public IOleObject interface methods with NULL // parameters. // // Effects: // // Arguments: none // // Requires: // // Returns: void // // Signals: // // Modifies: // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: The interface methods are called on the wrong thread, thus // an RPC_E_WRONG_THREAD error should be returned from each // method. If not, we assert and then exit the thread. // //-------------------------------------------------------------------------- void OleObjectMethods(void) { HRESULT hresult; hresult = g_IPtrs._pOleObject->SetClientSite(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->GetClientSite(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->SetHostNames(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->Close(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->SetMoniker(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->GetMoniker(NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->InitFromData(NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->GetClipboardData(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->DoVerb(NULL, NULL, NULL, NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->EnumVerbs(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->Update(); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->IsUpToDate(); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->GetUserClassID(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->GetUserType(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->SetExtent(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->GetExtent(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->Advise(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->Unadvise(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->EnumAdvise(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->GetMiscStatus(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleObject->SetColorScheme(NULL); CHECK_FOR_THREAD_ERROR(hresult); return; } //+------------------------------------------------------------------------- // // Function: PersistStorageMethods // // Synopsis: Calls all public IPersistStorage interface methods with NULL // parameters. // // Effects: // // Arguments: none // // Requires: // // Returns: void // // Signals: // // Modifies: // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: The interface methods are called on the wrong thread, thus // an RPC_E_WRONG_THREAD error should be returned from each // method. If not, we assert and then exit the thread. // //-------------------------------------------------------------------------- void PersistStorageMethods(void) { HRESULT hresult; hresult = g_IPtrs._pPersistStorage->GetClassID(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pPersistStorage->IsDirty(); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pPersistStorage->InitNew(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pPersistStorage->Load(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pPersistStorage->Save(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pPersistStorage->SaveCompleted(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pPersistStorage->HandsOffStorage(); CHECK_FOR_THREAD_ERROR(hresult); return; } //+------------------------------------------------------------------------- // // Function: DataObjectMethods // // Synopsis: Calls all public IDataObject interface methods with NULL // parameters. // // Effects: // // Arguments: none // // Requires: // // Returns: void // // Signals: // // Modifies: // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: The interface methods are called on the wrong thread, thus // an RPC_E_WRONG_THREAD error should be returned from each // method. If not, we assert and then exit the thread. // //-------------------------------------------------------------------------- void DataObjectMethods(void) { HRESULT hresult; hresult = g_IPtrs._pDataObject->GetData(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pDataObject->GetDataHere(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pDataObject->QueryGetData(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pDataObject->GetCanonicalFormatEtc(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pDataObject->SetData(NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pDataObject->EnumFormatEtc(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pDataObject->DAdvise(NULL, NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pDataObject->DUnadvise(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pDataObject->EnumDAdvise(NULL); CHECK_FOR_THREAD_ERROR(hresult); return; } //+------------------------------------------------------------------------- // // Function: RunnableObjectMethods // // Synopsis: Calls all public IRunnableObject interface methods with NULL // parameters. // // Effects: // // Arguments: none // // Requires: // // Returns: void // // Signals: // // Modifies: // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: The interface methods are called on the wrong thread, thus // an RPC_E_WRONG_THREAD error should be returned from each // method. If not, we assert and then exit the thread. // //-------------------------------------------------------------------------- void RunnableObjectMethods(void) { HRESULT hresult; hresult = g_IPtrs._pRunnableObject->GetRunningClass(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pRunnableObject->Run(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pRunnableObject->IsRunning(); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pRunnableObject->LockRunning(NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pRunnableObject->SetContainedObject(NULL); CHECK_FOR_THREAD_ERROR(hresult); return; } //+------------------------------------------------------------------------- // // Function: ViewObject2Methods // // Synopsis: Calls all public IViewObject2 interface methods with NULL // parameters. // // Effects: // // Arguments: none // // Requires: // // Returns: void // // Signals: // // Modifies: // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: The interface methods are called on the wrong thread, thus // an RPC_E_WRONG_THREAD error should be returned from each // method. If not, we assert and then exit the thread. // //-------------------------------------------------------------------------- void ViewObject2Methods(void) { HRESULT hresult; hresult = g_IPtrs._pViewObject2->Draw(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pViewObject2->GetColorSet(NULL, NULL, NULL, NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pViewObject2->Freeze(NULL, NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pViewObject2->Unfreeze(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pViewObject2->SetAdvise(NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pViewObject2->GetAdvise(NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pViewObject2->GetExtent(NULL, NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); return; } //+------------------------------------------------------------------------- // // Function: OleCache2Methods // // Synopsis: Calls all public IOleCache2 interface methods with NULL // parameters. // // Effects: // // Arguments: none // // Requires: // // Returns: void // // Signals: // // Modifies: // // Algorithm: // // History: dd-mmm-yy Author Comment // 11-Jan-95 t-ScottH author // // Notes: // Notes: The interface methods are called on the wrong thread, thus // an RPC_E_WRONG_THREAD error should be returned from each // method. If not, we assert and then exit the thread. // //-------------------------------------------------------------------------- void OleCache2Methods(void) { HRESULT hresult; hresult = g_IPtrs._pOleCache2->Cache(NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleCache2->Uncache(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleCache2->EnumCache(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleCache2->InitCache(NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleCache2->SetData(NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleCache2->UpdateCache(NULL, NULL, NULL); CHECK_FOR_THREAD_ERROR(hresult); hresult = g_IPtrs._pOleCache2->DiscardCache(NULL); CHECK_FOR_THREAD_ERROR(hresult); return; }