799 lines
21 KiB
C++
799 lines
21 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1993 - 1993.
|
||
|
//
|
||
|
// File: tmoniker.cxx
|
||
|
//
|
||
|
// Contents:
|
||
|
//
|
||
|
// Classes:
|
||
|
//
|
||
|
// Functions:
|
||
|
//
|
||
|
// History: 12-31-93 ErikGav Chicago port
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
// moniker.cxx : various tests related to monikers...
|
||
|
//
|
||
|
|
||
|
#pragma optimize("",off)
|
||
|
#include <stdio.h>
|
||
|
#include <windows.h>
|
||
|
#include <ole2.h>
|
||
|
#include "olebind.hxx"
|
||
|
#include "tmoniker.h"
|
||
|
|
||
|
STDAPI_(LPSTREAM) CreateMemStm(DWORD cb, LPHANDLE phdl);
|
||
|
|
||
|
// BUGBUG: Make this test more extensive -- all operations on a
|
||
|
// bind context should be verified.
|
||
|
BOOL TestBindCtx( void )
|
||
|
{
|
||
|
XBindCtx pbc;
|
||
|
XUnknown punk;
|
||
|
XUnknown punk2;
|
||
|
|
||
|
HRESULT hr = CreateBindCtx(0, &pbc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CreateBindCtx Failed")
|
||
|
|
||
|
hr = pbc->RegisterObjectParam(L"Key1", pbc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "RegisterObjectParam Failed")
|
||
|
|
||
|
hr = pbc->GetObjectParam(L"Key1", &punk2);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "GetObjectParam Failed")
|
||
|
|
||
|
TEST_FAILED((pbc != punk2),
|
||
|
"Failure to get registered object parameter")
|
||
|
|
||
|
// BUGBUG: What do we test for here?
|
||
|
punk2.Set(NULL);
|
||
|
|
||
|
hr = pbc->GetObjectParam(L"Key2", &punk2);
|
||
|
|
||
|
TEST_FAILED_HR((hr != E_FAIL),
|
||
|
"GetObjectParam with bad key did not return an error")
|
||
|
|
||
|
TEST_FAILED((punk2 != NULL),
|
||
|
"Bad GetObjectParam did not return NULL for object")
|
||
|
|
||
|
hr = pbc->RegisterObjectParam(L"Key2", pbc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "Second RegisterObjectParam Failed")
|
||
|
|
||
|
hr = pbc->GetObjectParam(L"Key2", &punk);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "GetObjectParam on second Failed")
|
||
|
|
||
|
TEST_FAILED((pbc != punk),
|
||
|
"Failure on second to get registered object parameter")
|
||
|
|
||
|
// BUGBUG: What do we check?
|
||
|
punk.Set(NULL);
|
||
|
|
||
|
hr = pbc->RevokeObjectParam(L"Key2");
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"RevokeObjectParam of Key2 Failed")
|
||
|
|
||
|
hr = pbc->GetObjectParam(L"Key2", &punk);
|
||
|
|
||
|
TEST_FAILED_HR((hr != E_FAIL),
|
||
|
"Get of revoked Key2 returned success")
|
||
|
|
||
|
TEST_FAILED((punk != NULL),
|
||
|
"Value returned on get of revoked key2")
|
||
|
|
||
|
hr = pbc->RevokeObjectParam(L"Key1");
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"RevokeObjectParam of Key1 Failed")
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL VerifyFileMoniker(LPWSTR wcsFile)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
XMoniker pmk;
|
||
|
XBindCtx pbc;
|
||
|
LPWSTR wcsDisplayName = NULL;
|
||
|
|
||
|
hr = CreateBindCtx(0,&pbc);
|
||
|
TEST_FAILED_HR(FAILED(hr), "CreateBindCtx");
|
||
|
|
||
|
hr = CreateFileMoniker(wcsFile,&pmk);
|
||
|
TEST_FAILED_HR(FAILED(hr), "CreateFileMoniker failed");
|
||
|
|
||
|
hr = pmk->GetDisplayName(pbc,NULL,&wcsDisplayName);
|
||
|
TEST_FAILED_HR(FAILED(hr), "GetDisplayName failed");
|
||
|
|
||
|
if (0 != wcscmp(wcsFile,wcsDisplayName))
|
||
|
{
|
||
|
wsprintfA(&wszErrBuf[0], "(%S) doesn't match displayname (%S)",wcsFile,wcsDisplayName);
|
||
|
MessageBoxA(NULL, &wszErrBuf[0], szOleBindError, MB_OK);
|
||
|
hr = E_FAIL;
|
||
|
}
|
||
|
|
||
|
CoTaskMemFree(wcsDisplayName);
|
||
|
return(hr);
|
||
|
}
|
||
|
BOOL TestMoniker(LPWSTR pszPath1, LPWSTR pszPath2)
|
||
|
{
|
||
|
XUnknown pUnk;
|
||
|
XUnknown pUnk1;
|
||
|
XBindCtx pbc;
|
||
|
XMoniker pmk1;
|
||
|
XMoniker pmk2;
|
||
|
XMoniker pmk3;
|
||
|
XMoniker pmk4;
|
||
|
XMoniker pmk5;
|
||
|
XMoniker pmk6;
|
||
|
XMoniker pmkItem1;
|
||
|
XMoniker pmkItem2;
|
||
|
XMoniker pmkAnti;
|
||
|
XStream pStm;
|
||
|
XOleObject pObj;
|
||
|
XMalloc pIMalloc;
|
||
|
XMoniker pmkLong1;
|
||
|
XMoniker pmkLong2;
|
||
|
XRunningObjectTable prot;
|
||
|
|
||
|
ULONG chEaten;
|
||
|
LPWSTR szName;
|
||
|
LARGE_INTEGER large_int;
|
||
|
HRESULT hr;
|
||
|
|
||
|
//
|
||
|
// Test the dotdot eating methods
|
||
|
//
|
||
|
VerifyFileMoniker(L".");
|
||
|
VerifyFileMoniker(L"..\\");
|
||
|
|
||
|
VerifyFileMoniker(L"foo.bar");
|
||
|
VerifyFileMoniker(L".foo.bar");
|
||
|
VerifyFileMoniker(L".foo..bar");
|
||
|
VerifyFileMoniker(L"..foo.bar");
|
||
|
VerifyFileMoniker(L"..foo..bar");
|
||
|
|
||
|
VerifyFileMoniker(L"foo\\bar");
|
||
|
VerifyFileMoniker(L"foo\\.bar");
|
||
|
VerifyFileMoniker(L"foo\\..bar");
|
||
|
|
||
|
VerifyFileMoniker(L".foo\\bar");
|
||
|
VerifyFileMoniker(L".foo\\.bar");
|
||
|
VerifyFileMoniker(L".foo\\..bar");
|
||
|
|
||
|
VerifyFileMoniker(L"..foo\\bar");
|
||
|
VerifyFileMoniker(L"..foo\\.bar");
|
||
|
VerifyFileMoniker(L"..foo\\..bar");
|
||
|
|
||
|
VerifyFileMoniker(L"...foo\\bar");
|
||
|
VerifyFileMoniker(L"...foo\\.bar");
|
||
|
VerifyFileMoniker(L"...foo\\..bar");
|
||
|
|
||
|
VerifyFileMoniker(L"\\foo\\bar");
|
||
|
VerifyFileMoniker(L"\\.foo\\bar");
|
||
|
VerifyFileMoniker(L"\\..foo\\bar");
|
||
|
|
||
|
VerifyFileMoniker(L"..\\foo\\bar");
|
||
|
VerifyFileMoniker(L"..\\.foo\\bar");
|
||
|
VerifyFileMoniker(L"..\\..foo\\bar");
|
||
|
|
||
|
hr = CoGetMalloc(MEMCTX_TASK, &pIMalloc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CoGetMalloc failed");
|
||
|
|
||
|
hr = CreateFileMoniker(pszPath1, &pmk1);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CreateFileMoniker for path1 failed!")
|
||
|
|
||
|
TEST_FAILED((pmk1 == NULL),
|
||
|
"CreateFileMoniker returned a null moniker ptr")
|
||
|
|
||
|
hr = CreateBindCtx(0, &pbc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"CreateBindCtx File Moniker GetDisplayName failed!")
|
||
|
|
||
|
hr = pmk1->GetDisplayName(pbc, NULL, &szName);
|
||
|
|
||
|
// release it
|
||
|
pbc.Set(NULL, FALSE);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "File Moniker GetDisplayName failed!");
|
||
|
|
||
|
// BUGBUG: The following is an inappropriate test.
|
||
|
// TEST_FAILED((lstrcmp(szName, pszPath1) != 0), "Wrong path from file mon");
|
||
|
|
||
|
// Free the path
|
||
|
pIMalloc->Free(szName);
|
||
|
|
||
|
LAST_RELEASE(pmk1)
|
||
|
|
||
|
CreateFileMoniker(pszPath1, &pmk1);
|
||
|
|
||
|
hr = CreateFileMoniker(pszPath2, &pmk6);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CreateFileMoniker for path2 failed")
|
||
|
|
||
|
//
|
||
|
// Test Item Monikers
|
||
|
//
|
||
|
hr = CreateItemMoniker(L"\\", L"1", &pmk2);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CreateItemMoniker 1 failed")
|
||
|
|
||
|
hr = CreateBindCtx(0, &pbc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"CreateBindCtx Item Moniker GetDisplayName failed!")
|
||
|
|
||
|
hr = pmk2->GetDisplayName(pbc, NULL, &szName);
|
||
|
|
||
|
pbc.Set(NULL);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "Item Moniker GetDisplayName failed!");
|
||
|
|
||
|
TEST_FAILED((wcscmp(szName, L"\\1") != 0), "Wrong path from item mon");
|
||
|
|
||
|
// Free the path
|
||
|
pIMalloc->Free(szName);
|
||
|
|
||
|
hr = CreateItemMoniker(L"\\", L"2", &pmk3);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CreateItemMoniker 0 failed")
|
||
|
|
||
|
hr = pmk3->Inverse(&pmk4);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "Inverse of 0 failed")
|
||
|
|
||
|
hr = CreateBindCtx(0, &pbc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CreateBindCtx after inverse failed")
|
||
|
|
||
|
hr = pmk4->GetDisplayName(pbc, NULL, &szName);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "GetDisplayName on AntiMoniker failed")
|
||
|
|
||
|
TEST_FAILED((memcmp(szName, L"\\..", sizeof(L"\\..")) != 0),
|
||
|
"GetDisplayName on AntiMoniker name wrong\n")
|
||
|
|
||
|
// Free memory API allocated.
|
||
|
pIMalloc->Free(szName);
|
||
|
|
||
|
// Release interfaces we are finished with
|
||
|
LAST_RELEASE(pbc)
|
||
|
LAST_RELEASE(pmk4)
|
||
|
|
||
|
//
|
||
|
// Test composition of file moniker & item moniker
|
||
|
//
|
||
|
hr = pmk1->ComposeWith(pmk2, FALSE, &pmk4);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "ComposeWith failed")
|
||
|
|
||
|
hr = CreateBindCtx(0, &pbc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"CreateBindCtx Composite Moniker GetDisplayName failed!")
|
||
|
|
||
|
hr = pmk4->GetDisplayName(pbc, NULL, &szName);
|
||
|
|
||
|
pbc.Set(NULL);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "GetDisplayName on Composite moniker failed")
|
||
|
|
||
|
// Free memory API allocated.
|
||
|
pIMalloc->Free(szName);
|
||
|
|
||
|
Sleep(10);
|
||
|
hr = BindMoniker(pmk4, 0, IID_IUnknown, (LPVOID FAR*) &pUnk);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "BindMoniker with composed moniker failed")
|
||
|
|
||
|
TEST_FAILED((pUnk == NULL),
|
||
|
"BindMoniker with composed moniker returned NULL punk\n")
|
||
|
|
||
|
hr = pUnk->QueryInterface(IID_IOleObject, (LPVOID FAR*) &pObj);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "QI to IID_IOleObject failed")
|
||
|
|
||
|
TEST_FAILED((pObj == NULL),
|
||
|
"pObj returned from QI invalid")
|
||
|
|
||
|
hr = pmk6->ComposeWith(pmk3, FALSE, &pmk5);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "ComposedWith of pmk6 failed")
|
||
|
|
||
|
hr = BindMoniker(pmk5, 0, IID_IUnknown, (LPVOID FAR*) &pUnk1);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "BindMoniker of pmk5 failed")
|
||
|
|
||
|
hr = OleRun(pUnk1);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "OleRun call failed")
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "GetObject Failed");
|
||
|
|
||
|
// Clean up objects
|
||
|
pObj.Set(NULL);
|
||
|
LAST_RELEASE(pUnk1);
|
||
|
LAST_RELEASE(pmk5);
|
||
|
LAST_RELEASE(pUnk);
|
||
|
LAST_RELEASE(pmk6);
|
||
|
|
||
|
//
|
||
|
// Test Marshal/Unmarshal Moniker
|
||
|
//
|
||
|
// Make a moniker to marshal
|
||
|
hr = pmk4->ComposeWith(pmk3, FALSE, &pmk6);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "Compose of moniker for marshal test failed");
|
||
|
|
||
|
// Create a shared memory stream for the marshaled moniker
|
||
|
hr = CreateStreamOnHGlobal(NULL, TRUE, &pStm);
|
||
|
|
||
|
TEST_FAILED((FAILED(hr)), "CreateStreamOnHGlobal")
|
||
|
|
||
|
// Marshal the interface into the stream
|
||
|
hr = CoMarshalInterface(pStm, IID_IMoniker, pmk6, 0, NULL, MSHLFLAGS_NORMAL);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CoMarshalInterface failed")
|
||
|
|
||
|
LISet32(large_int, 0);
|
||
|
hr = pStm->Seek(large_int, STREAM_SEEK_SET, NULL);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "Seek on shared stream failed")
|
||
|
|
||
|
hr = CoUnmarshalInterface(pStm, IID_IMoniker, (LPVOID FAR*)&pmk5);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CoUnmarshalInterface failed")
|
||
|
|
||
|
// Dump interfaces we are done with
|
||
|
LAST_RELEASE(pmk6);
|
||
|
LAST_RELEASE(pmk3);
|
||
|
LAST_RELEASE(pmk4);
|
||
|
LAST_RELEASE(pmk1);
|
||
|
LAST_RELEASE(pmk2);
|
||
|
LAST_RELEASE(pStm);
|
||
|
LAST_RELEASE(pmk5);
|
||
|
|
||
|
//
|
||
|
// Test Moniker Composition
|
||
|
//
|
||
|
// BUGBUG: Check result
|
||
|
hr = CreateFileMoniker(L"\\ole2\\test\\breadth\\servers\\ellipswt",
|
||
|
&pmk1);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"First CreateFileMoniker in composition test failed")
|
||
|
|
||
|
hr = CreateFileMoniker(L"..\\..\\..\\dll\\sdemo1.exe",&pmk2);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Second CreateFileMoniker in composition test failed")
|
||
|
|
||
|
hr = pmk1->ComposeWith(pmk2, FALSE, &pmk4);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "ComposeWith of file monikers failed")
|
||
|
|
||
|
// Dump interfaces we are done with
|
||
|
LAST_RELEASE(pmk4);
|
||
|
LAST_RELEASE(pmk1);
|
||
|
LAST_RELEASE(pmk2);
|
||
|
|
||
|
//
|
||
|
// Testing file moniker CommonPrefixWith
|
||
|
//
|
||
|
// BUGBUG: Check result
|
||
|
hr = CreateFileMoniker(L"\\Ole2\\Test\\Breadth\\Servers\\Ellipswt",
|
||
|
&pmk1);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"CommonPrefixWith First CreateFileMoniker failed")
|
||
|
|
||
|
hr = CreateFileMoniker(
|
||
|
L"\\ole2\\test\\breadth\\serverandthensome\\bar", &pmk2);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"CommonPrefixWith second CreateFileMoniker failed")
|
||
|
|
||
|
|
||
|
hr = pmk1->CommonPrefixWith(pmk2, &pmk4);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CommonPrefixWith failed")
|
||
|
|
||
|
hr = CreateBindCtx(0, &pbc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"CreateBindCtx CommonPrefixWith GetDisplayName failed!")
|
||
|
|
||
|
hr = pmk4->GetDisplayName(pbc, NULL, &szName);
|
||
|
|
||
|
pbc.Set(NULL);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CommonPrefixWith: GetDisplayName failed!");
|
||
|
|
||
|
TEST_FAILED((_wcsicmp(szName, L"\\ole2\\test\\breadth") != 0),
|
||
|
"Common prefix with: Wrong Output Path\n");
|
||
|
|
||
|
// Free the path
|
||
|
pIMalloc->Free(szName);
|
||
|
|
||
|
// Dump monikers we are done with
|
||
|
LAST_RELEASE(pmk4);
|
||
|
LAST_RELEASE(pmk2);
|
||
|
LAST_RELEASE(pmk1);
|
||
|
|
||
|
//
|
||
|
// Testing file moniker RelativePathTo
|
||
|
//
|
||
|
// BUGBUG: Check result.
|
||
|
hr = CreateFileMoniker(L"\\Ole2\\Test\\Breadth\\Servers\\Ellipswt",
|
||
|
&pmk1);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "RelativePathTo first CreateFileMoniker failed")
|
||
|
|
||
|
hr = CreateFileMoniker(
|
||
|
L"\\ole2\\test\\breadth\\serverandthensome\\bar", &pmk2);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"RelativePathTo Second CreateFileMoniker failed")
|
||
|
|
||
|
hr = pmk1->RelativePathTo(pmk2, &pmk4);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "RelativePathTo failed")
|
||
|
|
||
|
|
||
|
hr = CreateBindCtx(0, &pbc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"CreateBindCtx RelativePathTo GetDisplayName failed!")
|
||
|
|
||
|
hr = pmk4->GetDisplayName(pbc, NULL, &szName);
|
||
|
|
||
|
pbc.Set(NULL);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "RelativePathTo: GetDisplayName failed!");
|
||
|
|
||
|
TEST_FAILED((wcscmp(szName, L"..\\..\\serverandthensome\\bar") != 0),
|
||
|
"RelativePathTo: Wrong Output Path");
|
||
|
|
||
|
// Free the path
|
||
|
pIMalloc->Free(szName);
|
||
|
|
||
|
|
||
|
LAST_RELEASE(pmk2);
|
||
|
LAST_RELEASE(pmk1);
|
||
|
LAST_RELEASE(pmk4);
|
||
|
|
||
|
//
|
||
|
// Testing MkParseDisplayName
|
||
|
//
|
||
|
hr = CreateBindCtx(0, &pbc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "MkParseDisplayName CreatebindCtx failed")
|
||
|
|
||
|
// make a path to the object
|
||
|
WCHAR szBuf[256];
|
||
|
int cPath1;
|
||
|
cPath1 = wcslen(pszPath1);
|
||
|
memcpy(szBuf, pszPath1, cPath1 * sizeof(WCHAR));
|
||
|
memcpy(szBuf + cPath1, L"\\1", sizeof(L"\\1"));
|
||
|
|
||
|
hr = MkParseDisplayName(pbc, szBuf, &chEaten, &pmk1);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "MkParseDisplayName failed")
|
||
|
|
||
|
LAST_RELEASE(pmk1);
|
||
|
LAST_RELEASE(pbc);
|
||
|
|
||
|
//
|
||
|
// Test Moniker IsEqual function on equivalent paths
|
||
|
// The moniker code should catch some forms of equivalent
|
||
|
// paths, but doesn't handle all of them.
|
||
|
//
|
||
|
//
|
||
|
|
||
|
hr = CreateFileMoniker(L"first",&pmk1);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"First CreateFileMoniker in IsEqual test failed")
|
||
|
|
||
|
hr = CreateFileMoniker(L".\\first",&pmk2);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Second CreateFileMoniker in IsEqual test failed")
|
||
|
|
||
|
hr = CreateFileMoniker(L"..\\first",&pmk3);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Third CreateFileMoniker in IsEqual test failed")
|
||
|
|
||
|
// This moniker variation has been disabled for Cairo
|
||
|
// until the moniker code gets unified.
|
||
|
#ifndef _CAIRO_
|
||
|
hr = CreateFileMoniker(L"..\\.first",&pmk4);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Fourth CreateFileMoniker in IsEqual test failed")
|
||
|
#endif
|
||
|
|
||
|
hr = pmk1->IsEqual(pmk2);
|
||
|
TEST_FAILED_HR((hr != S_OK), "pmk1->IsEqual(pmk2) failed")
|
||
|
|
||
|
hr = pmk2->IsEqual(pmk3);
|
||
|
TEST_FAILED_HR((hr != S_FALSE), "pmk2->IsEqual(pmk3) failed")
|
||
|
|
||
|
#ifndef _CAIRO_
|
||
|
hr = pmk3->IsEqual(pmk4);
|
||
|
TEST_FAILED_HR((hr != S_FALSE), "pmk3->IsEqual(pmk4) failed")
|
||
|
|
||
|
hr = pmk4->IsEqual(pmk4);
|
||
|
TEST_FAILED_HR((hr != S_OK), "pmk4->IsEqual(pmk4) failed")
|
||
|
#endif
|
||
|
|
||
|
// Dump interfaces we are done with
|
||
|
LAST_RELEASE(pmk1);
|
||
|
LAST_RELEASE(pmk2);
|
||
|
LAST_RELEASE(pmk3);
|
||
|
|
||
|
#ifndef _CAIRO_
|
||
|
LAST_RELEASE(pmk4);
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Test IsRunning
|
||
|
//
|
||
|
|
||
|
// we make up a name based on the pid and an arbitrary string,
|
||
|
// so that the name is unique to this process.
|
||
|
|
||
|
WCHAR wszMkName[MAX_PATH];
|
||
|
wcscpy(wszMkName, L"YourStockOptionsDependOnThis");
|
||
|
wcscat(wszMkName, &wszPid[1]); // skip leading backslash
|
||
|
|
||
|
hr = CreateFileMoniker(wszMkName, &pmk1);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"First CreateFileMoniker in IsRunning failed")
|
||
|
|
||
|
hr = CreateBindCtx(0, &pbc);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"CreateBindCtx in IsRunning failed")
|
||
|
|
||
|
//
|
||
|
// We shouldn't find the moniker in the ROT
|
||
|
//
|
||
|
hr = pmk1->IsRunning(pbc,NULL,NULL);
|
||
|
TEST_FAILED_HR((hr != S_FALSE),
|
||
|
"IsRunning returns other than S_FALSE");
|
||
|
|
||
|
//
|
||
|
// The FileMoniker should ignore pmk1
|
||
|
//
|
||
|
|
||
|
hr = pmk1->IsRunning(pbc,pmk1,NULL);
|
||
|
TEST_FAILED_HR((hr != S_FALSE),
|
||
|
"IsRunning #2 returns other than S_FALSE");
|
||
|
|
||
|
|
||
|
hr = GetRunningObjectTable(0, &prot);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),"IsRunning GetRunningObjectTable failed!");
|
||
|
|
||
|
|
||
|
//
|
||
|
// Just for kicks, we are going to register this moniker itself
|
||
|
// as running. We needed an IUnknown pointer here, and the moniker
|
||
|
// just happens to have one.
|
||
|
//
|
||
|
|
||
|
DWORD dwRegister;
|
||
|
DWORD dwRegister2;
|
||
|
|
||
|
hr = prot->Register(0,pmk1,pmk1,&dwRegister);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Register with ROT failed in IsRunning");
|
||
|
|
||
|
//
|
||
|
// We should find the moniker as running
|
||
|
//
|
||
|
hr = pmk1->IsRunning(pbc,NULL,NULL);
|
||
|
TEST_FAILED_HR((hr != S_OK),
|
||
|
"IsRunning returns other than S_OK");
|
||
|
|
||
|
hr = prot->IsRunning(pmk1);
|
||
|
TEST_FAILED_HR((hr != S_OK),
|
||
|
"IsRunning returns other than S_OK");
|
||
|
|
||
|
//
|
||
|
// Register it again, and we should get notice that it is running
|
||
|
//
|
||
|
// This test the ROT, and also test the moniker comparision
|
||
|
// functions
|
||
|
//
|
||
|
|
||
|
hr = prot->Register(0,pmk1,pmk1,&dwRegister2);
|
||
|
TEST_FAILED_HR(hr != MK_S_MONIKERALREADYREGISTERED,
|
||
|
"Register with ROT failed in IsRunning");
|
||
|
|
||
|
hr = prot->IsRunning(pmk1);
|
||
|
TEST_FAILED_HR((hr != S_OK),
|
||
|
"IsRunning #1 has returned != S_OK");
|
||
|
|
||
|
hr = prot->Revoke(dwRegister2);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Revoke dwRegister2 with ROT failed");
|
||
|
|
||
|
hr = prot->Revoke(dwRegister2);
|
||
|
TEST_FAILED_HR(hr == S_OK,
|
||
|
"Revoke dwRegister2 with ROT should have failed");
|
||
|
|
||
|
//
|
||
|
// It is registered twice, it should still be there from the original
|
||
|
// registration
|
||
|
//
|
||
|
hr = pmk1->IsRunning(pbc,NULL,NULL);
|
||
|
TEST_FAILED_HR((hr != S_OK),
|
||
|
"IsRunning #2 has returned != S_OK");
|
||
|
|
||
|
//
|
||
|
// Cram in a ItemMoniker to test its comparision stuff.
|
||
|
//
|
||
|
hr = CreateItemMoniker(L"!",L"KevinRo",&pmkItem1);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Creating Item Moniker KevinRo");
|
||
|
|
||
|
hr = CreateItemMoniker(L"!",L"SueA",&pmkItem2);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Creating Item Moniker SueA");
|
||
|
|
||
|
DWORD dwKevinRo;
|
||
|
DWORD dwSueA;
|
||
|
|
||
|
hr = prot->Register(0,pmkItem1,pmkItem1,&dwKevinRo);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Register KevinRo with ROT failed in IsRunning");
|
||
|
|
||
|
hr = prot->Register(0,pmkItem2,pmkItem2,&dwSueA);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Register SueA with ROT failed in IsRunning");
|
||
|
|
||
|
//
|
||
|
// Now revoke monikers
|
||
|
//
|
||
|
hr = prot->Revoke(dwRegister);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Revoke with ROT failed in IsRunning");
|
||
|
//
|
||
|
// We shouldn't find the moniker in the ROT
|
||
|
//
|
||
|
hr = pmk1->IsRunning(pbc,NULL,NULL);
|
||
|
TEST_FAILED_HR((hr != S_FALSE),
|
||
|
"IsRunning returns other than S_FALSE");
|
||
|
|
||
|
//
|
||
|
// Now revoke the item monikers.
|
||
|
//
|
||
|
hr = prot->Revoke(dwKevinRo);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Revoke with ROT failed in for KevinRo");
|
||
|
|
||
|
hr = prot->Revoke(dwSueA);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Revoke with ROT failed in for SueA");
|
||
|
|
||
|
//
|
||
|
// An AntiMoniker
|
||
|
//
|
||
|
hr = CreateAntiMoniker(&pmkAnti);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Failed creating AntiMoniker in Comparison Data Test");
|
||
|
|
||
|
DWORD dwAnti;
|
||
|
|
||
|
hr = prot->Register(0,pmkAnti,pmkAnti,&dwAnti);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Register Anti with ROT failed in IsRunning");
|
||
|
|
||
|
hr = prot->IsRunning(pmkAnti);
|
||
|
TEST_FAILED_HR((hr != S_OK),
|
||
|
"IsRunning pmkAnti returns other than S_OK");
|
||
|
|
||
|
//
|
||
|
// Now revoke the 'other' monikers.
|
||
|
//
|
||
|
hr = prot->Revoke(dwAnti);
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"Revoke with ROT failed in for Anti");
|
||
|
|
||
|
//
|
||
|
// Test file monikers with long file names
|
||
|
//
|
||
|
|
||
|
// Creation
|
||
|
hr = CreateFileMoniker(LongDirShort, &pmkLong1);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CreateFileMoniker for long short failed!")
|
||
|
|
||
|
TEST_FAILED((pmkLong1 == NULL),
|
||
|
"CreateFileMoniker returned a null moniker ptr\n")
|
||
|
|
||
|
LAST_RELEASE(pmkLong1);
|
||
|
|
||
|
// Equivalence with short name version
|
||
|
hr = CreateFileMoniker(LongDirLong, &pmkLong1);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CreateFileMoniker for long long failed!")
|
||
|
|
||
|
TEST_FAILED((pmkLong1 == NULL),
|
||
|
"CreateFileMoniker returned a null moniker ptr\n")
|
||
|
|
||
|
#if 0
|
||
|
// Debug code to print out the display name to check that long
|
||
|
// names are handled correctly
|
||
|
|
||
|
hr = CreateBindCtx(0, &pbc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"CreateBindCtx File Moniker GetDisplayName failed!")
|
||
|
|
||
|
hr = pmkLong1->GetDisplayName(pbc, NULL, &szName);
|
||
|
|
||
|
// release it
|
||
|
pbc.Set(NULL, FALSE);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "File Moniker GetDisplayName failed!");
|
||
|
|
||
|
wprintf(L"Display name: '%s', %d\n", szName, wcslen(szName));
|
||
|
|
||
|
// Free the path
|
||
|
pIMalloc->Free(szName);
|
||
|
#endif
|
||
|
|
||
|
hr = CreateFileMoniker(LongDirLongSe, &pmkLong2);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "CreateFileMoniker for long long se failed!")
|
||
|
|
||
|
TEST_FAILED((pmkLong2 == NULL),
|
||
|
"CreateFileMoniker returned a null moniker ptr\n")
|
||
|
|
||
|
TEST_FAILED(pmkLong1->IsEqual(pmkLong2) != S_OK,
|
||
|
"Long file monikers not equal\n");
|
||
|
|
||
|
#if 0
|
||
|
|
||
|
|
||
|
// Debug code to print out the display name to check that long
|
||
|
// names are handled correctly
|
||
|
|
||
|
hr = CreateBindCtx(0, &pbc);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr),
|
||
|
"CreateBindCtx File Moniker GetDisplayName failed!")
|
||
|
|
||
|
hr = pmkLong2->GetDisplayName(pbc, NULL, &szName);
|
||
|
|
||
|
// release it
|
||
|
pbc.Set(NULL, FALSE);
|
||
|
|
||
|
TEST_FAILED_HR(FAILED(hr), "File Moniker GetDisplayName failed!");
|
||
|
|
||
|
wprintf(L"Display name: '%s', %d\n", szName, wcslen(szName));
|
||
|
|
||
|
// Free the path
|
||
|
pIMalloc->Free(szName);
|
||
|
#endif
|
||
|
|
||
|
LAST_RELEASE(pmkLong1);
|
||
|
LAST_RELEASE(pmkLong2);
|
||
|
|
||
|
return FALSE;
|
||
|
}
|