diff --git a/dll/win32/shell32/wine/control.c b/dll/win32/shell32/wine/control.c index 7485efcf261..67be8296dc5 100644 --- a/dll/win32/shell32/wine/control.c +++ b/dll/win32/shell32/wine/control.c @@ -67,8 +67,16 @@ CPlApplet* Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel) CPlApplet* applet; DWORD len; unsigned i; +#ifdef __REACTOS__ + CPLINFO info = { 0 }; + union { + NEWCPLINFOA NewCplInfoA; + NEWCPLINFOW NewCplInfoW; + } Newcpl; +#else CPLINFO info; NEWCPLINFOW newinfo; +#endif if (!(applet = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*applet)))) return applet; @@ -123,8 +131,12 @@ CPlApplet* Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel) FIELD_OFFSET( CPlApplet, info[applet->count] )); for (i = 0; i < applet->count; i++) { +#ifdef __REACTOS__ + ZeroMemory(&Newcpl, sizeof(Newcpl)); +#else ZeroMemory(&newinfo, sizeof(newinfo)); newinfo.dwSize = sizeof(NEWCPLINFOA); +#endif applet->info[i].helpfile[0] = 0; /* proc is supposed to return a null value upon success for * CPL_INQUIRE and CPL_NEWINQUIRE @@ -162,6 +174,39 @@ CPlApplet* Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel) if ((info.idIcon == CPL_DYNAMIC_RES) || (info.idName == CPL_DYNAMIC_RES) || (info.idInfo == CPL_DYNAMIC_RES)) { +#ifdef __REACTOS__ + applet->proc(hWnd, CPL_NEWINQUIRE, i, (LPARAM)&Newcpl); + applet->info[i].data = Newcpl.NewCplInfoA.lData; + if (info.idIcon == CPL_DYNAMIC_RES) { + if (!Newcpl.NewCplInfoA.hIcon) + WARN("couldn't get icon for applet %u\n", i); + /* This is CPL_NEWINQUIRE, so use the HICON value as idIcon */ + applet->info[i].idIcon = (INT)Newcpl.NewCplInfoA.hIcon; + } + if (Newcpl.NewCplInfoA.dwSize == sizeof(NEWCPLINFOW)) { + if (info.idName == CPL_DYNAMIC_RES) + memcpy(applet->info[i].name, Newcpl.NewCplInfoW.szName, + sizeof(Newcpl.NewCplInfoW.szName)); + if (info.idInfo == CPL_DYNAMIC_RES) + memcpy(applet->info[i].info, Newcpl.NewCplInfoW.szInfo, + sizeof(Newcpl.NewCplInfoW.szInfo)); + memcpy(applet->info[i].helpfile, Newcpl.NewCplInfoW.szHelpFile, + sizeof(Newcpl.NewCplInfoW.szHelpFile)); + } else { + if (info.idName == CPL_DYNAMIC_RES) + MultiByteToWideChar(CP_ACP, 0, Newcpl.NewCplInfoA.szName, + ARRAYSIZE(Newcpl.NewCplInfoA.szName), + applet->info[i].name, ARRAYSIZE(applet->info[i].name)); + if (info.idInfo == CPL_DYNAMIC_RES) + MultiByteToWideChar(CP_ACP, 0, Newcpl.NewCplInfoA.szInfo, + ARRAYSIZE(Newcpl.NewCplInfoA.szInfo), + applet->info[i].info, ARRAYSIZE(applet->info[i].info)); + + MultiByteToWideChar(CP_ACP, 0, Newcpl.NewCplInfoA.szHelpFile, + ARRAYSIZE(Newcpl.NewCplInfoA.szHelpFile), + applet->info[i].helpfile, + ARRAYSIZE(applet->info[i].helpfile)); +#else applet->proc(hWnd, CPL_NEWINQUIRE, i, (LPARAM)&newinfo); applet->info[i].data = newinfo.lData; @@ -188,6 +233,7 @@ CPlApplet* Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel) sizeof(((LPNEWCPLINFOA)&newinfo)->szHelpFile) / sizeof(CHAR), applet->info[i].helpfile, sizeof(applet->info[i].helpfile) / sizeof(WCHAR)); +#endif } } } diff --git a/win32ss/user/user32/windows/cursoricon.c b/win32ss/user/user32/windows/cursoricon.c index 1f6b71714aa..1d3afa1b7b6 100644 --- a/win32ss/user/user32/windows/cursoricon.c +++ b/win32ss/user/user32/windows/cursoricon.c @@ -2031,6 +2031,37 @@ HICON WINAPI LoadIconA( _In_ LPCSTR lpIconName ) { +#ifdef __REACTOS__ + /* We want to see if this call is for a Control Panel applet. + * These have extensions of '.cpl' and if this is true, then it + * is likely that this is a response to a CPL_NEWINQUIRE message. + * If so, we want to use the HICON value to return the idIcon + * resource number which is what ReactOS can handle for now. */ + DWORD ret, size = MAX_PATH, len; + UNICODE_STRING ustrModule = {0, 0, NULL}; + WCHAR ext[5] = { 0 }; + + ustrModule.Buffer = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); + if (!ustrModule.Buffer) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return NULL; + } + ret = GetModuleFileNameW(hInstance, ustrModule.Buffer, size); + if(ret == 0) + { + HeapFree(GetProcessHeap(), 0, ustrModule.Buffer); + return NULL; + } + len = wcslen(ustrModule.Buffer); + if (len > 4) + memcpy(ext, (VOID*)((LONG_PTR)ustrModule.Buffer + (len * 2) - 8), 8); + + if (wcsicmp(ext, L".cpl") == 0) + return (HICON)MAKEINTRESOURCEW(lpIconName); + /* End of CPL_NEWINQUIRE special handling */ + +#endif TRACE("%p, %s\n", hInstance, debugstr_a(lpIconName)); return LoadImageA(hInstance,