wine/dlls/shell32 shelllink.c

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 3 03:55:22 CST 2005


ChangeSet ID:	21073
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/11/03 03:55:22

Modified files:
	dlls/shell32   : shelllink.c 

Log message:
	Mike McCormack <mike at codeweavers.com>
	Pass the correct verb.
	Add a space between extra parameters.
	Wait for ShellExecute to complete.

Patch: http://cvs.winehq.org/patch.py?id=21073

Old revision  New revision  Changes     Path
 1.109         1.110         +15 -1      wine/dlls/shell32/shelllink.c

Index: wine/dlls/shell32/shelllink.c
diff -u -p wine/dlls/shell32/shelllink.c:1.109 wine/dlls/shell32/shelllink.c:1.110
--- wine/dlls/shell32/shelllink.c:1.109	3 Nov 2005  9:55:22 -0000
+++ wine/dlls/shell32/shelllink.c	3 Nov 2005  9:55:22 -0000
@@ -2466,6 +2466,7 @@ static HRESULT WINAPI
 ShellLink_InvokeCommand( IContextMenu* iface, LPCMINVOKECOMMANDINFO lpici )
 {
     IShellLinkImpl *This = impl_from_IContextMenu(iface);
+    static const WCHAR szOpen[] = { 'O','p','e','n',0 };
     SHELLEXECUTEINFOW sei;
     HWND hwnd = NULL; /* FIXME: get using interface set from IObjectWithSite */
     LPWSTR args = NULL;
@@ -2500,7 +2501,7 @@ ShellLink_InvokeCommand( IContextMenu* i
          ( lpici->fMask & CMIC_MASK_UNICODE ) )
     {
         LPCMINVOKECOMMANDINFOEX iciex = (LPCMINVOKECOMMANDINFOEX) lpici;
-        DWORD len = 0;
+        DWORD len = 2;
 
         if ( This->sArgs )
             len += lstrlenW( This->sArgs );
@@ -2512,19 +2513,32 @@ ShellLink_InvokeCommand( IContextMenu* i
         if ( This->sArgs )
             lstrcatW( args, This->sArgs );
         if ( iciex->lpParametersW )
+        {
+            static const WCHAR space[] = { ' ', 0 };
+            lstrcatW( args, space );
             lstrcatW( args, iciex->lpParametersW );
+        }
     }
 
     memset( &sei, 0, sizeof sei );
     sei.cbSize = sizeof sei;
+    sei.fMask = SEE_MASK_UNICODE | SEE_MASK_NOCLOSEPROCESS;
     sei.lpFile = path;
     sei.nShow = This->iShowCmd;
     sei.lpIDList = This->pPidl;
     sei.lpDirectory = This->sWorkDir;
     sei.lpParameters = args;
+    sei.lpVerb = szOpen;
 
     if( ShellExecuteExW( &sei ) )
+    {
+        if ( sei.hProcess )
+        {
+            WaitForSingleObject( sei.hProcess, 10000 );
+            CloseHandle( sei.hProcess );
+        }
         r = S_OK;
+    }
     else
         r = E_FAIL;
 



More information about the wine-cvs mailing list