Shell execute with URLs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I finally managed to test the shell execute functions with URLs.

Changelog:
	Wait for app to come up before attempting DDE connection.
	PathIsURL should fail on text without a proper "scheme".

Index: dlls/shell32/shlexec.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shlexec.c,v
retrieving revision 1.7
diff -u -r1.7 shlexec.c
--- dlls/shell32/shlexec.c	6 Sep 2002 19:41:18 -0000	1.7
+++ dlls/shell32/shlexec.c	15 Sep 2002 02:24:10 -0000
@@ -47,7 +47,28 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(exec);
 
-/* this function is supposed to expand the escape sequences found in the registry
+/***********************************************************************
+ *           wait_input_idle [Internal]
+ *
+ * Wrapper to call WaitForInputIdle USER function.
+ * Stolen from loader/module.c.
+ */
+typedef DWORD (WINAPI *WaitForInputIdle_ptr)( HANDLE hProcess, DWORD dwTimeOut );
+
+static DWORD wait_input_idle( HANDLE process, DWORD timeout )
+{
+    HMODULE mod = GetModuleHandleA( "user32.dll" );
+    if (mod)
+    {
+        WaitForInputIdle_ptr ptr = (WaitForInputIdle_ptr)GetProcAddress( mod, "WaitForInputIdle" );
+        if (ptr) return ptr( process, timeout );
+    }
+    return 0;
+}
+
+
+/***********************************************************************
+ * this function is supposed to expand the escape sequences found in the registry
  * some diving reported that the following were used:
  * + %1, %2...  seem to report to parameter of index N in ShellExecute pmts
  *	%1 file
@@ -106,7 +127,7 @@
  *	SHELL_ExecuteA [Internal]
  *
  */
-static HINSTANCE SHELL_ExecuteA(char *lpCmd, LPSHELLEXECUTEINFOA sei, BOOL is32)
+static HINSTANCE SHELL_ExecuteA(char *lpCmd, LPSHELLEXECUTEINFOA sei, BOOL is32, BOOL shWait)
 {
     STARTUPINFOA  startup;
     PROCESS_INFORMATION info;
@@ -122,6 +143,11 @@
         if (CreateProcessA(NULL, lpCmd, NULL, NULL, FALSE, 0,
                         NULL, sei->lpDirectory, &startup, &info))
         {
+            /* Give 30 seconds to the app to come up, if desired. Probably only needed
+               when starting app immediately before making a DDE connection. */
+            if (shWait)
+                if (wait_input_idle( info.hProcess, 30000 ) == 0xFFFFFFFF)
+                    WARN("WaitForInputIdle failed: Error %ld\n", GetLastError() );
             retval = (HINSTANCE)33;
             if(sei->fMask & SEE_MASK_NOCLOSEPROCESS)
 	        sei->hProcess = info.hProcess;
@@ -381,7 +407,7 @@
     if (!hConv)
     {
         TRACE("Launching '%s'\n", start);
-        ret = SHELL_ExecuteA(start, sei, is32);
+        ret = SHELL_ExecuteA(start, sei, is32, TRUE);
         if (ret < 32)
         {
             TRACE("Couldn't launch\n");
@@ -390,6 +416,7 @@
         hConv = DdeConnect(ddeInst, hszApp, hszTopic, NULL);
         if (!hConv)
         {
+            TRACE("Couldn't connect. ret=%d\n", ret);
             ret = 30; /* whatever */
             goto error;
         }
@@ -405,7 +432,7 @@
     TRACE("%s %s => %s\n", exec, lpFile, res);
 
     ret = (DdeClientTransaction(res, strlen(res) + 1, hConv, 0L, 0,
-                                XTYP_EXECUTE, 10000, &tid) != DMLERR_NO_ERROR) ? 31 : 32;
+                                XTYP_EXECUTE, 10000, &tid) != DMLERR_NO_ERROR) ? 31 : 33;
     DdeDisconnect(hConv);
  error:
     DdeUninitialize(ddeInst);
@@ -444,7 +471,7 @@
             /* Is there a replace() function anywhere? */
             cmd[cmdlen] = '\0';
             argify(param, sizeof(param), cmd, lpFile);
-            retval = SHELL_ExecuteA(param, sei, is32);
+            retval = SHELL_ExecuteA(param, sei, is32, FALSE);
         }
     }
     else TRACE("ooch\n");
@@ -576,7 +603,7 @@
             strcat(cmd, " ");
             strcat(cmd, szApplicationName);
         }
-        retval = SHELL_ExecuteA(cmd, sei, is32);
+        retval = SHELL_ExecuteA(cmd, sei, is32, FALSE);
         if (retval > 32)
             return TRUE;
         else
@@ -600,7 +627,7 @@
         strcat(szApplicationName, szCommandline);
     }
 
-    retval = SHELL_ExecuteA(szApplicationName, sei, is32);
+    retval = SHELL_ExecuteA(szApplicationName, sei, is32, FALSE);
     if (retval > 32)
         return TRUE;
 
@@ -617,7 +644,7 @@
         if (*lpstrProtocol)
             retval = execute_from_key(lpstrProtocol, szApplicationName, sei, is32);
         else
-            retval = SHELL_ExecuteA(cmd, sei, is32);
+            retval = SHELL_ExecuteA(cmd, sei, is32, FALSE);
     }
     else if (PathIsURLA((LPSTR)lpFile))    /* File not found, check for URL */
     {
@@ -625,7 +652,6 @@
         INT iSize;
 
         lpstrRes = strchr(lpFile, ':');
-        /* PathIsURLA probably should fail on strings without a ':', but it doesn't */
         if (lpstrRes)
             iSize = lpstrRes - lpFile;
         else
Index: dlls/shlwapi/path.c
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/path.c,v
retrieving revision 1.22
diff -u -r1.22 path.c
--- dlls/shlwapi/path.c	28 Aug 2002 23:42:34 -0000	1.22
+++ dlls/shlwapi/path.c	15 Sep 2002 02:24:11 -0000
@@ -1858,7 +1858,7 @@
     /* get protocol        */
     base.size = sizeof(base);
     res1 = SHLWAPI_1(lpstrPath, &base);
-    return (base.fcncde) ? TRUE : FALSE;
+    return (base.fcncde > 0) ? TRUE : FALSE;
 }
 
 /*************************************************************************
@@ -1874,7 +1874,7 @@
     /* get protocol        */
     base.size = sizeof(base);
     res1 = SHLWAPI_2(lpstrPath, &base);
-    return (base.fcncde) ? TRUE : FALSE;
+    return (base.fcncde > 0) ? TRUE : FALSE;
 }
 
 /*************************************************************************
Index: dlls/shlwapi/ordinal.c
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/ordinal.c,v
retrieving revision 1.53
diff -u -r1.53 ordinal.c
--- dlls/shlwapi/ordinal.c	10 Sep 2002 00:32:27 -0000	1.53
+++ dlls/shlwapi/ordinal.c	15 Sep 2002 02:24:13 -0000
@@ -170,6 +170,7 @@
     DWORD cnt;
     const SHL_2_inet_scheme *inet_pro;
 
+    y->fcncde = URL_SCHEME_INVALID;
     if (y->size != 0x18) return E_INVALIDARG;
     /* FIXME: leading white space generates error of 0x80041001 which
      *        is undefined
@@ -226,6 +227,7 @@
     LPSTR cmpstr;
     INT len;
 
+    y->fcncde = URL_SCHEME_INVALID;
     if (y->size != 0x18) return E_INVALIDARG;
     /* FIXME: leading white space generates error of 0x80041001 which
      *        is undefined

[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux