Mark called uninstallers rebootok
[gpg4win.git] / src / kleowrap.c
index 78289e6..a29d845 100644 (file)
@@ -314,6 +314,39 @@ build_commandline (const char * const *argv)
   return argv_quoted;
 }
 
+static void
+kleowrap_set_dll_directory (const char *path)
+{
+  /* Set DLL directory is only necessary on Windows XP after SP2
+     but it is also only available on those systems */
+  typedef BOOL (CALLBACK* LPFNSETDLLDIRECTORY)(LPCTSTR);
+  LPFNSETDLLDIRECTORY my_set_dll_directory;
+
+  HMODULE hmod;
+
+  if (!(hmod = GetModuleHandle ("kernel32.dll")))
+    {
+      fprintf (stderr, "kleowrap: failed to get kernel32.dll handle: rc=%d\n",
+               GetLastError());
+      return;
+    }
+
+  my_set_dll_directory =
+    (LPFNSETDLLDIRECTORY) GetProcAddress (hmod, "SetDllDirectoryA");
+
+  if (!my_set_dll_directory)
+    {
+      /* Not supported and so not necessary */
+      return;
+    }
+
+  if (!my_set_dll_directory (path))
+    {
+      fprintf (stderr, "kleowrap: failed to set module handle",
+               GetLastError());
+      return;
+    }
+}
 
 int
 main (int argc, const char * const *argv)
@@ -323,6 +356,7 @@ main (int argc, const char * const *argv)
   char *p, *p0;
   char **argv_quoted;
 
+
   if (!GetModuleFileNameA (NULL, pgm, sizeof (pgm) - 1))
     {
       fprintf (stderr, "kleowrap: error getting my own name: rc=%d\n",
@@ -336,6 +370,7 @@ main (int argc, const char * const *argv)
     goto leave;
   *p = '\0';
   chdir (pgm);
+  kleowrap_set_dll_directory (pgm);
   *(p++) = '\\';
   memmove (p + 4, p, strlen (p) + 1);
   strncpy (p, "bin\\", 4);
@@ -366,7 +401,7 @@ main (int argc, const char * const *argv)
   /* Using execv does not replace the existing program image, but
      spawns a new one and daemonizes it, confusing the command line
      interpreter.  So we have to use spawnv.  */
-  rc = _spawnv (_P_WAIT, pgm, (const char **) argv_quoted);
+  rc = _spawnv (_P_NOWAIT, pgm, (const char **) argv_quoted);
   if (rc < 0)
     {
       fprintf (stderr, "kleowrap: executing `%s' failed: %s\n",