This is required to enable common control v6 for library functions called by rundll32.exe.
Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com --- programs/rundll32/rundll32.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/programs/rundll32/rundll32.c b/programs/rundll32/rundll32.c index fe9d17f0f48..deae5d664c3 100644 --- a/programs/rundll32/rundll32.c +++ b/programs/rundll32/rundll32.c @@ -276,9 +276,12 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE hOldInstance, LPWSTR szCmdLine HWND hWnd; LPWSTR szDllName,szEntryPoint; void *entry_point = NULL; - BOOL unicode = FALSE, win16 = FALSE; + BOOL unicode = FALSE, win16 = FALSE, activated = FALSE; + HMODULE hDll, hCtx = INVALID_HANDLE_VALUE; + WCHAR path[MAX_PATH]; STARTUPINFOW info; - HMODULE hDll; + ULONG_PTR cookie; + ACTCTXW ctx;
hWnd=NULL; hDll=NULL; @@ -301,6 +304,21 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE hOldInstance, LPWSTR szCmdLine szEntryPoint = get_next_arg(&szCmdLine); WINE_TRACE("EntryPoint=%s\n",wine_dbgstr_w(szEntryPoint));
+ /* Activate context before DllMain() is called */ + if (SearchPathW(NULL, szDllName, NULL, ARRAY_SIZE(path), path, NULL)) + { + memset(&ctx, 0, sizeof(ctx)); + ctx.cbSize = sizeof(ctx); + ctx.lpSource = path; + ctx.lpResourceName = MAKEINTRESOURCEW(123); + ctx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID; + hCtx = CreateActCtxW(&ctx); + if (hCtx != INVALID_HANDLE_VALUE) + activated = ActivateActCtx(hCtx, &cookie); + else + WINE_TRACE("No manifest at ID 123 in %s\n", wine_dbgstr_w(path)); + } + /* Load the library */ hDll=LoadLibraryW(szDllName); if (hDll) entry_point = get_entry_point32( hDll, szEntryPoint, &unicode ); @@ -363,6 +381,9 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE hOldInstance, LPWSTR szCmdLine }
CLEANUP: + if (activated) + DeactivateActCtx(0, cookie); + ReleaseActCtx(hCtx); if (hWnd) DestroyWindow(hWnd); if (hDll)