Files
reactos/modules/rostests/apitests/shell32/CMyComputer.cpp
Carl J. Bialorucki b86422cd4b [SHELL32_APITEST] Several fixes (#8266)
Fix the shell32 apitests so that they pass on Windows Server 2003 - Windows 10. Many of these fixes are for Vista+, but the most important fixes are for ShellExecCmdLine and FindExecutable which had issues closing windows after tests and deleting test files. Failing to delete these files breaks the other test (i.e. running ShellExecCmdLine would break FindExecutable and vis-versa.)
2025-07-29 14:06:13 -06:00

111 lines
3.4 KiB
C++

/*
* PROJECT: ReactOS api tests
* LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
* PURPOSE: Test for CMyComputer
* PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
*/
#include "shelltest.h"
#define NDEBUG
#include <debug.h>
#include <stdio.h>
#include <shellutils.h>
#define INVALID_POINTER ((PVOID)(ULONG_PTR)0xdeadbeefdeadbeefULL)
static
VOID
TestShellFolder(
_In_ IShellFolder2 *psf2)
{
HRESULT hr;
CComPtr<IDropTarget> pdt;
CComPtr<IDropTarget> pdt_2;
CComPtr<IContextMenu> pcm;
CComPtr<IContextMenu> pcm_2;
CComPtr<IShellView> psv;
CComPtr<IShellView> psv_2;
hr = psf2->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdt));
ok(hr == S_OK, "hr = %lx\n", hr);
hr = psf2->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdt_2));
ok(hr == S_OK, "hr = %lx\n", hr);
ok(pdt != pdt_2, "Expected %p != %p\n", static_cast<PVOID>(pdt), static_cast<PVOID>(pdt_2));
if (GetNTVersion() < _WIN32_WINNT_WIN10)
{
hr = psf2->CreateViewObject(NULL, IID_PPV_ARG(IContextMenu, &pcm));
ok(hr == S_OK, "hr = %lx\n", hr);
hr = psf2->CreateViewObject(NULL, IID_PPV_ARG(IContextMenu, &pcm_2));
ok(hr == S_OK, "hr = %lx\n", hr);
ok(pcm != pcm_2, "Expected %p != %p\n", static_cast<PVOID>(pcm), static_cast<PVOID>(pcm_2));
hr = psf2->CreateViewObject(NULL, IID_PPV_ARG(IShellView, &psv));
ok(hr == S_OK, "hr = %lx\n", hr);
hr = psf2->CreateViewObject(NULL, IID_PPV_ARG(IShellView, &psv_2));
ok(hr == S_OK, "hr = %lx\n", hr);
ok(psv != psv_2, "Expected %p != %p\n", static_cast<PVOID>(psv), static_cast<PVOID>(psv_2));
}
}
VOID TestInitialize(_In_ IShellFolder2 *psf2)
{
CComPtr<IPersistFolder2> ppf2;
HRESULT hr = psf2->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
ok(hr == S_OK, "hr = %lx\n", hr);
if (GetNTVersion() < _WIN32_WINNT_WIN10)
{
hr = ppf2->Initialize(NULL);
ok(hr == S_OK, "hr = %lx\n", hr);
hr = ppf2->Initialize((LPCITEMIDLIST)INVALID_POINTER);
ok(hr == S_OK, "hr = %lx\n", hr);
CComHeapPtr<ITEMIDLIST> pidl;
hr = ppf2->GetCurFolder(&pidl);
ok(hr == S_OK, "hr = %lx\n", hr);
// 0 in early win10, 14 in xp; crashes on late win10
ok(pidl->mkid.cb == 0x14, "expected empty pidl got cb = %x\n", pidl->mkid.cb);
}
}
START_TEST(CMyComputer)
{
HRESULT hr;
CComPtr<IShellFolder2> psf2;
CComPtr<IShellFolder2> psf2_2;
CComPtr<IShellFolder> psf;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
hr = CoCreateInstance(CLSID_MyComputer,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARG(IShellFolder2, &psf2));
ok(hr == S_OK, "hr = %lx\n", hr);
if (FAILED(hr))
{
skip("Could not instantiate CShellDesktop\n");
return;
}
if (GetNTVersion() < _WIN32_WINNT_VISTA)
{
/* NT5.x returns a pointer to the same object but not NT6.x and newer. */
hr = CoCreateInstance(CLSID_MyComputer,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARG(IShellFolder2, &psf2_2));
ok(hr == S_OK, "hr = %lx\n", hr);
ok(psf2 == psf2_2, "Expected %p == %p\n", static_cast<PVOID>(psf2), static_cast<PVOID>(psf2_2));
}
TestShellFolder(psf2);
TestInitialize(psf2);
}