ReactOS 0.4.15-dev-7968-g24a56f8
SHCreateFileExtractIconW.cpp File Reference
#include "shelltest.h"
#include <wincon.h>
#include <wingdi.h>
#include <stdio.h>
#include <shellutils.h>
Include dependency graph for SHCreateFileExtractIconW.cpp:

Go to the source code of this file.

Classes

struct  TestData
 
struct  TestIID
 

Functions

 HRESULT (STDAPICALLTYPE *pSHCreateFileExtractIconW)(LPCWSTR pszFile
 
static void ExtractOneBitmap (HBITMAP hbm, CComHeapPtr< BYTE > &data, DWORD &size)
 
static bool GetIconData (HICON icon, CComHeapPtr< BYTE > &colorData, DWORD &colorSize, CComHeapPtr< BYTE > &maskData, DWORD &maskSize)
 
 START_TEST (SHCreateFileExtractIconW)
 

Variables

DWORD dwFileAttributes
 
DWORD REFIID riid
 
DWORD REFIID void ** ppv
 
static TestData IconTests []
 
static TestIID InterfaceTests []
 

Function Documentation

◆ ExtractOneBitmap()

static void ExtractOneBitmap ( HBITMAP  hbm,
CComHeapPtr< BYTE > &  data,
DWORD size 
)
static

Definition at line 54 of file SHCreateFileExtractIconW.cpp.

55{
58
59 CComHeapPtr<BITMAPINFO> pInfoBM;
60
61 pInfoBM.AllocateBytes(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
62 memset(pInfoBM, 0, sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
63 pInfoBM->bmiHeader.biSize = sizeof(pInfoBM->bmiHeader);
64 if (!GetDIBits(hdc, hbm, 0, 0, NULL, pInfoBM, DIB_RGB_COLORS))
65 return;
66
67 size = pInfoBM->bmiHeader.biSizeImage;
68 data.Allocate(size);
69 GetDIBits(hdc, hbm, 0, pInfoBM->bmiHeader.biHeight, data, pInfoBM, DIB_RGB_COLORS);
70
73}
#define NULL
Definition: types.h:112
ULONG RGBQUAD
Definition: precomp.h:59
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:92
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
#define memset(x, y, z)
Definition: compat.h:39
#define DIB_RGB_COLORS
Definition: wingdi.h:367
int WINAPI GetDIBits(_In_ HDC hdc, _In_ HBITMAP hbm, _In_ UINT start, _In_ UINT cLines, _Out_opt_ LPVOID lpvBits, _At_((LPBITMAPINFOHEADER) lpbmi, _Inout_) LPBITMAPINFO lpbmi, _In_ UINT usage)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
BOOL WINAPI DeleteDC(_In_ HDC)

Referenced by GetIconData().

◆ GetIconData()

static bool GetIconData ( HICON  icon,
CComHeapPtr< BYTE > &  colorData,
DWORD colorSize,
CComHeapPtr< BYTE > &  maskData,
DWORD maskSize 
)
static

Definition at line 75 of file SHCreateFileExtractIconW.cpp.

76{
77 ICONINFO iconinfo;
78
79 if (!GetIconInfo(icon, &iconinfo))
80 return false;
81
82 ExtractOneBitmap(iconinfo.hbmColor, colorData, colorSize);
83 ExtractOneBitmap(iconinfo.hbmMask, maskData, maskSize);
84
85 DeleteObject(iconinfo.hbmColor);
86 DeleteObject(iconinfo.hbmMask);
87
88 return true;
89}
static void ExtractOneBitmap(HBITMAP hbm, CComHeapPtr< BYTE > &data, DWORD &size)
pKey DeleteObject()
HBITMAP hbmColor
Definition: winuser.h:3127
HBITMAP hbmMask
Definition: winuser.h:3126
BOOL WINAPI GetIconInfo(_In_ HICON, _Out_ PICONINFO)
Definition: cursoricon.c:2076

Referenced by START_TEST().

◆ HRESULT()

HRESULT ( STDAPICALLTYPE pSHCreateFileExtractIconW)

◆ START_TEST()

START_TEST ( SHCreateFileExtractIconW  )

Definition at line 92 of file SHCreateFileExtractIconW.cpp.

93{
94 WCHAR CurrentModule[MAX_PATH];
95 HMODULE shell32 = LoadLibraryA("shell32.dll");
96 HICON myIcon;
97 pSHCreateFileExtractIconW = (HRESULT (__stdcall *)(LPCWSTR, DWORD, REFIID, void **))GetProcAddress(shell32, "SHCreateFileExtractIconW");
98
99 /* Show that icons returned are always the same */
100 UINT tryFlags[4] = { 0, GIL_FORSHORTCUT, GIL_OPENICON };
101
103
104 GetModuleFileNameW(NULL, CurrentModule, _countof(CurrentModule));
105 {
106 SHFILEINFOW shfi;
107 ULONG_PTR firet = SHGetFileInfoW(CurrentModule, 0, &shfi, sizeof(shfi), SHGFI_ICON);
108 myIcon = shfi.hIcon;
109 if (!firet)
110 {
111 skip("Unable to get my own icon\n");
112 return;
113 }
114 }
115
116 if (!pSHCreateFileExtractIconW)
117 {
118 skip("SHCreateFileExtractIconW not available\n");
119 return;
120 }
121
122 for (size_t n = 0; n < _countof(InterfaceTests); ++n)
123 {
124 {
125 CComPtr<IUnknown> spUnknown;
126 HRESULT hr = pSHCreateFileExtractIconW(L"test.txt", FILE_ATTRIBUTE_NORMAL, *InterfaceTests[n].IID, (void**)&spUnknown);
127 ok(hr == InterfaceTests[n].ExpectedCreate, "Expected hr to be 0x%lx, was 0x%lx for %u\n", InterfaceTests[n].ExpectedCreate, hr, n);
128 }
129
130 {
131 CComPtr<IUnknown> spUnknown, spUnknown2;
132 HRESULT hr = pSHCreateFileExtractIconW(L"test.txt", FILE_ATTRIBUTE_NORMAL, IID_PPV_ARG(IUnknown, &spUnknown));
133 ok(hr == S_OK, "Expected hr to be S_OK, was 0x%lx for %u\n", hr, n);
134
135 hr = spUnknown->QueryInterface(*InterfaceTests[n].IID, (void**)&spUnknown2);
136 ok(hr == InterfaceTests[n].ExpectedQueryInterface, "Expected hr to be 0x%lx, was 0x%lx for %u\n", InterfaceTests[n].ExpectedQueryInterface, hr, n);
137 }
138 }
139
140 for (size_t n = 0; n < _countof(IconTests); ++n)
141 {
143 bool useMyIcon = false;
144
145 if (cur.Name == NULL)
146 {
147 cur.Name = CurrentModule;
148 useMyIcon = true;
149 }
150
151 CComPtr<IExtractIconW> spExtract;
152 HRESULT hr = pSHCreateFileExtractIconW(cur.Name, cur.dwFlags, IID_PPV_ARG(IExtractIconW, &spExtract));
153 ok(hr == S_OK, "Expected hr to be S_OK, was 0x%lx for %S(%lx)\n", hr, cur.Name, cur.dwFlags);
154
155 if (!SUCCEEDED(hr))
156 continue;
157
158 /* Show that GIL_DEFAULTICON does not work. */
159 {
160 int ilIndex = -1;
161 UINT wFlags = 0xdeaddead;
163
164 hr = spExtract->GetIconLocation(GIL_DEFAULTICON, Buffer, _countof(Buffer), &ilIndex, &wFlags);
165 ok(hr == S_FALSE, "Expected hr to be S_FALSE, was 0x%lx for %S(0x%lx)\n", hr, cur.Name, cur.dwFlags);
166 }
167
168
169 for (UINT idFlags = 0; idFlags < _countof(tryFlags); ++idFlags)
170 {
171 int ilIndex = -1;
172 UINT wFlags = 0xdeaddead;
174
175 hr = spExtract->GetIconLocation(tryFlags[idFlags], Buffer, _countof(Buffer), &ilIndex, &wFlags);
176 ok(hr == S_OK, "Expected hr to be S_OK, was 0x%lx for %S(0x%lx,0x%x)\n", hr, cur.Name, cur.dwFlags, tryFlags[idFlags]);
177 if (!SUCCEEDED(hr))
178 continue;
179
180 ok(wFlags & (GIL_NOTFILENAME|GIL_PERCLASS), "Expected GIL_NOTFILENAME|GIL_PERCLASS to be set for %S(0x%lx,0x%x)\n", cur.Name, cur.dwFlags, tryFlags[idFlags]);
181 ok(!wcscmp(Buffer, L"*"), "Expected '*', was '%S' for %S(0x%lx,0x%x)\n", Buffer, cur.Name, cur.dwFlags, tryFlags[idFlags]);
182
183 HICON ico;
184 hr = spExtract->Extract(Buffer, ilIndex, &ico, NULL, 0);
185
186 /* Visualize the icon extracted for whoever is stepping through this code. */
187 HWND console = GetConsoleWindow();
188 SendMessage(console, WM_SETICON, ICON_BIG, (LPARAM)ico);
189 SendMessage(console, WM_SETICON, ICON_SMALL, (LPARAM)ico);
190
191 CComHeapPtr<BYTE> colorData, maskData;
192 DWORD colorSize = 0, maskSize = 0;
193
194 GetIconData(ico, colorData, colorSize, maskData, maskSize);
195
196 if (!colorSize || !maskSize)
197 continue;
198
199 SHFILEINFOW shfi;
200 ULONG_PTR firet = SHGetFileInfoW(cur.Name, cur.dwFlags, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SYSICONINDEX);
201
202 if (!firet)
203 continue;
204
205 ok(shfi.iIcon == ilIndex, "Expected ilIndex to be 0%x, was 0x%x for %S(0x%lx,0x%x)\n", shfi.iIcon, ilIndex, cur.Name, cur.dwFlags, tryFlags[idFlags]);
206
207
208 CComHeapPtr<BYTE> colorDataRef, maskDataRef;
209 DWORD colorSizeRef = 0, maskSizeRef = 0;
210 GetIconData(shfi.hIcon, colorDataRef, colorSizeRef, maskDataRef, maskSizeRef);
211
212 ok(colorSizeRef == colorSize, "Expected %lu, was %lu for %S(0x%lx,0x%x)\n", colorSizeRef, colorSize, cur.Name, cur.dwFlags, tryFlags[idFlags]);
213 ok(maskSizeRef == maskSize, "Expected %lu, was %lu for %S(0x%lx,0x%x)\n", maskSizeRef, maskSize, cur.Name, cur.dwFlags, tryFlags[idFlags]);
214
215 if (colorSizeRef == colorSize)
216 {
217 ok(!memcmp(colorData, colorDataRef, colorSize), "Expected equal colorData for %S(0x%lx,0x%x)\n", cur.Name, cur.dwFlags, tryFlags[idFlags]);
218 }
219
220 if (maskSizeRef == maskSize)
221 {
222 ok(!memcmp(maskData, maskDataRef, maskSize), "Expected equal maskData for %S(0x%lx,0x%x)\n", cur.Name, cur.dwFlags, tryFlags[idFlags]);
223 }
224
225 if (useMyIcon)
226 {
227 colorDataRef.Free();
228 maskDataRef.Free();
229 colorSizeRef = maskSizeRef = 0;
230 GetIconData(myIcon, colorDataRef, colorSizeRef, maskDataRef, maskSizeRef);
231
232 ok(colorSizeRef == colorSize, "Expected %lu, was %lu for %S(0x%lx,0x%x)\n", colorSizeRef, colorSize, cur.Name, cur.dwFlags, tryFlags[idFlags]);
233 ok(maskSizeRef == maskSize, "Expected %lu, was %lu for %S(0x%lx,0x%x)\n", maskSizeRef, maskSize, cur.Name, cur.dwFlags, tryFlags[idFlags]);
234
235 if (colorSizeRef == colorSize)
236 {
237 /* In case requested filetype does not match, the exe icon is not used! */
238 if (cur.dwFlags == FILE_ATTRIBUTE_DIRECTORY)
239 {
240 ok(memcmp(colorData, colorDataRef, colorSize), "Expected colorData to be changed for %S(0x%lx,0x%x)\n", cur.Name, cur.dwFlags, tryFlags[idFlags]);
241 }
242 else
243 {
244 ok(!memcmp(colorData, colorDataRef, colorSize), "Expected equal colorData for %S(0x%lx,0x%x)\n", cur.Name, cur.dwFlags, tryFlags[idFlags]);
245 }
246 }
247
248 // Mask is not reliable for some reason
249 //if (maskSizeRef == maskSize)
250 //{
251 // ok(!memcmp(maskData, maskDataRef, maskSize), "Expected equal maskData for %S(0x%lx,0x%lx)\n", cur.Name, cur.dwFlags);
252 //}
253 }
254 }
255 }
256}
static TestData IconTests[]
static TestIID InterfaceTests[]
static bool GetIconData(HICON icon, CComHeapPtr< BYTE > &colorData, DWORD &colorSize, CComHeapPtr< BYTE > &maskData, DWORD &maskSize)
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
Definition: bufpool.h:45
#define GetProcAddress(x, y)
Definition: compat.h:753
#define MAX_PATH
Definition: compat.h:34
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
HWND WINAPI DECLSPEC_HOTPATCH GetConsoleWindow(VOID)
Definition: console.c:2729
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
unsigned long DWORD
Definition: ntddk_ex.h:95
FxCollectionEntry * cur
GLdouble n
Definition: glext.h:7729
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
static HANDLE shell32
Definition: animate.c:36
static HICON
Definition: imagelist.c:84
unsigned int UINT
Definition: ndis.h:50
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define DWORD
Definition: nt_native.h:44
#define L(x)
Definition: ntvdm.h:50
#define REFIID
Definition: guiddef.h:118
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:415
#define SHGFI_SYSICONINDEX
Definition: shellapi.h:171
#define SHGFI_ICON
Definition: shellapi.h:164
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:181
HRESULT hr
Definition: shlfolder.c:183
#define _countof(array)
Definition: sndvol32.h:68
HICON hIcon
Definition: shellapi.h:372
#define ICON_BIG
Definition: tnclass.cpp:51
#define ICON_SMALL
Definition: tnclass.cpp:48
#define __stdcall
Definition: typedefs.h:25
uint32_t ULONG_PTR
Definition: typedefs.h:65
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:531
LONG_PTR LPARAM
Definition: windef.h:208
#define HRESULT
Definition: msvc.h:7
#define S_FALSE
Definition: winerror.h:2357
#define SendMessage
Definition: winuser.h:5843
#define IID_PPV_ARG(Itype, ppType)
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Variable Documentation

◆ dwFileAttributes

◆ IconTests

TestData IconTests[]
static
Initial value:

Definition at line 23 of file SHCreateFileExtractIconW.cpp.

Referenced by START_TEST().

◆ InterfaceTests

TestIID InterfaceTests[]
static
Initial value:
=
{
{ &IID_IDefaultExtractIconInit, E_NOINTERFACE, E_NOINTERFACE },
{ &IID_IExtractIconW, S_OK, S_OK },
{ &IID_IExtractIconA, S_OK, S_OK },
}
const GUID IID_IPersistFile
const GUID IID_IPersist
Definition: proxy.cpp:14
#define E_NOINTERFACE
Definition: winerror.h:2364

Definition at line 44 of file SHCreateFileExtractIconW.cpp.

Referenced by START_TEST().

◆ ppv

Definition at line 15 of file SHCreateFileExtractIconW.cpp.

◆ riid

Definition at line 15 of file SHCreateFileExtractIconW.cpp.