reactos/dll/win32/shlwapi/rosordinal.c
2018-03-05 22:43:18 +01:00

97 lines
2.8 KiB
C

/*
* PROJECT: ReactOS Shell
* LICENSE: GPL - See COPYING in the top level directory
* PURPOSE: Misc shell helper functions
* COPYRIGHT: Copyright 2015 Giannis Adamopoulos
*/
#include "precomp.h"
/* http://undoc.airesoft.co.uk/shlwapi.dll/SHForwardContextMenuMsg.php */
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown* pUnk, UINT uMsg, WPARAM wParam,
LPARAM lParam, LRESULT* pResult, BOOL useIContextMenu2)
{
HRESULT hr;
IContextMenu3* pcmenu3;
IContextMenu2* pcmenu2;
/* First try to use the IContextMenu3 interface */
hr = IUnknown_QueryInterface(pUnk, &IID_IContextMenu3, (void**)&pcmenu3);
if (SUCCEEDED(hr))
{
hr = IContextMenu3_HandleMenuMsg2(pcmenu3, uMsg, wParam, lParam, pResult);
IContextMenu3_Release(pcmenu3);
return hr;
}
/* Return failure if we can't use the IContextMenu2 interface */
if(!useIContextMenu2)
return hr;
/* Now try to use the IContextMenu2 interface */
hr = IUnknown_QueryInterface(pUnk, &IID_IContextMenu2, (void**)&pcmenu2);
if (FAILED(hr))
return hr;
hr = IContextMenu2_HandleMenuMsg(pcmenu2, uMsg, wParam, lParam);
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;
}