Set dll directory in kleopatra
authorAndre Heinecke <aheinecke@intevation.de>
Mon, 21 Jul 2014 14:36:10 +0000 (16:36 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Mon, 21 Jul 2014 14:36:10 +0000 (16:36 +0200)
    With Windows XP SP2 the current working directory was only
    used as a last resort for loading DLL's. This caused problems
    when incompatible libraries were installed into the system
    directory or to be found in PATH. Kleowrap now prefers
    the working directory.

    * src/kleowrap.c (kleowrap_set_dll_directory): New.
    * src/kleowrap.c (main): Use kleowrap_set_dll_directory.
    --

    To be compatible with Windows XP < SP2 this is done conditionally
    by GetProcAddress.

src/kleowrap.c

index e2f15c1..72a571f 100644 (file)
@@ -314,6 +314,40 @@ 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;
+    }
+  OutputDebugString ("Andre entferne mich: SetDllDirectory success.");
+}
 
 int
 main (int argc, const char * const *argv)
@@ -323,6 +357,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 +371,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);