Commit 94324019 authored by Duane Clark's avatar Duane Clark Committed by Alexandre Julliard

Combined implementations of ShellExecute/Ex.

parent fe1e3e5c
......@@ -926,192 +926,6 @@ HRESULT WINAPI SHRunControlPanel (DWORD x, DWORD z)
{ FIXME("0x%08lx 0x%08lx stub\n",x,z);
return 0;
}
/*************************************************************************
* ShellExecuteEx [SHELL32.291]
*
*/
BOOL WINAPI ShellExecuteExAW (LPVOID sei)
{ if (SHELL_OsIsUnicode())
return ShellExecuteExW (sei);
return ShellExecuteExA (sei);
}
/*************************************************************************
* ShellExecuteExA [SHELL32.292]
*
* placeholder in the commandline:
* %1 file
* %2 printer
* %3 driver
* %4 port
* %I adress of a global item ID (explorer switch /idlist)
* %L ??? path/url/current file ???
* %S ???
* %* all following parameters (see batfile)
*/
BOOL WINAPI ShellExecuteExA (LPSHELLEXECUTEINFOA sei)
{ CHAR szApplicationName[MAX_PATH],szCommandline[MAX_PATH],szPidl[20];
LPSTR pos;
int gap, len;
STARTUPINFOA startup;
PROCESS_INFORMATION info;
WARN("mask=0x%08lx hwnd=0x%04x verb=%s file=%s parm=%s dir=%s show=0x%08x class=%s incomplete\n",
sei->fMask, sei->hwnd, debugstr_a(sei->lpVerb),
debugstr_a(sei->lpFile), debugstr_a(sei->lpParameters),
debugstr_a(sei->lpDirectory), sei->nShow,
(sei->fMask & SEE_MASK_CLASSNAME) ? debugstr_a(sei->lpClass) : "not used");
ZeroMemory(szApplicationName,MAX_PATH);
if (sei->lpFile)
strcpy(szApplicationName, sei->lpFile);
ZeroMemory(szCommandline,MAX_PATH);
if (sei->lpParameters)
strcpy(szCommandline, sei->lpParameters);
if (sei->fMask & (SEE_MASK_CLASSKEY | SEE_MASK_INVOKEIDLIST | SEE_MASK_ICON | SEE_MASK_HOTKEY |
SEE_MASK_CONNECTNETDRV | SEE_MASK_FLAG_DDEWAIT |
SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI | SEE_MASK_UNICODE |
SEE_MASK_NO_CONSOLE | SEE_MASK_ASYNCOK | SEE_MASK_HMONITOR ))
{
FIXME("flags ignored: 0x%08lx\n", sei->fMask);
}
/* launch a document by fileclass like 'Wordpad.Document.1' */
if (sei->fMask & SEE_MASK_CLASSNAME)
{
/* FIXME: szCommandline should not be of a fixed size. Plus MAX_PATH is way too short! */
/* the commandline contains 'c:\Path\wordpad.exe "%1"' */
HCR_GetExecuteCommand(sei->lpClass, (sei->lpVerb) ? sei->lpVerb : "open", szCommandline, sizeof(szCommandline));
/* FIXME: get the extension of lpFile, check if it fits to the lpClass */
TRACE("SEE_MASK_CLASSNAME->'%s'\n", szCommandline);
}
/* process the IDList */
if ( (sei->fMask & SEE_MASK_INVOKEIDLIST) == SEE_MASK_INVOKEIDLIST) /*0x0c*/
{
SHGetPathFromIDListA (sei->lpIDList,szApplicationName);
TRACE("-- idlist=%p (%s)\n", sei->lpIDList, szApplicationName);
}
else
{
if (sei->fMask & SEE_MASK_IDLIST )
{
pos = strstr(szCommandline, "%I");
if (pos)
{
LPVOID pv;
HGLOBAL hmem = SHAllocShared ( sei->lpIDList, ILGetSize(sei->lpIDList), 0);
pv = SHLockShared(hmem,0);
sprintf(szPidl,":%p",pv );
SHUnlockShared(pv);
gap = strlen(szPidl);
len = strlen(pos)-2;
memmove(pos+gap,pos+2,len);
memcpy(pos,szPidl,gap);
}
}
}
TRACE("execute:'%s','%s'\n",szApplicationName, szCommandline);
if (szCommandline[0]) {
strcat(szApplicationName, " ");
strcat(szApplicationName, szCommandline);
}
ZeroMemory(&startup,sizeof(STARTUPINFOA));
startup.cb = sizeof(STARTUPINFOA);
if (! CreateProcessA(NULL, szApplicationName,
NULL, NULL, FALSE, 0,
NULL, sei->lpDirectory,
&startup, &info))
{
BOOL failed = TRUE;
if ((!sei->lpVerb)||(!strcasecmp(sei->lpVerb,"open")))
{
LPSTR ext = PathFindExtensionA(szApplicationName);
CHAR key[1023];
CHAR buffer[1023];
CHAR cmdline[1023];
DWORD size;
sprintf(key,"Software\\Classes\\%s",ext);
size = 1023;
if (!RegQueryValueA(HKEY_LOCAL_MACHINE,key,buffer,&size))
{
sprintf(key,"Software\\Classes\\%s\\shell\\%s\\command", buffer,
(sei->lpVerb)?sei->lpVerb:"open");
size = 1023;
if (!RegQueryValueA(HKEY_LOCAL_MACHINE,key,buffer,&size))
{
sprintf(cmdline,"%s \"%s\"",buffer,szApplicationName);
if (CreateProcessA(NULL,cmdline, NULL, NULL, FALSE, 0,
NULL, sei->lpDirectory, &startup, &info))
failed = FALSE;
}
}
}
if (failed)
{
sei->hInstApp = GetLastError();
return FALSE;
}
}
sei->hInstApp = 33;
if(sei->fMask & SEE_MASK_NOCLOSEPROCESS)
sei->hProcess = info.hProcess;
else
CloseHandle( info.hProcess );
CloseHandle( info.hThread );
return TRUE;
}
/*************************************************************************
* ShellExecuteExW [SHELL32.293]
*
*/
BOOL WINAPI ShellExecuteExW (LPSHELLEXECUTEINFOW sei)
{ SHELLEXECUTEINFOA seiA;
DWORD ret;
TRACE("%p\n", sei);
memcpy(&seiA, sei, sizeof(SHELLEXECUTEINFOA));
if (sei->lpVerb)
seiA.lpVerb = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpVerb);
if (sei->lpFile)
seiA.lpFile = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpFile);
if (sei->lpParameters)
seiA.lpParameters = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpParameters);
if (sei->lpDirectory)
seiA.lpDirectory = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpDirectory);
if ((sei->fMask & SEE_MASK_CLASSNAME) && sei->lpClass)
seiA.lpClass = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpClass);
else
seiA.lpClass = NULL;
ret = ShellExecuteExA(&seiA);
if (seiA.lpVerb) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpVerb );
if (seiA.lpFile) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpFile );
if (seiA.lpParameters) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpParameters );
if (seiA.lpDirectory) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpDirectory );
if (seiA.lpClass) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpClass );
return ret;
}
static LPUNKNOWN SHELL32_IExplorerInterface=0;
/*************************************************************************
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment