windows-nt/Source/XPSP1/NT/com/oleutest/olebind/tmoniker.cxx
2020-09-26 16:20:57 +08:00

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