[SHELL32]: Partial sync:

SHA-1: a08160680be1a3164e882fcc41504f115ba62f12
* shell32: Automatically expand CPL applet path string.
(Hermès Bélusca-Maïto)

svn path=/trunk/; revision=66361
This commit is contained in:
Hermès Bélusca-Maïto 2015-02-20 02:05:46 +00:00
parent e1ba90be5b
commit 6d4a7022f5

View file

@ -49,6 +49,7 @@ CPlApplet* Control_UnloadApplet(CPlApplet* applet)
FreeLibrary(applet->hModule); FreeLibrary(applet->hModule);
next = applet->next; next = applet->next;
HeapFree(GetProcessHeap(), 0, applet->cmd);
HeapFree(GetProcessHeap(), 0, applet); HeapFree(GetProcessHeap(), 0, applet);
return next; return next;
} }
@ -56,6 +57,7 @@ CPlApplet* Control_UnloadApplet(CPlApplet* applet)
CPlApplet* Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel) CPlApplet* Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel)
{ {
CPlApplet* applet; CPlApplet* applet;
DWORD len;
unsigned i; unsigned i;
CPLINFO info; CPLINFO info;
NEWCPLINFOW newinfo; NEWCPLINFOW newinfo;
@ -63,16 +65,32 @@ CPlApplet* Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel)
if (!(applet = (CPlApplet *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*applet)))) if (!(applet = (CPlApplet *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*applet))))
return applet; return applet;
len = ExpandEnvironmentStringsW(cmd, NULL, 0);
if (len > 0)
{
if (!(applet->cmd = HeapAlloc(GetProcessHeap(), 0, (len+1) * sizeof(WCHAR))))
{
WARN("Cannot allocate memory for applet path\n");
goto theError;
}
ExpandEnvironmentStringsW(cmd, applet->cmd, len+1);
}
else
{
WARN("Cannot expand applet path\n");
goto theError;
}
applet->hWnd = hWnd; applet->hWnd = hWnd;
if (!(applet->hModule = LoadLibraryW(cmd))) if (!(applet->hModule = LoadLibraryW(applet->cmd)))
{ {
WARN("Cannot load control panel applet %s\n", debugstr_w(cmd)); WARN("Cannot load control panel applet %s\n", debugstr_w(applet->cmd));
goto theError; goto theError;
} }
if (!(applet->proc = (APPLET_PROC)GetProcAddress(applet->hModule, "CPlApplet"))) if (!(applet->proc = (APPLET_PROC)GetProcAddress(applet->hModule, "CPlApplet")))
{ {
WARN("Not a valid control panel applet %s\n", debugstr_w(cmd)); WARN("Not a valid control panel applet %s\n", debugstr_w(applet->cmd));
goto theError; goto theError;
} }
if (!applet->proc(hWnd, CPL_INIT, 0L, 0L)) if (!applet->proc(hWnd, CPL_INIT, 0L, 0L))
@ -155,9 +173,9 @@ static void Control_WndProc_Create(HWND hWnd, const CREATESTRUCTW* cs)
panel->hWnd = hWnd; panel->hWnd = hWnd;
} }
#define XICON 32 #define XICON 32
#define XSTEP 128 #define XSTEP 128
#define YICON 32 #define YICON 32
#define YSTEP 64 #define YSTEP 64
static BOOL Control_Localize(const CPanel* panel, int cx, int cy, static BOOL Control_Localize(const CPanel* panel, int cx, int cy,