2 * PROJECT: fontext_apitest
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Tests for fontext shell extension behavior
5 * COPYRIGHT: Copyright 2019 Mark Jansen (mark.jansen@reactos.org)
9 #define WIN32_NO_STATUS
17 #include <shellutils.h>
18 #include "wine/test.h"
20 const CLSID CLSID_FontExt
= { 0xBD84B380, 0x8CA2, 0x1069, { 0xAB, 0x1D, 0x08, 0x00, 0x09, 0x48, 0xF5, 0x34 } };
21 static DWORD g_WinVersion
;
24 static HRESULT
Initialize(CComPtr
<IPersistFolder
>& spFolder
, LPCWSTR Path
)
26 CComHeapPtr
<ITEMIDLIST
> pidl
;
27 CComPtr
<IShellFolder
> spDesktop
;
29 HRESULT hr
= SHGetDesktopFolder(&spDesktop
);
34 DWORD Attributes
= 0, chEaten
= 0;
35 hr
= spDesktop
->ParseDisplayName(NULL
, NULL
, (LPOLESTR
)Path
, &chEaten
, &pidl
, &Attributes
);
40 return spFolder
->Initialize(pidl
);
44 static void CreateObjectsFromPersistFolder()
46 WCHAR Path
[MAX_PATH
] = { 0 };
48 CComPtr
<IPersistFolder
> spFolder
;
49 HRESULT hr
= CoCreateInstance(CLSID_FontExt
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IPersistFolder
, &spFolder
));
54 hr
= SHGetFolderPathW(NULL
, CSIDL_WINDOWS
, NULL
, 0, Path
);
59 // Initializing this in another folder fails
60 hr
= Initialize(spFolder
, Path
);
63 hr
= SHGetFolderPathW(NULL
, CSIDL_FONTS
, NULL
, 0, Path
);
68 // Initializing it in the font folder works
69 hr
= Initialize(spFolder
, Path
);
72 // For ros we do not implement the ShellView, but go directly to the ShellFolder.
73 // So we detect this special case
74 if (g_WinVersion
< _WIN32_WINNT_VISTA
)
76 CComPtr
<IShellFolder
> spShellFolder
;
77 hr
= spFolder
->QueryInterface(IID_PPV_ARG(IShellFolder
, &spShellFolder
));
81 trace("Got IShellFolder on < Vista, faking 0x601\n");
82 g_WinVersion
= _WIN32_WINNT_WIN7
;
86 if (g_WinVersion
< _WIN32_WINNT_VISTA
)
89 CComPtr
<IShellView
> spView
;
90 hr
= spFolder
->QueryInterface(IID_PPV_ARG(IShellView
, &spView
));
94 CComPtr
<IShellFolder
> spShellFolder
;
95 hr
= spFolder
->QueryInterface(IID_PPV_ARG(IShellFolder
, &spShellFolder
));
96 ok_hex(hr
, E_NOINTERFACE
);
101 CComPtr
<IObjectWithSite
> spObjectWithSite
;
102 hr
= spView
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &spObjectWithSite
));
103 ok_hex(hr
, E_NOINTERFACE
);
105 CComPtr
<IInternetSecurityManager
> spISM
;
106 hr
= spView
->QueryInterface(IID_PPV_ARG(IInternetSecurityManager
, &spISM
));
107 ok_hex(hr
, E_NOINTERFACE
);
111 CComPtr
<IDropTarget
> spDropTarget
;
112 hr
= spFolder
->QueryInterface(IID_PPV_ARG(IDropTarget
, &spDropTarget
));
115 CComPtr
<IExtractIconW
> spExtractIcon
;
116 hr
= spFolder
->QueryInterface(IID_PPV_ARG(IExtractIconW
, &spExtractIcon
));
117 ok_hex(hr
, E_NOINTERFACE
);
121 // Here we have a shell folder
122 CComPtr
<IShellFolder
> spShellFolder
;
123 hr
= spFolder
->QueryInterface(IID_PPV_ARG(IShellFolder
, &spShellFolder
));
126 // But no view anymore
127 CComPtr
<IShellView
> spView
;
128 hr
= spFolder
->QueryInterface(IID_PPV_ARG(IShellView
, &spView
));
129 ok_hex(hr
, E_NOINTERFACE
);
133 CComPtr
<IDropTarget
> spDropTarget
;
134 hr
= spFolder
->QueryInterface(IID_PPV_ARG(IDropTarget
, &spDropTarget
));
135 ok_hex(hr
, E_NOINTERFACE
);
137 CComPtr
<IExtractIconW
> spExtractIcon
;
138 hr
= spFolder
->QueryInterface(IID_PPV_ARG(IExtractIconW
, &spExtractIcon
));
139 ok_hex(hr
, E_NOINTERFACE
);
144 static void CreateDropTarget()
146 CComPtr
<IDropTarget
> spDropTarget
;
147 HRESULT hr
= CoCreateInstance(CLSID_FontExt
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IDropTarget
, &spDropTarget
));
148 ok_hex(hr
, E_NOINTERFACE
);
151 static void CreateExtractIcon()
153 if (g_WinVersion
< _WIN32_WINNT_VISTA
)
155 CComPtr
<IExtractIconA
> spExtractIconA
;
156 HRESULT hr
= CoCreateInstance(CLSID_FontExt
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IExtractIconA
, &spExtractIconA
));
159 CComPtr
<IExtractIconW
> spExtractIconW
;
160 hr
= CoCreateInstance(CLSID_FontExt
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IExtractIconW
, &spExtractIconW
));
165 CComPtr
<IExtractIconA
> spExtractIconA
;
166 HRESULT hr
= CoCreateInstance(CLSID_FontExt
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IExtractIconA
, &spExtractIconA
));
167 ok_hex(hr
, E_NOINTERFACE
);
169 CComPtr
<IExtractIconW
> spExtractIconW
;
170 hr
= CoCreateInstance(CLSID_FontExt
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IExtractIconW
, &spExtractIconW
));
171 ok_hex(hr
, E_NOINTERFACE
);
179 RTL_OSVERSIONINFOEXW rtlinfo
= {0};
181 rtlinfo
.dwOSVersionInfoSize
= sizeof(rtlinfo
);
182 RtlGetVersion((PRTL_OSVERSIONINFOW
)&rtlinfo
);
183 g_WinVersion
= (rtlinfo
.dwMajorVersion
<< 8) | rtlinfo
.dwMinorVersion
;
185 trace("g_WinVersion=0x%x\n", g_WinVersion
);
187 CoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
189 CreateObjectsFromPersistFolder();