diff --git a/dlls/comctl32/comctl32.spec b/dlls/comctl32/comctl32.spec index 4249d5617e0..c2c76a3774b 100644 --- a/dlls/comctl32/comctl32.spec +++ b/dlls/comctl32/comctl32.spec @@ -101,10 +101,10 @@ 402 stdcall -noname FindMRUStringW(long wstr ptr) 403 stdcall -noname EnumMRUListW(long long ptr long) 404 stdcall -noname CreateMRUListLazyW(ptr long long long) -410 stdcall -noname SetWindowSubclass(long ptr long long) -411 stdcall -noname GetWindowSubclass(long ptr long ptr) -412 stdcall -noname RemoveWindowSubclass(long ptr long) -413 stdcall -noname DefSubclassProc(long long long long) +410 stdcall -ordinal SetWindowSubclass(long ptr long long) +411 stdcall -ordinal GetWindowSubclass(long ptr long ptr) +412 stdcall -ordinal RemoveWindowSubclass(long ptr long) +413 stdcall -ordinal DefSubclassProc(long long long long) 414 stdcall -noname MirrorIcon(ptr ptr) 415 stdcall -noname DrawTextWrap(long wstr long ptr long) user32.DrawTextW 416 stdcall -noname DrawTextExPrivWrap(long wstr long ptr long ptr) user32.DrawTextExW diff --git a/dlls/comctl32/tests/subclass.c b/dlls/comctl32/tests/subclass.c index f5a74ba45a0..8511275c8f9 100644 --- a/dlls/comctl32/tests/subclass.c +++ b/dlls/comctl32/tests/subclass.c @@ -279,25 +279,50 @@ static BOOL RegisterWindowClasses(void) return TRUE; } -START_TEST(subclass) +static int init_function_pointers(void) { - HMODULE hdll; - - hdll = GetModuleHandleA("comctl32.dll"); - assert(hdll); + HMODULE hmod; + void *ptr; + + hmod = GetModuleHandleA("comctl32.dll"); + assert(hmod); + /* Functions have to be loaded by ordinal. Only XP and W2K3 export * them by name. */ - pSetWindowSubclass = (void*)GetProcAddress(hdll, (LPSTR)410); - pRemoveWindowSubclass = (void*)GetProcAddress(hdll, (LPSTR)412); - pDefSubclassProc = (void*)GetProcAddress(hdll, (LPSTR)413); - +#define MAKEFUNC_ORD(f, ord) (p##f = (void*)GetProcAddress(hmod, (LPSTR)(ord))) + MAKEFUNC_ORD(SetWindowSubclass, 410); + MAKEFUNC_ORD(RemoveWindowSubclass, 412); + MAKEFUNC_ORD(DefSubclassProc, 413); +#undef MAKEFUNC_ORD + if(!pSetWindowSubclass || !pRemoveWindowSubclass || !pDefSubclassProc) { win_skip("SetWindowSubclass and friends are not available\n"); - return; + return 0; } + /* test named exports */ + ptr = GetProcAddress(hmod, "SetWindowSubclass"); + ok(broken(ptr == 0) || ptr != 0, "expected named export for SetWindowSubclass\n"); + if(ptr) + { +#define TESTNAMED(f) \ + ptr = (void*)GetProcAddress(hmod, #f); \ + ok(ptr != 0, "expected named export for " #f "\n"); + TESTNAMED(RemoveWindowSubclass); + TESTNAMED(DefSubclassProc); + /* GetWindowSubclass exported for V6 only */ +#undef TESTNAMED + } + + return 1; +} + +START_TEST(subclass) +{ + if(!init_function_pointers()) return; + if(!RegisterWindowClasses()) assert(0); test_subclass();