Moved undocumented functions out of the exported commctrl.h.

This commit is contained in:
Alexandre Julliard 2003-09-17 20:15:21 +00:00
parent 209ce0be91
commit f5cb3dde17
21 changed files with 161 additions and 196 deletions

View File

@ -39,6 +39,7 @@
#include "commctrl.h" #include "commctrl.h"
#include "vfw.h" #include "vfw.h"
#include "mmsystem.h" #include "mmsystem.h"
#include "comctl32.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(animate); WINE_DEFAULT_DEBUG_CHANNEL(animate);

View File

@ -38,6 +38,7 @@
#include "winuser.h" #include "winuser.h"
#include "winnls.h" #include "winnls.h"
#include "commctrl.h" #include "commctrl.h"
#include "comctl32.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/unicode.h" #include "wine/unicode.h"

View File

@ -155,4 +155,28 @@ typedef struct
WNDPROC origproc; WNDPROC origproc;
} SUBCLASS_INFO, *LPSUBCLASS_INFO; } SUBCLASS_INFO, *LPSUBCLASS_INFO;
/* private heap memory functions */
LPVOID WINAPI COMCTL32_Alloc (DWORD);
LPVOID WINAPI COMCTL32_ReAlloc (LPVOID, DWORD);
BOOL WINAPI COMCTL32_Free (LPVOID);
DWORD WINAPI COMCTL32_GetSize (LPVOID);
/* undocumented functions */
INT WINAPI Str_GetPtrA (LPCSTR, LPSTR, INT);
INT WINAPI Str_GetPtrW (LPCWSTR, LPWSTR, INT);
INT WINAPI DPA_GetPtrIndex (const HDPA, LPVOID);
BOOL WINAPI DPA_Grow (const HDPA, INT);
#define DPAM_NOSORT 0x0001
#define DPAM_INSERT 0x0004
#define DPAM_DELETE 0x0008
typedef PVOID (CALLBACK *PFNDPAMERGE)(DWORD,PVOID,PVOID,LPARAM);
BOOL WINAPI DPA_Merge (const HDPA, const HDPA, DWORD, PFNDPACOMPARE, PFNDPAMERGE, LPARAM);
#define DPA_GetPtrCount(hdpa) (*(INT*)(hdpa))
#endif /* __WINE_COMCTL32_H */ #endif /* __WINE_COMCTL32_H */

View File

