//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1993. // // File: rotut.cxx // // Contents: Unit Test for ROT // // Classes: MISSING // // Functions: MISSING // // History: 16-Oct-93 Ricksa Created // 31-Dec-93 ErikGav Chicago port // //-------------------------------------------------------------------------- #include #include #include #include class CRotTestObject : public IUnknown { public: CRotTestObject(WCHAR *pwszID); // IUnknown Interface STDMETHOD(QueryInterface)(REFIID riid, void **ppv); STDMETHOD_(ULONG, AddRef)(void); STDMETHOD_(ULONG, Release)(void); private: WCHAR _awcID[256]; ULONG _cRefs; }; CRotTestObject::CRotTestObject(WCHAR *pwszID) : _cRefs(1) { wcscpy(_awcID, pwszID); } STDMETHODIMP CRotTestObject::QueryInterface(REFIID riid, void **ppv) { if (memcmp((void *) &riid, (void *) &IID_IUnknown, sizeof(GUID)) == 0) { _cRefs++; *ppv = (IUnknown *) this; return S_OK; } *ppv = NULL; return E_NOINTERFACE; } STDMETHODIMP_(ULONG) CRotTestObject::AddRef(void) { _cRefs++; return (ULONG) _awcID; } STDMETHODIMP_(ULONG) CRotTestObject::Release(void) { ULONG cRefs = --_cRefs; if (cRefs == 0) { delete this; } return cRefs; } // // Test Running Object Table // // BUGBUG: Need to test enumerator BOOL TestROT(REFCLSID clsid) { XUnknown punk2; XMoniker pmk; XMoniker pmk2; XRunningObjectTable prot; XEnumMoniker penummk; HRESULT hr = GetRunningObjectTable(0, &prot); TEST_FAILED_HR(FAILED(hr), "GetRunningObjectTable failed!") // Make sure that we can do something on the pointer that // we got back. prot->AddRef(); prot->Release(); // Create an IUnknown pointer for the class. IUnknown *punk = new CRotTestObject(L"First Test Object"); hr = CreateItemMoniker(L"\\", wszPid, &pmk2); TEST_FAILED_HR(FAILED(hr), "CreateItemMoniker for \\Bob failed") // Do a get object to make sure that this is not in the ROT already hr = prot->GetObject(pmk2, &punk2); TEST_FAILED_HR(SUCCEEDED(hr), "GetObject on nonexistent succeeded") // Cookie for deregistering object DWORD dwRegister; hr = prot->Register(0, punk, pmk2, &dwRegister); TEST_FAILED_HR(FAILED(hr), "Register in ROT for \\PID failed") hr = prot->IsRunning(pmk2); TEST_FAILED_HR((hr != S_OK), "Unexpected return from IsRunning") // Test Get Object hr = prot->GetObject(pmk2, &punk2); TEST_FAILED_HR((hr != S_OK), "Unexpected from GetObject") // Confirm object identity WCHAR *pwszID = (WCHAR *) punk2->AddRef(); TEST_FAILED_HR((wcscmp(pwszID, L"First Test Object") != 0), "GetObject ID is invalid"); // Make sure pointer == original pointer TEST_FAILED((punk2 != punk), "GetObject Pointers are not equal!") // Clean up punk2 -- two releases because +1 on return and +1 on // addref to get id string punk2->Release(); punk2.Set(NULL); // Test set the time FILETIME filetime; memset(&filetime, 'A', sizeof(filetime)); hr = prot->NoteChangeTime(dwRegister, &filetime); TEST_FAILED_HR((hr != S_OK), "NoteChangeTime Failed") // Test get the time FILETIME filetime2; hr = prot->GetTimeOfLastChange(pmk2, &filetime2); TEST_FAILED_HR((hr != S_OK), "NoteChangeTime Failed") TEST_FAILED((memcmp(&filetime, &filetime2, sizeof(filetime)) != 0), "GetTimeOfLastChange != NoteChangeTime value") // Enumerate all the running monikers hr = prot->EnumRunning(&penummk); TEST_FAILED_HR(FAILED(hr), "EnumRunning Failed") // Cycle through running object table BOOL fFound = FALSE; int cIdx = 0; int cOurMoniker; while (SUCCEEDED(hr = penummk->Next(1, &pmk, NULL)) && (hr != S_FALSE)) { if (pmk2->IsEqual(pmk) == S_OK) { fFound = TRUE; cOurMoniker = cIdx; } pmk.Set(NULL); cIdx++; } TEST_FAILED_HR(FAILED(hr), "ROT Moniker Enumeration ended in failure") TEST_FAILED((!fFound), "Did not find our moniker in the table"); // Reset the pointer hr = penummk->Reset(); TEST_FAILED_HR(FAILED(hr), "ROT IEnumMoniker::Reset Failed"); // Skip to our moniker hr = penummk->Skip(cOurMoniker); TEST_FAILED_HR(FAILED(hr), "ROT IEnumMoniker::Skip Failed"); // Read it from the enumerator hr = penummk->Next(1, &pmk, NULL); TEST_FAILED_HR(FAILED(hr), "ROT IEnumMoniker::Next Failed"); TEST_FAILED((pmk2->IsEqual(pmk) != S_OK), "ROT IEnumMoniker::Next after skip monikers !="); pmk.Set(NULL); // Clean up enumerator penummk.Set(NULL); // Test duplicate registration DWORD dwRegister2; hr = prot->Register(0, punk, pmk2, &dwRegister2); TEST_FAILED_HR((hr != MK_S_MONIKERALREADYREGISTERED), "2nd Register in ROT for \\PID failed") // Revoke non-existent object DWORD dwDummy = (DWORD) &dwRegister2; hr = prot->Revoke(dwDummy); TEST_FAILED_HR((hr != E_INVALIDARG), "Revoke for bad item wrong result") // Revoke the object hr = prot->Revoke(dwRegister); TEST_FAILED_HR(FAILED(hr), "Revoke of first reg in ROT failed") // Revoke duplicate registration hr = prot->Revoke(dwRegister2); TEST_FAILED_HR(FAILED(hr), "2nd Revoke in ROT failed") // Make sure it is no longer running hr = prot->IsRunning(pmk2); TEST_FAILED_HR((hr != S_FALSE), "Revoked ROT entry unexpected error") // If we get to here the test passed return FALSE; }