[SHLWAPI] Implement SHAreIconsEqual

CORE-14425
This commit is contained in:
Mark Jansen 2018-03-05 22:43:05 +01:00
parent 754a2fa872
commit 173b79095c
No known key found for this signature in database
GPG key ID: B39240EE84BEAE8B
2 changed files with 58 additions and 1 deletions

View file

@ -37,3 +37,60 @@ HRESULT WINAPI SHForwardContextMenuMsg(IUnknown* pUnk, UINT uMsg, WPARAM wParam,
IContextMenu2_Release(pcmenu2);
return hr;
}
/* http://undoc.airesoft.co.uk/shlwapi.dll/SHAreIconsEqual.php */
BOOL WINAPI SHAreIconsEqual(HICON hIcon1, HICON hIcon2)
{
ICONINFO iconInfo1, iconInfo2;
BITMAP bm1, bm2;
BOOL bSame = FALSE;
if (!hIcon1 || !hIcon2)
return FALSE;
if (!GetIconInfo(hIcon1, &iconInfo1))
return FALSE;
if (!GetIconInfo(hIcon2, &iconInfo2))
{
DeleteObject(iconInfo1.hbmColor);
DeleteObject(iconInfo1.hbmMask);
return FALSE;
}
GetObjectW(iconInfo1.hbmColor, sizeof(bm1), &bm1);
GetObjectW(iconInfo2.hbmColor, sizeof(bm2), &bm2);
if (bm1.bmWidth == bm2.bmWidth && bm1.bmHeight == bm2.bmHeight)
{
BITMAPINFO bmi = { { sizeof(bmi), bm1.bmWidth, bm1.bmHeight, 1, 32 } };
HDC hdc = GetDC(0);
SIZE_T size = bm1.bmWidth * bm1.bmHeight * 4;
BYTE *data1, *data2;
data1 = HeapAlloc(GetProcessHeap(), 0, size);
data2 = HeapAlloc(GetProcessHeap(), 0, size);
if (data1 && data2)
{
if (GetDIBits(hdc, iconInfo1.hbmColor, 0, bm1.bmHeight, data1, &bmi, DIB_RGB_COLORS) &&
GetDIBits(hdc, iconInfo2.hbmColor, 0, bm2.bmHeight, data2, &bmi, DIB_RGB_COLORS))
{
bSame = memcmp(data1, data2, size) == 0;
}
}
HeapFree(GetProcessHeap(), 0, data1);
HeapFree(GetProcessHeap(), 0, data2);
ReleaseDC(NULL, hdc);
}
DeleteObject(iconInfo1.hbmColor);
DeleteObject(iconInfo1.hbmMask);
DeleteObject(iconInfo2.hbmColor);
DeleteObject(iconInfo2.hbmMask);
return bSame;
}

View file

@ -545,7 +545,7 @@
545 stdcall -noname SHForwardContextMenuMsg(ptr long long long ptr long)
546 stub -noname IUnknown_DoContextMenuPopup
547 stdcall DelayLoadFailureHook(str str) kernel32.DelayLoadFailureHook
548 stub -noname SHAreIconsEqual
548 stdcall -noname SHAreIconsEqual(ptr ptr)
549 stdcall -noname SHCoCreateInstanceAC(ptr ptr long ptr ptr)
550 stub -noname GetTemplateInfoFromHandle
551 stub -noname IShellFolder_CompareIDs