[PATCH 4/4] shell32: Forward some functions to shcore.dll
Nikolay Sivov
nsivov at codeweavers.com
Mon Nov 26 02:53:13 CST 2018
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/shell32/shell32.spec | 6 +-
dlls/shell32/shell32_main.c | 279 ------------------------------------
tools/make_specfiles | 14 +-
3 files changed, 10 insertions(+), 289 deletions(-)
diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec
index 837abd3fec..23243e1f22 100644
--- a/dlls/shell32/shell32.spec
+++ b/dlls/shell32/shell32.spec
@@ -271,7 +271,7 @@
@ stdcall CheckEscapesA(str long)
@ stdcall CheckEscapesW(wstr long)
-@ stdcall CommandLineToArgvW(wstr ptr)
+@ stdcall CommandLineToArgvW(wstr ptr) shcore.CommandLineToArgvW
@ stdcall Control_FillCache_RunDLL(long long long long) Control_FillCache_RunDLLA
@ stdcall Control_FillCache_RunDLLA(long long long long)
@ stdcall Control_FillCache_RunDLLW(long long long long)
@@ -312,7 +312,7 @@
@ stdcall FindExecutableW(wstr wstr ptr)
@ stub FixupOptionalComponents
@ stdcall FreeIconList(long)
-@ stdcall GetCurrentProcessExplicitAppUserModelID(ptr)
+@ stdcall GetCurrentProcessExplicitAppUserModelID(ptr) shcore.GetCurrentProcessExplicitAppUserModelID
@ stdcall InitNetworkAddressControl()
@ stub InternalExtractIconListA
@ stub InternalExtractIconListW
@@ -328,7 +328,7 @@
@ stub RealShellExecuteExW
@ stub RealShellExecuteW
@ stdcall RegenerateUserEnvironment(ptr long)
-@ stdcall SetCurrentProcessExplicitAppUserModelID(wstr)
+@ stdcall SetCurrentProcessExplicitAppUserModelID(wstr) shcore.SetCurrentProcessExplicitAppUserModelID
@ stdcall SHAddToRecentDocs (long ptr)
@ stdcall SHAppBarMessage(long ptr)
@ stdcall SHAssocEnumHandlers(wstr long ptr)
diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c
index e78e8f8c56..a791966031 100644
--- a/dlls/shell32/shell32_main.c
+++ b/dlls/shell32/shell32_main.c
@@ -55,266 +55,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(shell);
-/*************************************************************************
- * CommandLineToArgvW [SHELL32.@]
- *
- * We must interpret the quotes in the command line to rebuild the argv
- * array correctly:
- * - arguments are separated by spaces or tabs
- * - quotes serve as optional argument delimiters
- * '"a b"' -> 'a b'
- * - escaped quotes must be converted back to '"'
- * '\"' -> '"'
- * - consecutive backslashes preceding a quote see their number halved with
- * the remainder escaping the quote:
- * 2n backslashes + quote -> n backslashes + quote as an argument delimiter
- * 2n+1 backslashes + quote -> n backslashes + literal quote
- * - backslashes that are not followed by a quote are copied literally:
- * 'a\b' -> 'a\b'
- * 'a\\b' -> 'a\\b'
- * - in quoted strings, consecutive quotes see their number divided by three
- * with the remainder modulo 3 deciding whether to close the string or not.
- * Note that the opening quote must be counted in the consecutive quotes,
- * that's the (1+) below:
- * (1+) 3n quotes -> n quotes
- * (1+) 3n+1 quotes -> n quotes plus closes the quoted string
- * (1+) 3n+2 quotes -> n+1 quotes plus closes the quoted string
- * - in unquoted strings, the first quote opens the quoted string and the
- * remaining consecutive quotes follow the above rule.
- */
-LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs)
-{
- DWORD argc;
- LPWSTR *argv;
- LPCWSTR s;
- LPWSTR d;
- LPWSTR cmdline;
- int qcount,bcount;
-
- if(!numargs)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return NULL;
- }
-
- if (*lpCmdline==0)
- {
- /* Return the path to the executable */
- DWORD len, deslen=MAX_PATH, size;
-
- size = sizeof(LPWSTR)*2 + deslen*sizeof(WCHAR);
- for (;;)
- {
- if (!(argv = LocalAlloc(LMEM_FIXED, size))) return NULL;
- len = GetModuleFileNameW(0, (LPWSTR)(argv+2), deslen);
- if (!len)
- {
- LocalFree(argv);
- return NULL;
- }
- if (len < deslen) break;
- deslen*=2;
- size = sizeof(LPWSTR)*2 + deslen*sizeof(WCHAR);
- LocalFree( argv );
- }
- argv[0]=(LPWSTR)(argv+2);
- argv[1]=NULL;
- *numargs=1;
-
- return argv;
- }
-
- /* --- First count the arguments */
- argc=1;
- s=lpCmdline;
- /* The first argument, the executable path, follows special rules */
- if (*s=='"')
- {
- /* The executable path ends at the next quote, no matter what */
- s++;
- while (*s)
- if (*s++=='"')
- break;
- }
- else
- {
- /* The executable path ends at the next space, no matter what */
- while (*s && *s!=' ' && *s!='\t')
- s++;
- }
- /* skip to the first argument, if any */
- while (*s==' ' || *s=='\t')
- s++;
- if (*s)
- argc++;
-
- /* Analyze the remaining arguments */
- qcount=bcount=0;
- while (*s)
- {
- if ((*s==' ' || *s=='\t') && qcount==0)
- {
- /* skip to the next argument and count it if any */
- while (*s==' ' || *s=='\t')
- s++;
- if (*s)
- argc++;
- bcount=0;
- }
- else if (*s=='\\')
- {
- /* '\', count them */
- bcount++;
- s++;
- }
- else if (*s=='"')
- {
- /* '"' */
- if ((bcount & 1)==0)
- qcount++; /* unescaped '"' */
- s++;
- bcount=0;
- /* consecutive quotes, see comment in copying code below */
- while (*s=='"')
- {
- qcount++;
- s++;
- }
- qcount=qcount % 3;
- if (qcount==2)
- qcount=0;
- }
- else
- {
- /* a regular character */
- bcount=0;
- s++;
- }
- }
-
- /* Allocate in a single lump, the string array, and the strings that go
- * with it. This way the caller can make a single LocalFree() call to free
- * both, as per MSDN.
- */
- argv=LocalAlloc(LMEM_FIXED, (argc+1)*sizeof(LPWSTR)+(strlenW(lpCmdline)+1)*sizeof(WCHAR));
- if (!argv)
- return NULL;
- cmdline=(LPWSTR)(argv+argc+1);
- strcpyW(cmdline, lpCmdline);
-
- /* --- Then split and copy the arguments */
- argv[0]=d=cmdline;
- argc=1;
- /* The first argument, the executable path, follows special rules */
- if (*d=='"')
- {
- /* The executable path ends at the next quote, no matter what */
- s=d+1;
- while (*s)
- {
- if (*s=='"')
- {
- s++;
- break;
- }
- *d++=*s++;
- }
- }
- else
- {
- /* The executable path ends at the next space, no matter what */
- while (*d && *d!=' ' && *d!='\t')
- d++;
- s=d;
- if (*s)
- s++;
- }
- /* close the executable path */
- *d++=0;
- /* skip to the first argument and initialize it if any */
- while (*s==' ' || *s=='\t')
- s++;
- if (!*s)
- {
- /* There are no parameters so we are all done */
- argv[argc]=NULL;
- *numargs=argc;
- return argv;
- }
-
- /* Split and copy the remaining arguments */
- argv[argc++]=d;
- qcount=bcount=0;
- while (*s)
- {
- if ((*s==' ' || *s=='\t') && qcount==0)
- {
- /* close the argument */
- *d++=0;
- bcount=0;
-
- /* skip to the next one and initialize it if any */
- do {
- s++;
- } while (*s==' ' || *s=='\t');
- if (*s)
- argv[argc++]=d;
- }
- else if (*s=='\\')
- {
- *d++=*s++;
- bcount++;
- }
- else if (*s=='"')
- {
- if ((bcount & 1)==0)
- {
- /* Preceded by an even number of '\', this is half that
- * number of '\', plus a quote which we erase.
- */
- d-=bcount/2;
- qcount++;
- }
- else
- {
- /* Preceded by an odd number of '\', this is half that
- * number of '\' followed by a '"'
- */
- d=d-bcount/2-1;
- *d++='"';
- }
- s++;
- bcount=0;
- /* Now count the number of consecutive quotes. Note that qcount
- * already takes into account the opening quote if any, as well as
- * the quote that lead us here.
- */
- while (*s=='"')
- {
- if (++qcount==3)
- {
- *d++='"';
- qcount=0;
- }
- s++;
- }
- if (qcount==2)
- qcount=0;
- }
- else
- {
- /* a regular character */
- *d++=*s++;
- bcount=0;
- }
- }
- *d='\0';
- argv[argc]=NULL;
- *numargs=argc;
-
- return argv;
-}
-
static DWORD shgfi_get_exe_type(LPCWSTR szFullPath)
{
BOOL status = FALSE;
@@ -1376,25 +1116,6 @@ HRESULT WINAPI SHGetLocalizedName(LPCWSTR path, LPWSTR module, UINT size, INT *r
return E_NOTIMPL;
}
-/***********************************************************************
- * SetCurrentProcessExplicitAppUserModelID (SHELL32.@)
- */
-HRESULT WINAPI SetCurrentProcessExplicitAppUserModelID(PCWSTR appid)
-{
- FIXME("%s: stub\n", debugstr_w(appid));
- return E_NOTIMPL;
-}
-
-/***********************************************************************
- * GetCurrentProcessExplicitAppUserModelID (SHELL32.@)
- */
-HRESULT WINAPI GetCurrentProcessExplicitAppUserModelID(PWSTR *appid)
-{
- FIXME("%p: stub\n", appid);
- *appid = NULL;
- return E_NOTIMPL;
-}
-
/***********************************************************************
* SHSetUnreadMailCountW (SHELL32.@)
*/
diff --git a/tools/make_specfiles b/tools/make_specfiles
index ffb3bae15f..2b38aed74e 100755
--- a/tools/make_specfiles
+++ b/tools/make_specfiles
@@ -338,6 +338,13 @@ my @dll_groups =
"secur32",
"sspicli",
],
+ [
+ "shcore",
+ "shell32",
+ "api-ms-win-shcore-obsolete-l1-1-0",
+ "api-ms-win-shcore-thread-l1-1-0",
+ "api-ms-win-shcore-stream-l1-1-0",
+ ],
[
"shell32",
"api-ms-win-downlevel-shell32-l1-1-0",
@@ -357,15 +364,8 @@ my @dll_groups =
[
"shell32",
"shlwapi",
- "shcore",
"api-ms-win-shcore-scaling-l1-1-1",
],
- [
- "shcore",
- "api-ms-win-shcore-obsolete-l1-1-0",
- "api-ms-win-shcore-thread-l1-1-0",
- "api-ms-win-shcore-stream-l1-1-0",
- ],
[
"user32",
"api-ms-win-core-stringansi-l1-1-0",
--
2.19.2
More information about the wine-devel
mailing list