Module: wine Branch: master Commit: 67826491a69f9cddfea6feef0ba27ddd0efe384a URL: http://source.winehq.org/git/wine.git/?a=commit;h=67826491a69f9cddfea6feef0b...
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
---
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 6974332..6d2c61b 100644 --- a/dlls/shell32/shell32.spec +++ b/dlls/shell32/shell32.spec @@ -440,9 +440,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 c0ef53a..7a432c6 100644 --- a/dlls/shell32/shlexec.c +++ b/dlls/shell32/shlexec.c @@ -2016,6 +2016,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)