Module: wine Branch: stable Commit: afd8c13c7585a4a3d4a8e4d20513bed39803d803 URL: https://source.winehq.org/git/wine.git/?a=commit;h=afd8c13c7585a4a3d4a8e4d20...
Author: Alex Henrie alexhenrie24@gmail.com Date: Mon Sep 25 22:52:52 2017 -0600
shell32: Implement ShellExec_RunDLL.
Signed-off-by: Alex Henrie alexhenrie24@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 67826491a69f9cddfea6feef0ba27ddd0efe384a) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/shell32/shell32.spec | 6 +++--- dlls/shell32/shlexec.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-)
diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec index cd4f24a..4f8d6cd 100644 --- a/dlls/shell32/shell32.spec +++ b/dlls/shell32/shell32.spec @@ -436,9 +436,9 @@ @ stub SheShortenPathW @ stdcall ShellAboutA(long str str long) @ stdcall ShellAboutW(long wstr wstr long) -@ stub ShellExec_RunDLL -@ stub ShellExec_RunDLLA -@ stub ShellExec_RunDLLW +@ stdcall ShellExec_RunDLL(long long str long) ShellExec_RunDLLA +@ stdcall ShellExec_RunDLLA(long long str long) +@ stdcall ShellExec_RunDLLW(long long wstr long) @ stdcall ShellExecuteA(long str str str str long) @ stdcall ShellExecuteEx (long) ShellExecuteExA @ stdcall ShellExecuteExA (long) diff --git a/dlls/shell32/shlexec.c b/dlls/shell32/shlexec.c index 6aa3eec..1c2f1a4 100644 --- a/dlls/shell32/shlexec.c +++ b/dlls/shell32/shlexec.c @@ -2014,6 +2014,58 @@ HINSTANCE WINAPI WOWShellExecute(HWND hWnd, LPCSTR lpVerb,LPCSTR lpFile, }
/************************************************************************* + * ShellExec_RunDLLW [SHELL32.@] + */ +void WINAPI ShellExec_RunDLLW(HWND hwnd, HINSTANCE instance, WCHAR *cmdline, int cmdshow) +{ + BOOL in_single_quotes = FALSE, in_double_quotes = FALSE; + WCHAR *args; + + TRACE("%p, %p, %s, %d\n", hwnd, instance, debugstr_w(cmdline), cmdshow); + + /* Replace the first whitespace character in the command line string with a + null terminator to separate the program name from the program arguments */ + for (args = cmdline; *args; args++) + { + switch (*args) + { + case '\': + args++; /* skip the next character */ + break; + case ''': + if (!in_double_quotes) + in_single_quotes = !in_single_quotes; + break; + case '"': + if (!in_single_quotes) + in_double_quotes = !in_double_quotes; + break; + case ' ': + case '\t': + if (!in_single_quotes && !in_double_quotes) + { + *args = 0; + args++; + goto execute; + } + } + } + +execute: + ShellExecuteW(hwnd, NULL, cmdline, args, NULL, cmdshow); +} + +/************************************************************************* + * ShellExec_RunDLLA [SHELL32.@] + */ +void WINAPI ShellExec_RunDLLA(HWND hwnd, HINSTANCE instance, CHAR *cmdline, int cmdshow) +{ + WCHAR *cmdlineW; + ShellExec_RunDLLW(hwnd, instance, __SHCloneStrAtoW(&cmdlineW, cmdline), cmdshow); + SHFree(cmdlineW); +} + +/************************************************************************* * OpenAs_RunDLLA [SHELL32.@] */ void WINAPI OpenAs_RunDLLA(HWND hwnd, HINSTANCE hinst, LPCSTR cmdline, int cmdshow)