@ -61,6 +61,24 @@ WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
extern HANDLE COMCTL32_hHeap; /* handle to the private heap */ extern HANDLE COMCTL32_hHeap; /* handle to the private heap */
struct _DSA
{
INT nItemCount;
LPVOID pData;
INT nMaxCount;
INT nItemSize;
INT nGrow;
};
struct _DPA
{
INT nItemCount;
LPVOID *ptrs;
HANDLE hHeap;
INT nGrow;
INT nMaxCount;
};
typedef struct _STREAMDATA typedef struct _STREAMDATA
{ {
DWORD dwSize; DWORD dwSize;
@ -224,10 +242,10 @@ DPA_Merge (const HDPA hdpa1, const HDPA hdpa2, DWORD dwFlags,
TRACE("%p %p %08lx %p %p %08lx)\n", TRACE("%p %p %08lx %p %p %08lx)\n",
hdpa1, hdpa2, dwFlags, pfnCompare, pfnMerge, lParam); hdpa1, hdpa2, dwFlags, pfnCompare, pfnMerge, lParam);
if (IsBadWritePtr (hdpa1, sizeof(DPA))) if (IsBadWritePtr (hdpa1, sizeof(*hdpa1)))
return FALSE; return FALSE;
if (IsBadWritePtr (hdpa2, sizeof(DPA))) if (IsBadWritePtr (hdpa2, sizeof(*hdpa2)))
return FALSE; return FALSE;
if (IsBadCodePtr ((FARPROC)pfnCompare)) if (IsBadCodePtr ((FARPROC)pfnCompare))
@ -1330,7 +1348,7 @@ DSA_Create (INT nSize, INT nGrow)
TRACE("(size=%d grow=%d)\n", nSize, nGrow); TRACE("(size=%d grow=%d)\n", nSize, nGrow);
hdsa = (HDSA)COMCTL32_Alloc (sizeof(DSA)); hdsa = (HDSA)COMCTL32_Alloc (sizeof(*hdsa));
if (hdsa) if (hdsa)
{ {
hdsa->nItemCount = 0; hdsa->nItemCount = 0;
@ -1663,7 +1681,7 @@ DPA_Create (INT nGrow)
TRACE("(%d)\n", nGrow); TRACE("(%d)\n", nGrow);
hdpa = (HDPA)COMCTL32_Alloc (sizeof(DPA)); hdpa = (HDPA)COMCTL32_Alloc (sizeof(*hdpa));
if (hdpa) { if (hdpa) {
hdpa->nGrow = max(8, nGrow); hdpa->nGrow = max(8, nGrow);
hdpa->hHeap = COMCTL32_hHeap; hdpa->hHeap = COMCTL32_hHeap;
@ -1766,7 +1784,7 @@ DPA_Clone (const HDPA hdpa, const HDPA hdpaNew)
if (!hdpaNew) { if (!hdpaNew) {
/* create a new DPA */ /* create a new DPA */
hdpaTemp = (HDPA)HeapAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY, hdpaTemp = (HDPA)HeapAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,
sizeof(DPA)); sizeof(*hdpaTemp));
hdpaTemp->hHeap = hdpa->hHeap; hdpaTemp->hHeap = hdpa->hHeap;
hdpaTemp->nGrow = hdpa->nGrow; hdpaTemp->nGrow = hdpa->nGrow;
} }
@ -2237,9 +2255,9 @@ DPA_CreateEx (INT nGrow, HANDLE hHeap)
TRACE("(%d %p)\n", nGrow, hHeap); TRACE("(%d %p)\n", nGrow, hHeap);
if (hHeap) if (hHeap)
hdpa = (HDPA)HeapAlloc (hHeap, HEAP_ZERO_MEMORY, sizeof(DPA)); hdpa = (HDPA)HeapAlloc (hHeap, HEAP_ZERO_MEMORY, sizeof(*hdpa));
else else
hdpa = (HDPA)COMCTL32_Alloc (sizeof(DPA)); hdpa = (HDPA)COMCTL32_Alloc (sizeof(*hdpa));
if (hdpa) { if (hdpa) {
hdpa->nGrow = min(8, nGrow); hdpa->nGrow = min(8, nGrow);
@ -2502,11 +2520,11 @@ COMCTL32_StrToIntW (LPWSTR lpString)
*/ */
VOID WINAPI VOID WINAPI
DPA_EnumCallback (const HDPA hdpa, DPAENUMPROC enumProc, LPARAM lParam) DPA_EnumCallback (HDPA hdpa, PFNDPAENUMCALLBACK enumProc, LPVOID lParam)
{ {
INT i; INT i;
TRACE("(%p %p %08lx)\n", hdpa, enumProc, lParam); TRACE("(%p %p %p)\n", hdpa, enumProc, lParam);
if (!hdpa) if (!hdpa)
return; return;
@ -2533,18 +2551,16 @@ DPA_EnumCallback (const HDPA hdpa, DPAENUMPROC enumProc, LPARAM lParam)
* lParam [I] * lParam [I]
* *
* RETURNS * RETURNS
* Success: TRUE * none
* Failure: FALSE
*/ */
BOOL WINAPI void WINAPI
DPA_DestroyCallback (const HDPA hdpa, DPAENUMPROC enumProc, LPARAM lParam) DPA_DestroyCallback (HDPA hdpa, PFNDPAENUMCALLBACK enumProc, LPVOID lParam)
{ {
TRACE("(%p %p %08lx)\n", hdpa, enumProc, lParam); TRACE("(%p %p %p)\n", hdpa, enumProc, lParam);
DPA_EnumCallback (hdpa, enumProc, lParam); DPA_EnumCallback (hdpa, enumProc, lParam);
DPA_Destroy (hdpa);
return DPA_Destroy (hdpa);
} }
@ -2563,11 +2579,11 @@ DPA_DestroyCallback (const HDPA hdpa, DPAENUMPROC enumProc, LPARAM lParam)
*/ */
VOID WINAPI VOID WINAPI
DSA_EnumCallback (const HDSA hdsa, DSAENUMPROC enumProc, LPARAM lParam) DSA_EnumCallback (HDSA hdsa, PFNDSAENUMCALLBACK enumProc, LPVOID lParam)
{ {
INT i; INT i;
TRACE("(%p %p %08lx)\n", hdsa, enumProc, lParam); TRACE("(%p %p %p)\n", hdsa, enumProc, lParam);
if (!hdsa) if (!hdsa)
return; return;
@ -2595,18 +2611,16 @@ DSA_EnumCallback (const HDSA hdsa, DSAENUMPROC enumProc, LPARAM lParam)
* lParam [I] * lParam [I]
* *
* RETURNS * RETURNS
* Success: TRUE * none
* Failure: FALSE
*/ */
BOOL WINAPI void WINAPI
DSA_DestroyCallback (const HDSA hdsa, DSAENUMPROC enumProc, LPARAM lParam) DSA_DestroyCallback (HDSA hdsa, PFNDSAENUMCALLBACK enumProc, LPVOID lParam)
{ {
TRACE("(%p %p %08lx)\n", hdsa, enumProc, lParam); TRACE("(%p %p %p)\n", hdsa, enumProc, lParam);
DSA_EnumCallback (hdsa, enumProc, lParam); DSA_EnumCallback (hdsa, enumProc, lParam);
DSA_Destroy (hdsa);
return DSA_Destroy (hdsa);
} }
/************************************************************************** /**************************************************************************

View File

@ -36,6 +36,7 @@
#include "winuser.h" #include "winuser.h"
#include "winnls.h" #include "winnls.h"
#include "commctrl.h" #include "commctrl.h"
#include "comctl32.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(datetime); WINE_DEFAULT_DEBUG_CHANNEL(datetime);

View File

@ -51,6 +51,7 @@
#include "wingdi.h" #include "wingdi.h"
#include "winuser.h" #include "winuser.h"
#include "commctrl.h" #include "commctrl.h"
#include "comctl32.h"
#include "imagelist.h" #include "imagelist.h"
#include "wine/debug.h" #include "wine/debug.h"

View File

@ -44,6 +44,7 @@
#include "winuser.h" #include "winuser.h"
#include "winnls.h" #include "winnls.h"
#include "commctrl.h" #include "commctrl.h"
#include "comctl32.h"
#include "wine/unicode.h" #include "wine/unicode.h"
#include "wine/debug.h" #include "wine/debug.h"

View File

@ -1027,7 +1027,7 @@ testitem:
pickarange: pickarange:
if (i->ranges) if (i->ranges)
{ {
if (i->index < i->ranges->hdpa->nItemCount) if (i->index < DPA_GetPtrCount(i->ranges->hdpa))
i->range = *(RANGE*)DPA_GetPtr(i->ranges->hdpa, i->index++); i->range = *(RANGE*)DPA_GetPtr(i->ranges->hdpa, i->index++);
else goto end; else goto end;
} }
@ -1053,7 +1053,7 @@ static inline BOOL iterator_prev(ITERATOR* i)
if (i->nItem == -1) if (i->nItem == -1)
{ {
start = TRUE; start = TRUE;
if (i->ranges) i->index = i->ranges->hdpa->nItemCount; if (i->ranges) i->index = DPA_GetPtrCount(i->ranges->hdpa);
goto pickarange; goto pickarange;
} }
if (i->nItem == i->nSpecial) if (i->nItem == i->nSpecial)
@ -1089,7 +1089,7 @@ static RANGE iterator_range(ITERATOR* i)
if (!i->ranges) return i->range; if (!i->ranges) return i->range;
range.lower = (*(RANGE*)DPA_GetPtr(i->ranges->hdpa, 0)).lower; range.lower = (*(RANGE*)DPA_GetPtr(i->ranges->hdpa, 0)).lower;
range.upper = (*(RANGE*)DPA_GetPtr(i->ranges->hdpa, i->ranges->hdpa->nItemCount - 1)).upper; range.upper = (*(RANGE*)DPA_GetPtr(i->ranges->hdpa, DPA_GetPtrCount(i->ranges->hdpa) - 1)).upper;
return range; return range;
} }
@ -1293,8 +1293,8 @@ static inline COLUMN_INFO * LISTVIEW_GetColumnInfo(LISTVIEW_INFO *infoPtr, INT n
{ {
static COLUMN_INFO mainItem; static COLUMN_INFO mainItem;
if (nSubItem == 0 && infoPtr->hdpaColumns->nItemCount == 0) return &mainItem; if (nSubItem == 0 && DPA_GetPtrCount(infoPtr->hdpaColumns) == 0) return &mainItem;
assert (nSubItem >= 0 && nSubItem < infoPtr->hdpaColumns->nItemCount); assert (nSubItem >= 0 && nSubItem < DPA_GetPtrCount(infoPtr->hdpaColumns));
return (COLUMN_INFO *)DPA_GetPtr(infoPtr->hdpaColumns, nSubItem); return (COLUMN_INFO *)DPA_GetPtr(infoPtr->hdpaColumns, nSubItem);
} }
@ -2299,7 +2299,7 @@ static SUBITEM_INFO* LISTVIEW_GetSubItemPtr(HDPA hdpaSubItems, INT nSubItem)
INT i; INT i;
/* we should binary search here if need be */ /* we should binary search here if need be */
for (i = 1; i < hdpaSubItems->nItemCount; i++) for (i = 1; i < DPA_GetPtrCount(hdpaSubItems); i++)
{ {
lpSubItem = (SUBITEM_INFO *)DPA_GetPtr(hdpaSubItems, i); lpSubItem = (SUBITEM_INFO *)DPA_GetPtr(hdpaSubItems, i);
if (lpSubItem->iSubItem == nSubItem) if (lpSubItem->iSubItem == nSubItem)
@ -2333,9 +2333,9 @@ static INT LISTVIEW_CalculateItemWidth(LISTVIEW_INFO *infoPtr)
{ {
RECT rcHeader; RECT rcHeader;
if (infoPtr->hdpaColumns->nItemCount > 0) if (DPA_GetPtrCount(infoPtr->hdpaColumns) > 0)
{ {
LISTVIEW_GetHeaderRect(infoPtr, infoPtr->hdpaColumns->nItemCount - 1, &rcHeader); LISTVIEW_GetHeaderRect(infoPtr, DPA_GetPtrCount(infoPtr->hdpaColumns) - 1, &rcHeader);
nItemWidth = rcHeader.right; nItemWidth = rcHeader.right;
} }
} }
@ -2475,12 +2475,12 @@ static void ranges_assert(RANGES ranges, LPCSTR desc, const char *func, int line
TRACE("*** Checking %s:%d:%s ***\n", func, line, desc); TRACE("*** Checking %s:%d:%s ***\n", func, line, desc);
assert (ranges); assert (ranges);
assert (ranges->hdpa->nItemCount >= 0); assert (DPA_GetPtrCount(ranges->hdpa) >= 0);
ranges_dump(ranges); ranges_dump(ranges);
prev = (RANGE *)DPA_GetPtr(ranges->hdpa, 0); prev = (RANGE *)DPA_GetPtr(ranges->hdpa, 0);
if (ranges->hdpa->nItemCount > 0) if (DPA_GetPtrCount(ranges->hdpa) > 0)
assert (prev->lower >= 0 && prev->lower < prev->upper); assert (prev->lower >= 0 && prev->lower < prev->upper);
for (i = 1; i < ranges->hdpa->nItemCount; i++) for (i = 1; i < DPA_GetPtrCount(ranges->hdpa); i++)
{ {
curr = (RANGE *)DPA_GetPtr(ranges->hdpa, i); curr = (RANGE *)DPA_GetPtr(ranges->hdpa, i);
assert (prev->upper <= curr->lower); assert (prev->upper <= curr->lower);
@ -2504,7 +2504,7 @@ static void ranges_clear(RANGES ranges)
{ {
INT i; INT i;
for(i = 0; i < ranges->hdpa->nItemCount; i++) for(i = 0; i < DPA_GetPtrCount(ranges->hdpa); i++)
COMCTL32_Free(DPA_GetPtr(ranges->hdpa, i)); COMCTL32_Free(DPA_GetPtr(ranges->hdpa, i));
DPA_DeleteAllPtrs(ranges->hdpa); DPA_DeleteAllPtrs(ranges->hdpa);
} }
@ -2523,9 +2523,9 @@ static RANGES ranges_clone(RANGES ranges)
RANGES clone; RANGES clone;
INT i; INT i;
if (!(clone = ranges_create(ranges->hdpa->nItemCount))) goto fail; if (!(clone = ranges_create(DPA_GetPtrCount(ranges->hdpa)))) goto fail;
for (i = 0; i < ranges->hdpa->nItemCount; i++) for (i = 0; i < DPA_GetPtrCount(ranges->hdpa); i++)
{ {
RANGE *newrng = (RANGE *)COMCTL32_Alloc(sizeof(RANGE)); RANGE *newrng = (RANGE *)COMCTL32_Alloc(sizeof(RANGE));
if (!newrng) goto fail; if (!newrng) goto fail;
@ -2544,7 +2544,7 @@ static RANGES ranges_diff(RANGES ranges, RANGES sub)
{ {
INT i; INT i;
for (i = 0; i < sub->hdpa->nItemCount; i++) for (i = 0; i < DPA_GetPtrCount(sub->hdpa); i++)
ranges_del(ranges, *((RANGE *)DPA_GetPtr(sub->hdpa, i))); ranges_del(ranges, *((RANGE *)DPA_GetPtr(sub->hdpa, i)));
return ranges; return ranges;
@ -2554,7 +2554,7 @@ static void ranges_dump(RANGES ranges)
{ {
INT i; INT i;
for (i = 0; i < ranges->hdpa->nItemCount; i++) for (i = 0; i < DPA_GetPtrCount(ranges->hdpa); i++)
TRACE(" %s\n", debugrange(DPA_GetPtr(ranges->hdpa, i))); TRACE(" %s\n", debugrange(DPA_GetPtr(ranges->hdpa, i)));
} }
@ -2571,7 +2571,7 @@ static INT ranges_itemcount(RANGES ranges)
{ {
INT i, count = 0; INT i, count = 0;
for (i = 0; i < ranges->hdpa->nItemCount; i++) for (i = 0; i < DPA_GetPtrCount(ranges->hdpa); i++)
{ {
RANGE *sel = DPA_GetPtr(ranges->hdpa, i); RANGE *sel = DPA_GetPtr(ranges->hdpa, i);
count += sel->upper - sel->lower; count += sel->upper - sel->lower;
@ -2588,7 +2588,7 @@ static BOOL ranges_shift(RANGES ranges, INT nItem, INT delta, INT nUpper)
index = DPA_Search(ranges->hdpa, &srchrng, 0, ranges_cmp, 0, DPAS_SORTED | DPAS_INSERTAFTER); index = DPA_Search(ranges->hdpa, &srchrng, 0, ranges_cmp, 0, DPAS_SORTED | DPAS_INSERTAFTER);
if (index == -1) return TRUE; if (index == -1) return TRUE;
for (; index < ranges->hdpa->nItemCount; index++) for (; index < DPA_GetPtrCount(ranges->hdpa); index++)
{ {
chkrng = DPA_GetPtr(ranges->hdpa, index); chkrng = DPA_GetPtr(ranges->hdpa, index);
if (chkrng->lower >= nItem) if (chkrng->lower >= nItem)
@ -3331,7 +3331,7 @@ static BOOL set_sub_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL i
if (infoPtr->dwStyle & LVS_OWNERDATA) return FALSE; if (infoPtr->dwStyle & LVS_OWNERDATA) return FALSE;
/* set subitem only if column is present */ /* set subitem only if column is present */
if (lpLVItem->iSubItem >= infoPtr->hdpaColumns->nItemCount) return FALSE; if (lpLVItem->iSubItem >= DPA_GetPtrCount(infoPtr->hdpaColumns)) return FALSE;
/* First do some sanity checks */ /* First do some sanity checks */
if (lpLVItem->mask & ~(LVIF_TEXT | LVIF_IMAGE)) return FALSE; if (lpLVItem->mask & ~(LVIF_TEXT | LVIF_IMAGE)) return FALSE;
@ -3350,7 +3350,7 @@ static BOOL set_sub_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL i
lpSubItem = (SUBITEM_INFO *)COMCTL32_Alloc(sizeof(SUBITEM_INFO)); lpSubItem = (SUBITEM_INFO *)COMCTL32_Alloc(sizeof(SUBITEM_INFO));
if (!lpSubItem) return FALSE; if (!lpSubItem) return FALSE;
/* we could binary search here, if need be...*/ /* we could binary search here, if need be...*/
for (i = 1; i < hdpaSubItems->nItemCount; i++) for (i = 1; i < DPA_GetPtrCount(hdpaSubItems); i++)
{ {
tmpSubItem = (SUBITEM_INFO *)DPA_GetPtr(hdpaSubItems, i); tmpSubItem = (SUBITEM_INFO *)DPA_GetPtr(hdpaSubItems, i);
if (tmpSubItem->iSubItem > lpLVItem->iSubItem) break; if (tmpSubItem->iSubItem > lpLVItem->iSubItem) break;
@ -3741,12 +3741,12 @@ static void LISTVIEW_RefreshReport(LISTVIEW_INFO *infoPtr, ITERATOR *i, HDC hdc,
LISTVIEW_GetOrigin(infoPtr, &Origin); LISTVIEW_GetOrigin(infoPtr, &Origin);
/* narrow down the columns we need to paint */ /* narrow down the columns we need to paint */
for(colRange.lower = 0; colRange.lower < infoPtr->hdpaColumns->nItemCount; colRange.lower++) for(colRange.lower = 0; colRange.lower < DPA_GetPtrCount(infoPtr->hdpaColumns); colRange.lower++)
{ {
LISTVIEW_GetHeaderRect(infoPtr, colRange.lower, &rcItem); LISTVIEW_GetHeaderRect(infoPtr, colRange.lower, &rcItem);
if (rcItem.right + Origin.x >= rcClip.left) break; if (rcItem.right + Origin.x >= rcClip.left) break;
} }
for(colRange.upper = infoPtr->hdpaColumns->nItemCount; colRange.upper > 0; colRange.upper--) for(colRange.upper = DPA_GetPtrCount(infoPtr->hdpaColumns); colRange.upper > 0; colRange.upper--)
{ {
LISTVIEW_GetHeaderRect(infoPtr, colRange.upper - 1, &rcItem); LISTVIEW_GetHeaderRect(infoPtr, colRange.upper - 1, &rcItem);
if (rcItem.left + Origin.x < rcClip.right) break; if (rcItem.left + Origin.x < rcClip.right) break;
@ -4017,7 +4017,7 @@ static BOOL LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr)
if (!(infoPtr->dwStyle & LVS_OWNERDATA)) if (!(infoPtr->dwStyle & LVS_OWNERDATA))
{ {
hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, i); hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, i);
for (j = 0; j < hdpaSubItems->nItemCount; j++) for (j = 0; j < DPA_GetPtrCount(hdpaSubItems); j++)
{ {
hdrItem = (ITEMHDR *)DPA_GetPtr(hdpaSubItems, j); hdrItem = (ITEMHDR *)DPA_GetPtr(hdpaSubItems, j);
if (is_textW(hdrItem->pszText)) COMCTL32_Free(hdrItem->pszText); if (is_textW(hdrItem->pszText)) COMCTL32_Free(hdrItem->pszText);
@ -4056,14 +4056,14 @@ static void LISTVIEW_ScrollColumns(LISTVIEW_INFO *infoPtr, INT nColumn, INT dx)
RECT rcOld, rcCol; RECT rcOld, rcCol;
INT nCol; INT nCol;
if (nColumn < 0 || infoPtr->hdpaColumns->nItemCount < 1) return; if (nColumn < 0 || DPA_GetPtrCount(infoPtr->hdpaColumns) < 1) return;
lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, min(nColumn, infoPtr->hdpaColumns->nItemCount - 1)); lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, min(nColumn, DPA_GetPtrCount(infoPtr->hdpaColumns) - 1));
rcCol = lpColumnInfo->rcHeader; rcCol = lpColumnInfo->rcHeader;
if (nColumn >= infoPtr->hdpaColumns->nItemCount) if (nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns))
rcCol.left = rcCol.right; rcCol.left = rcCol.right;
/* ajust the other columns */ /* ajust the other columns */
for (nCol = nColumn; nCol < infoPtr->hdpaColumns->nItemCount; nCol++) for (nCol = nColumn; nCol < DPA_GetPtrCount(infoPtr->hdpaColumns); nCol++)
{ {
lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, nCol); lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, nCol);
lpColumnInfo->rcHeader.left += dx; lpColumnInfo->rcHeader.left += dx;
@ -4108,8 +4108,8 @@ static BOOL LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn)
TRACE("nColumn=%d\n", nColumn); TRACE("nColumn=%d\n", nColumn);
if (nColumn < 0 || infoPtr->hdpaColumns->nItemCount == 0 if (nColumn < 0 || DPA_GetPtrCount(infoPtr->hdpaColumns) == 0
|| nColumn >= infoPtr->hdpaColumns->nItemCount) return FALSE; || nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns)) return FALSE;
/* While the MSDN specifically says that column zero should not be deleted, /* While the MSDN specifically says that column zero should not be deleted,
it does in fact work on WinNT, and at least one app depends on it. On it does in fact work on WinNT, and at least one app depends on it. On
@ -4118,7 +4118,7 @@ static BOOL LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn)
we just delete the last column including the header. we just delete the last column including the header.
*/ */
if (nColumn == 0) if (nColumn == 0)
nColumn = infoPtr->hdpaColumns->nItemCount - 1; nColumn = DPA_GetPtrCount(infoPtr->hdpaColumns) - 1;
LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcCol); LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcCol);
@ -4142,7 +4142,7 @@ static BOOL LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn)
hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem); hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem);
nSubItem = 0; nSubItem = 0;
lpDelItem = 0; lpDelItem = 0;
for (i = 1; i < hdpaSubItems->nItemCount; i++) for (i = 1; i < DPA_GetPtrCount(hdpaSubItems); i++)
{ {
lpSubItem = (SUBITEM_INFO *)DPA_GetPtr(hdpaSubItems, i); lpSubItem = (SUBITEM_INFO *)DPA_GetPtr(hdpaSubItems, i);
if (lpSubItem->iSubItem == nColumn) if (lpSubItem->iSubItem == nColumn)
@ -4294,7 +4294,7 @@ static BOOL LISTVIEW_DeleteItem(LISTVIEW_INFO *infoPtr, INT nItem)
INT i; INT i;
hdpaSubItems = (HDPA)DPA_DeletePtr(infoPtr->hdpaItems, nItem); hdpaSubItems = (HDPA)DPA_DeletePtr(infoPtr->hdpaItems, nItem);
for (i = 0; i < hdpaSubItems->nItemCount; i++) for (i = 0; i < DPA_GetPtrCount(hdpaSubItems); i++)
{ {
hdrItem = (ITEMHDR *)DPA_GetPtr(hdpaSubItems, i); hdrItem = (ITEMHDR *)DPA_GetPtr(hdpaSubItems, i);
if (is_textW(hdrItem->pszText)) COMCTL32_Free(hdrItem->pszText); if (is_textW(hdrItem->pszText)) COMCTL32_Free(hdrItem->pszText);
@ -4711,7 +4711,7 @@ static BOOL LISTVIEW_GetColumnT(LISTVIEW_INFO *infoPtr, INT nColumn, LPLVCOLUMNW
COLUMN_INFO *lpColumnInfo; COLUMN_INFO *lpColumnInfo;
HDITEMW hdi; HDITEMW hdi;
if (!lpColumn || nColumn < 0 || nColumn >= infoPtr->hdpaColumns->nItemCount) return FALSE; if (!lpColumn || nColumn < 0 || nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns)) return FALSE;
lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, nColumn); lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, nColumn);
/* initialize memory */ /* initialize memory */
@ -4788,7 +4788,7 @@ static INT LISTVIEW_GetColumnWidth(LISTVIEW_INFO *infoPtr, INT nColumn)
nColumnWidth = infoPtr->nItemWidth; nColumnWidth = infoPtr->nItemWidth;
break; break;
case LVS_REPORT: case LVS_REPORT:
if (nColumn < 0 || nColumn >= infoPtr->hdpaColumns->nItemCount) return 0; if (nColumn < 0 || nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns)) return 0;
LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcHeader); LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcHeader);
nColumnWidth = rcHeader.right - rcHeader.left; nColumnWidth = rcHeader.right - rcHeader.left;
break; break;
@ -5849,7 +5849,7 @@ static INT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BOOL s
INT j; INT j;
rcBounds.right = rcBounds.left; rcBounds.right = rcBounds.left;
for (j = 0; j < infoPtr->hdpaColumns->nItemCount; j++) for (j = 0; j < DPA_GetPtrCount(infoPtr->hdpaColumns); j++)
{ {
rcBounds.left = rcBounds.right; rcBounds.left = rcBounds.right;
rcBounds.right += LISTVIEW_GetColumnWidth(infoPtr, j); rcBounds.right += LISTVIEW_GetColumnWidth(infoPtr, j);
@ -6230,7 +6230,7 @@ static INT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
TRACE("(nColumn=%d, lpColumn=%s, isW=%d)\n", nColumn, debuglvcolumn_t(lpColumn, isW), isW); TRACE("(nColumn=%d, lpColumn=%s, isW=%d)\n", nColumn, debuglvcolumn_t(lpColumn, isW), isW);
if (!lpColumn || nColumn < 0) return -1; if (!lpColumn || nColumn < 0) return -1;
nColumn = min(nColumn, infoPtr->hdpaColumns->nItemCount); nColumn = min(nColumn, DPA_GetPtrCount(infoPtr->hdpaColumns));
ZeroMemory(&hdi, sizeof(HDITEMW)); ZeroMemory(&hdi, sizeof(HDITEMW));
column_fill_hditem(infoPtr, &hdi, nColumn, lpColumn, isW); column_fill_hditem(infoPtr, &hdi, nColumn, lpColumn, isW);
@ -6259,7 +6259,7 @@ static INT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
for (nItem = 0; nItem < infoPtr->nItemCount; nItem++) for (nItem = 0; nItem < infoPtr->nItemCount; nItem++)
{ {
hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem); hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem);
for (i = 1; i < hdpaSubItems->nItemCount; i++) for (i = 1; i < DPA_GetPtrCount(hdpaSubItems); i++)
{ {
lpSubItem = (SUBITEM_INFO *)DPA_GetPtr(hdpaSubItems, i); lpSubItem = (SUBITEM_INFO *)DPA_GetPtr(hdpaSubItems, i);
if (lpSubItem->iSubItem >= nNewColumn) if (lpSubItem->iSubItem >= nNewColumn)
@ -6305,7 +6305,7 @@ static BOOL LISTVIEW_SetColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
TRACE("(nColumn=%d, lpColumn=%s, isW=%d)\n", nColumn, debuglvcolumn_t(lpColumn, isW), isW); TRACE("(nColumn=%d, lpColumn=%s, isW=%d)\n", nColumn, debuglvcolumn_t(lpColumn, isW), isW);
if (!lpColumn || nColumn < 0 || nColumn >= infoPtr->hdpaColumns->nItemCount) return FALSE; if (!lpColumn || nColumn < 0 || nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns)) return FALSE;
ZeroMemory(&hdi, sizeof(HDITEMW)); ZeroMemory(&hdi, sizeof(HDITEMW));
if (lpColumn->mask & LVCF_FMT) if (lpColumn->mask & LVCF_FMT)
@ -6398,9 +6398,9 @@ static BOOL LISTVIEW_SetColumnWidth(LISTVIEW_INFO *infoPtr, INT nColumn, INT cx)
return TRUE; return TRUE;
} }
if (nColumn < 0 || nColumn >= infoPtr->hdpaColumns->nItemCount) return FALSE; if (nColumn < 0 || nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns)) return FALSE;
if (cx == LVSCW_AUTOSIZE || (cx == LVSCW_AUTOSIZE_USEHEADER && nColumn < infoPtr->hdpaColumns->nItemCount -1)) if (cx == LVSCW_AUTOSIZE || (cx == LVSCW_AUTOSIZE_USEHEADER && nColumn < DPA_GetPtrCount(infoPtr->hdpaColumns) -1))
{ {
INT nLabelWidth; INT nLabelWidth;
LVITEMW lvItem; LVITEMW lvItem;
@ -6427,7 +6427,7 @@ static BOOL LISTVIEW_SetColumnWidth(LISTVIEW_INFO *infoPtr, INT nColumn, INT cx)
else if(cx == LVSCW_AUTOSIZE_USEHEADER) else if(cx == LVSCW_AUTOSIZE_USEHEADER)
{ {
/* if iCol is the last column make it fill the remainder of the controls width */ /* if iCol is the last column make it fill the remainder of the controls width */
if(nColumn == infoPtr->hdpaColumns->nItemCount - 1) if(nColumn == DPA_GetPtrCount(infoPtr->hdpaColumns) - 1)
{ {
RECT rcHeader; RECT rcHeader;
POINT Origin; POINT Origin;
@ -7884,7 +7884,7 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
TRACE("(lpnmh=%p)\n", lpnmh); TRACE("(lpnmh=%p)\n", lpnmh);
if (!lpnmh || lpnmh->iItem < 0 || lpnmh->iItem >= infoPtr->hdpaColumns->nItemCount) return 0; if (!lpnmh || lpnmh->iItem < 0 || lpnmh->iItem >= DPA_GetPtrCount(infoPtr->hdpaColumns)) return 0;
switch (lpnmh->hdr.code) switch (lpnmh->hdr.code)
{ {

View File

@ -35,6 +35,7 @@
#include "winuser.h" #include "winuser.h"
#include "winnls.h" #include "winnls.h"
#include "commctrl.h" #include "commctrl.h"
#include "comctl32.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(nativefont); WINE_DEFAULT_DEBUG_CHANNEL(nativefont);

View File

@ -36,6 +36,7 @@
#include "winuser.h" #include "winuser.h"
#include "winnls.h" #include "winnls.h"
#include "commctrl.h" #include "commctrl.h"
#include "comctl32.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(pager); WINE_DEFAULT_DEBUG_CHANNEL(pager);

View File

@ -40,6 +40,7 @@
#include "winuser.h" #include "winuser.h"
#include "winnls.h" #include "winnls.h"
#include "commctrl.h" #include "commctrl.h"
#include "comctl32.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(progress); WINE_DEFAULT_DEBUG_CHANNEL(progress);

View File

@ -150,6 +150,7 @@
#include "winuser.h" #include "winuser.h"
#include "winnls.h" #include "winnls.h"
#include "commctrl.h" #include "commctrl.h"
#include "comctl32.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(rebar); WINE_DEFAULT_DEBUG_CHANNEL(rebar);

View File

@ -50,6 +50,7 @@
#include "winuser.h" #include "winuser.h"
#include "winnls.h" #include "winnls.h"
#include "commctrl.h" #include "commctrl.h"
#include "comctl32.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(statusbar); WINE_DEFAULT_DEBUG_CHANNEL(statusbar);

View File

@ -2607,7 +2607,7 @@ TOOLBAR_AddStringW (HWND hwnd, WPARAM wParam, LPARAM lParam)
COMCTL32_Free(oldStrings); COMCTL32_Free(oldStrings);
} }
np=COMCTL32_StrChrW (p, L'|'); np=strchrW (p, '|');
if (np!=NULL) { if (np!=NULL) {
len = np - p; len = np - p;
np++; np++;

View File

@ -81,6 +81,7 @@
#include "winuser.h" #include "winuser.h"
#include "winnls.h" #include "winnls.h"
#include "commctrl.h" #include "commctrl.h"
#include "comctl32.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(tooltips); WINE_DEFAULT_DEBUG_CHANNEL(tooltips);

View File

@ -1815,7 +1815,7 @@ TREEVIEW_GetFont(TREEVIEW_INFO *infoPtr)
static INT CALLBACK static INT CALLBACK
TREEVIEW_ResetTextWidth(LPVOID pItem, DWORD unused) TREEVIEW_ResetTextWidth(LPVOID pItem, LPVOID unused)
{ {
(void)unused; (void)unused;

View File

@ -39,6 +39,7 @@
#include "winuser.h" #include "winuser.h"
#include "winnls.h" #include "winnls.h"
#include "commctrl.h" #include "commctrl.h"
#include "comctl32.h"
#include "wine/unicode.h" #include "wine/unicode.h"
#include "wine/debug.h" #include "wine/debug.h"

View File

@ -267,24 +267,19 @@ BOOL SIC_Initialize(void)
* *
* frees the cache * frees the cache
*/ */
static INT CALLBACK sic_free( LPVOID ptr, LPVOID lparam )
{
SHFree(ptr);
return TRUE;
}
void SIC_Destroy(void) void SIC_Destroy(void)
{ {
LPSIC_ENTRY lpsice;
int i;
TRACE("\n"); TRACE("\n");
EnterCriticalSection(&SHELL32_SicCS); EnterCriticalSection(&SHELL32_SicCS);
if (sic_hdpa && NULL != DPA_GetPtr (sic_hdpa, 0)) if (sic_hdpa) DPA_DestroyCallback(sic_hdpa, sic_free, NULL );
{
for (i=0; i < DPA_GetPtrCount(sic_hdpa); ++i)
{
lpsice = DPA_GetPtr(sic_hdpa, i);
SHFree(lpsice);
}
DPA_Destroy(sic_hdpa);
}
sic_hdpa = NULL; sic_hdpa = NULL;

View File

@ -959,15 +959,6 @@ HRESULT WINAPI SHELL32_DllGetVersion (DLLVERSIONINFO *pdvi)
*/ */
void (WINAPI *pDLLInitComctl)(LPVOID); void (WINAPI *pDLLInitComctl)(LPVOID);
LPVOID (WINAPI *pCOMCTL32_Alloc) (INT);
BOOL (WINAPI *pCOMCTL32_Free) (LPVOID);
HANDLE (WINAPI *pCreateMRUListA) (LPVOID lpcml);
DWORD (WINAPI *pFreeMRUListA) (HANDLE hMRUList);
INT (WINAPI *pAddMRUData) (HANDLE hList, LPCVOID lpData, DWORD cbData);
INT (WINAPI *pFindMRUData) (HANDLE hList, LPCVOID lpData, DWORD cbData, LPINT lpRegNum);
INT (WINAPI *pEnumMRUListA) (HANDLE hList, INT nItemPos, LPVOID lpBuffer, DWORD nBufferSize);
static HINSTANCE hComctl32; static HINSTANCE hComctl32;
HINSTANCE shell32_hInstance = 0; HINSTANCE shell32_hInstance = 0;

View File

@ -563,12 +563,21 @@ static BOOLEAN LV_RenameItem(IShellViewImpl * This, LPCITEMIDLIST pidlOld, LPCIT
* - fills the list into the view * - fills the list into the view
*/ */
static INT CALLBACK fill_list( LPVOID ptr, LPVOID arg )
{
LPITEMIDLIST pidl = ptr;
IShellViewImpl *This = arg;
/* in a commdlg This works as a filemask*/
if ( IncludeObject(This, pidl)==S_OK ) LV_AddItem(This, pidl);
SHFree(pidl);
return TRUE;
}
static HRESULT ShellView_FillList(IShellViewImpl * This) static HRESULT ShellView_FillList(IShellViewImpl * This)
{ {
LPENUMIDLIST pEnumIDList; LPENUMIDLIST pEnumIDList;
LPITEMIDLIST pidl; LPITEMIDLIST pidl;
DWORD dwFetched; DWORD dwFetched;
INT i;
HRESULT hRes; HRESULT hRes;
HDPA hdpa; HDPA hdpa;
@ -605,21 +614,12 @@ static HRESULT ShellView_FillList(IShellViewImpl * This)
/*turn the listview's redrawing off*/ /*turn the listview's redrawing off*/
SendMessageA(This->hWndList, WM_SETREDRAW, FALSE, 0); SendMessageA(This->hWndList, WM_SETREDRAW, FALSE, 0);
for (i=0; i < DPA_GetPtrCount(hdpa); ++i) /* DPA_GetPtrCount is a macro*/ DPA_DestroyCallback( hdpa, fill_list, This );
{
pidl = (LPITEMIDLIST)DPA_GetPtr(hdpa, i);
/* in a commdlg This works as a filemask*/
if ( IncludeObject(This, pidl)==S_OK )
LV_AddItem(This, pidl);
SHFree(pidl);
}
/*turn the listview's redrawing back on and force it to draw*/ /*turn the listview's redrawing back on and force it to draw*/
SendMessageA(This->hWndList, WM_SETREDRAW, TRUE, 0); SendMessageA(This->hWndList, WM_SETREDRAW, TRUE, 0);
IEnumIDList_Release(pEnumIDList); /* destroy the list*/ IEnumIDList_Release(pEnumIDList); /* destroy the list*/
DPA_Destroy(hdpa);
return S_OK; return S_OK;
} }

View File

@ -4378,112 +4378,41 @@ DECL_WINELIB_TYPE_AW(LPNMDATETIMEFORMATQUERY)
SNDMSGA (hdp, DTM_GETMCFONT, 0, 0) SNDMSGA (hdp, DTM_GETMCFONT, 0, 0)
struct _DSA;
typedef struct _DSA *HDSA;
typedef INT (CALLBACK *PFNDSAENUMCALLBACK)(LPVOID, LPVOID);
HDSA WINAPI DSA_Create(INT, INT);
BOOL WINAPI DSA_Destroy(HDSA);
/************************************************************************** void WINAPI DSA_DestroyCallback(HDSA, PFNDSAENUMCALLBACK, LPVOID);
* UNDOCUMENTED functions LPVOID WINAPI DSA_GetItemPtr(HDSA, INT);
*/ INT WINAPI DSA_InsertItem(HDSA, INT, LPVOID);
/* private heap memory functions */
LPVOID WINAPI COMCTL32_Alloc (DWORD);
LPVOID WINAPI COMCTL32_ReAlloc (LPVOID, DWORD);
BOOL WINAPI COMCTL32_Free (LPVOID);
DWORD WINAPI COMCTL32_GetSize (LPVOID);
LPWSTR WINAPI COMCTL32_StrChrW (LPCWSTR, WORD);
INT WINAPI Str_GetPtrA (LPCSTR, LPSTR, INT);
BOOL WINAPI Str_SetPtrA (LPSTR *, LPCSTR);
INT WINAPI Str_GetPtrW (LPCWSTR, LPWSTR, INT);
BOOL WINAPI Str_SetPtrW (LPWSTR *, LPCWSTR);
#define Str_GetPtr WINELIB_NAME_AW(Str_GetPtr)
#define Str_SetPtr WINELIB_NAME_AW(Str_SetPtr)
/* Dynamic Storage Array */
typedef struct _DSA
{
INT nItemCount;
LPVOID pData;
INT nMaxCount;
INT nItemSize;
INT nGrow;
} DSA, *HDSA;
HDSA WINAPI DSA_Create (INT, INT);
BOOL WINAPI DSA_DeleteAllItems (const HDSA);
INT WINAPI DSA_DeleteItem (const HDSA, INT);
BOOL WINAPI DSA_Destroy (const HDSA);
BOOL WINAPI DSA_GetItem (const HDSA, INT, LPVOID);
LPVOID WINAPI DSA_GetItemPtr (const HDSA, INT);
INT WINAPI DSA_InsertItem (const HDSA, INT, LPVOID);
BOOL WINAPI DSA_SetItem (const HDSA, INT, LPVOID);
typedef INT (CALLBACK *DSAENUMPROC)(LPVOID, DWORD);
VOID WINAPI DSA_EnumCallback (const HDSA, DSAENUMPROC, LPARAM);
BOOL WINAPI DSA_DestroyCallback (const HDSA, DSAENUMPROC, LPARAM);
/* Dynamic Pointer Array */
typedef struct _DPA
{
INT nItemCount;
LPVOID *ptrs;
HANDLE hHeap;
INT nGrow;
INT nMaxCount;
} DPA, *HDPA;
HDPA WINAPI DPA_Create (INT);
HDPA WINAPI DPA_CreateEx (INT, HANDLE);
BOOL WINAPI DPA_Destroy (const HDPA);
HDPA WINAPI DPA_Clone (const HDPA, const HDPA);
LPVOID WINAPI DPA_GetPtr (const HDPA, INT);
INT WINAPI DPA_GetPtrIndex (const HDPA, LPVOID);
BOOL WINAPI DPA_Grow (const HDPA, INT);
BOOL WINAPI DPA_SetPtr (const HDPA, INT, LPVOID);
INT WINAPI DPA_InsertPtr (const HDPA, INT, LPVOID);
LPVOID WINAPI DPA_DeletePtr (const HDPA, INT);
BOOL WINAPI DPA_DeleteAllPtrs (const HDPA);
typedef INT (CALLBACK *PFNDPACOMPARE)(LPVOID, LPVOID, LPARAM);
BOOL WINAPI DPA_Sort (const HDPA, PFNDPACOMPARE, LPARAM);
#define DPAS_SORTED 0x0001 #define DPAS_SORTED 0x0001
#define DPAS_INSERTBEFORE 0x0002 #define DPAS_INSERTBEFORE 0x0002
#define DPAS_INSERTAFTER 0x0004 #define DPAS_INSERTAFTER 0x0004
INT WINAPI DPA_Search (const HDPA, LPVOID, INT, PFNDPACOMPARE, LPARAM, UINT);
#define DPAM_NOSORT 0x0001 struct _DPA;
#define DPAM_INSERT 0x0004 typedef struct _DPA *HDPA;
#define DPAM_DELETE 0x0008
typedef PVOID (CALLBACK *PFNDPAMERGE)(DWORD,PVOID,PVOID,LPARAM); typedef INT (CALLBACK *PFNDPAENUMCALLBACK)(LPVOID, LPVOID);
BOOL WINAPI DPA_Merge (const HDPA, const HDPA, DWORD, PFNDPACOMPARE, PFNDPAMERGE, LPARAM); typedef INT (CALLBACK *PFNDPACOMPARE)(LPVOID, LPVOID, LPARAM);
typedef INT (CALLBACK *DPAENUMPROC)(LPVOID, DWORD); HDPA WINAPI DPA_Create(INT);
VOID WINAPI DPA_EnumCallback (const HDPA, DPAENUMPROC, LPARAM); BOOL WINAPI DPA_Destroy(HDPA);
BOOL WINAPI DPA_DestroyCallback (const HDPA, DPAENUMPROC, LPARAM); LPVOID WINAPI DPA_DeletePtr(HDPA, INT);
BOOL WINAPI DPA_DeleteAllPtrs(HDPA);
BOOL WINAPI DPA_SetPtr(HDPA, INT, LPVOID);
LPVOID WINAPI DPA_GetPtr(HDPA, INT);
INT WINAPI DPA_InsertPtr(HDPA, INT, LPVOID);
BOOL WINAPI DPA_Sort(HDPA, PFNDPACOMPARE, LPARAM);
void WINAPI DPA_EnumCallback(HDPA, PFNDPAENUMCALLBACK, LPVOID);
void WINAPI DPA_DestroyCallback(HDPA, PFNDPAENUMCALLBACK, LPVOID);
INT WINAPI DPA_Search(HDPA, LPVOID, INT, PFNDPACOMPARE, LPARAM, UINT);
BOOL WINAPI Str_SetPtrW (LPWSTR *, LPCWSTR);
#define DPA_GetPtrCount(hdpa) (*(INT*)(hdpa))
#define DPA_GetPtrPtr(hdpa) (*((LPVOID**)((BYTE*)(hdpa)+sizeof(INT))))
#define DPA_FastGetPtr(hdpa,i) (DPA_GetPtrPtr(hdpa)[i])
/* notification helper functions */
LRESULT WINAPI COMCTL32_SendNotify (HWND, HWND, UINT, LPNMHDR);
/* type and functionality of last parameter is still unknown */
LRESULT WINAPI COMCTL32_SendNotifyEx (HWND, HWND, UINT, LPNMHDR, DWORD);
#ifdef __cplusplus #ifdef __cplusplus
} }