diff --git a/dll/win32/comctl32/imagelist.c b/dll/win32/comctl32/imagelist.c index 1f119f3504..bcbdd77880 100644 --- a/dll/win32/comctl32/imagelist.c +++ b/dll/win32/comctl32/imagelist.c @@ -72,6 +72,7 @@ struct _IMAGELIST INT nOvlIdx[MAX_OVERLAYIMAGE]; /* 38: overlay images index */ /* not yet found out */ + ULONG usMagic; HBRUSH hbrBlend25; HBRUSH hbrBlend50; INT cInitial; @@ -130,6 +131,15 @@ static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count); static HRESULT ImageListImpl_CreateInstance(const IUnknown *pUnkOuter, REFIID iid, void** ppv); static BOOL is_valid(HIMAGELIST himl); +static inline IImageList2* IImageList2_from_impl(HIMAGELIST himl) +{ + if (is_valid(himl)) + { + return &himl->IImageList2_iface; + } + return NULL; +} + /* * An imagelist with N images is tiled like this: * @@ -2657,24 +2667,8 @@ done: return TRUE; } - -/************************************************************************* - * ImageList_ReplaceIcon [COMCTL32.@] - * - * Replaces an image in an image list using an icon. - * - * PARAMS - * himl [I] handle to image list - * i [I] image index - * hIcon [I] handle to icon - * - * RETURNS - * Success: index of the replaced image - * Failure: -1 - */ - -INT WINAPI -ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon) +static HRESULT WINAPI ImageListImpl_ReplaceIcon(IImageList2 *iface, int nIndex, + HICON hIcon, int *pi) { HICON hBestFitIcon; ICONINFO ii; @@ -2682,15 +2676,17 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon) BOOL ret; POINT pt; + HIMAGELIST himl = impl_from_IImageList2(iface); + TRACE("(%p %d %p)\n", himl, nIndex, hIcon); - if (!is_valid(himl)) { - ERR("invalid image list\n"); - return -1; - } + if (!pi) + return E_FAIL; + if ((nIndex >= himl->cMaxImage) || (nIndex < -1)) { ERR("invalid image index %d / %d\n", nIndex, himl->cMaxImage); - return -1; + *pi = -1; + return E_FAIL; } hBestFitIcon = CopyImage( @@ -2704,8 +2700,10 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon) hIcon, IMAGE_ICON, himl->cx, himl->cy, 0); - if (!hBestFitIcon) - return -1; + if (!hBestFitIcon) { + *pi = -1; + return E_FAIL; + } if (nIndex == -1) { if (himl->cCurImage + 1 >= himl->cMaxImage) @@ -2765,7 +2763,8 @@ done: DestroyIcon(hBestFitIcon); TRACE("Insert index = %d, himl->cCurImage = %d\n", nIndex, himl->cCurImage); - return nIndex; + *pi = nIndex; + return S_OK; } @@ -3417,22 +3416,40 @@ static HRESULT WINAPI ImageListImpl_Add(IImageList2 *iface, HBITMAP hbmImage, return S_OK; } -static HRESULT WINAPI ImageListImpl_ReplaceIcon(IImageList2 *iface, int i, - HICON hicon, int *pi) + +/************************************************************************* +* ImageList_ReplaceIcon [COMCTL32.@] +* +* Replaces an image in an image list using an icon. +* +* PARAMS +* himl [I] handle to image list +* nIndex[I] image index +* hIcon [I] handle to icon +* +* RETURNS +* Success: index of the replaced image +* Failure: -1 +*/ + +INT WINAPI +ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon) { - HIMAGELIST imgl = impl_from_IImageList2(iface); + HRESULT hr; int ret; + IImageList2* iface = IImageList2_from_impl(himl); - if (!pi) - return E_FAIL; + if (!iface) { + ERR("invalid image list\n"); + return -1; + } - ret = ImageList_ReplaceIcon(imgl, i, hicon); + hr = iface->lpVtbl->ReplaceIcon(iface, nIndex, hIcon, &ret); - if (ret == -1) - return E_FAIL; + if (hr != S_OK) + return -1; - *pi = ret; - return S_OK; + return ret; } static HRESULT WINAPI ImageListImpl_SetOverlayImage(IImageList2 *iface, @@ -3879,7 +3896,7 @@ static BOOL is_valid(HIMAGELIST himl) BOOL valid; __TRY { - valid = himl && himl->IImageList2_iface.lpVtbl == &ImageListImpl_Vtbl; + valid = himl && himl->usMagic == IMAGELIST_MAGIC; } __EXCEPT_PAGE_FAULT { @@ -3926,6 +3943,7 @@ static HRESULT ImageListImpl_CreateInstance(const IUnknown *pUnkOuter, REFIID ii if (!This) return E_OUTOFMEMORY; This->IImageList2_iface.lpVtbl = &ImageListImpl_Vtbl; + This->usMagic = IMAGELIST_MAGIC; This->ref = 1; ret = IImageList2_QueryInterface(&This->IImageList2_iface, iid, ppv);