updated for version 7.3.034
Problem: Win32: may be loading .dll from the wrong directory.
Solution: Go to the Vim executable directory when opening a library.
diff --git a/src/gui_w32.c b/src/gui_w32.c
index 3a54e81..d1335a2 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -1260,7 +1260,7 @@
/* try and load the user32.dll library and get the entry points for
* multi-monitor-support. */
- if ((user32_lib = LoadLibrary("User32.dll")) != NULL)
+ if ((user32_lib = vimLoadLib("User32.dll")) != NULL)
{
pMonitorFromWindow = (TMonitorFromWindow)GetProcAddress(user32_lib,
"MonitorFromWindow");
@@ -4188,7 +4188,7 @@
static void
dyn_imm_load(void)
{
- hLibImm = LoadLibrary("imm32.dll");
+ hLibImm = vimLoadLib("imm32.dll");
if (hLibImm == NULL)
return;
diff --git a/src/if_lua.c b/src/if_lua.c
index 35ee300..3062de8 100644
--- a/src/if_lua.c
+++ b/src/if_lua.c
@@ -49,7 +49,7 @@
# define symbol_from_dll dlsym
# define close_dll dlclose
#else
-# define load_dll LoadLibrary
+# define load_dll vimLoadLib
# define symbol_from_dll GetProcAddress
# define close_dll FreeLibrary
#endif
diff --git a/src/if_mzsch.c b/src/if_mzsch.c
index f31ea06..d940fd9 100644
--- a/src/if_mzsch.c
+++ b/src/if_mzsch.c
@@ -556,8 +556,8 @@
if (hMzGC && hMzSch)
return OK;
- hMzSch = LoadLibrary(sch_dll);
- hMzGC = LoadLibrary(gc_dll);
+ hMzSch = vimLoadLib(sch_dll);
+ hMzGC = vimLoadLib(gc_dll);
if (!hMzSch)
{
diff --git a/src/if_perl.xs b/src/if_perl.xs
index a3dc4fe..545dc7b 100644
--- a/src/if_perl.xs
+++ b/src/if_perl.xs
@@ -106,7 +106,7 @@
#define close_dll dlclose
#else
#define PERL_PROC FARPROC
-#define load_dll LoadLibrary
+#define load_dll vimLoadLib
#define symbol_from_dll GetProcAddress
#define close_dll FreeLibrary
#endif
diff --git a/src/if_python.c b/src/if_python.c
index 7b1d6e7..f9bcf58 100644
--- a/src/if_python.c
+++ b/src/if_python.c
@@ -110,7 +110,7 @@
# define close_dll dlclose
# define symbol_from_dll dlsym
# else
-# define load_dll LoadLibrary
+# define load_dll vimLoadLib
# define close_dll FreeLibrary
# define symbol_from_dll GetProcAddress
# endif
diff --git a/src/if_python3.c b/src/if_python3.c
index 4aa7edf..e56cdbd 100644
--- a/src/if_python3.c
+++ b/src/if_python3.c
@@ -88,7 +88,7 @@
# define close_dll dlclose
# define symbol_from_dll dlsym
# else
-# define load_dll LoadLibrary
+# define load_dll vimLoadLib
# define close_dll FreeLibrary
# define symbol_from_dll GetProcAddress
# endif
diff --git a/src/if_ruby.c b/src/if_ruby.c
index 9ea9a1a..d7df248 100644
--- a/src/if_ruby.c
+++ b/src/if_ruby.c
@@ -55,7 +55,7 @@
# define symbol_from_dll dlsym
# define close_dll dlclose
#else
-# define load_dll LoadLibrary
+# define load_dll vimLoadLib
# define symbol_from_dll GetProcAddress
# define close_dll FreeLibrary
#endif
diff --git a/src/mbyte.c b/src/mbyte.c
index c7da85a..9c0b187 100644
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -4159,11 +4159,11 @@
{
if (hIconvDLL != 0 && hMsvcrtDLL != 0)
return TRUE;
- hIconvDLL = LoadLibrary(DYNAMIC_ICONV_DLL);
+ hIconvDLL = vimLoadLib(DYNAMIC_ICONV_DLL);
if (hIconvDLL == 0) /* sometimes it's called libiconv.dll */
- hIconvDLL = LoadLibrary(DYNAMIC_ICONV_DLL_ALT);
+ hIconvDLL = vimLoadLib(DYNAMIC_ICONV_DLL_ALT);
if (hIconvDLL != 0)
- hMsvcrtDLL = LoadLibrary(DYNAMIC_MSVCRT_DLL);
+ hMsvcrtDLL = vimLoadLib(DYNAMIC_MSVCRT_DLL);
if (hIconvDLL == 0 || hMsvcrtDLL == 0)
{
/* Only give the message when 'verbose' is set, otherwise it might be
diff --git a/src/os_mswin.c b/src/os_mswin.c
index 6ee6379..e725e69 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -817,7 +817,11 @@
BOOL fRunTimeLinkSuccess = FALSE;
// Get a handle to the DLL module.
+# ifdef WIN16
hinstLib = LoadLibrary(libname);
+# else
+ hinstLib = vimLoadLib(libname);
+# endif
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
diff --git a/src/os_win32.c b/src/os_win32.c
index 6bfcc2a..100c395 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -206,44 +206,65 @@
static int suppress_winsize = 1; /* don't fiddle with console */
#endif
+static char_u *exe_path = NULL;
+
static void
get_exe_name(void)
{
- char temp[256];
- static int did_set_PATH = FALSE;
+ char temp[MAXPATHL];
+ char_u *p;
if (exe_name == NULL)
{
/* store the name of the executable, may be used for $VIM */
- GetModuleFileName(NULL, temp, 255);
+ GetModuleFileName(NULL, temp, MAXPATHL - 1);
if (*temp != NUL)
exe_name = FullName_save((char_u *)temp, FALSE);
}
- if (!did_set_PATH && exe_name != NULL)
+ if (exe_path == NULL && exe_name != NULL)
{
- char_u *p;
- char_u *newpath;
-
- /* Append our starting directory to $PATH, so that when doing "!xxd"
- * it's found in our starting directory. Needed because SearchPath()
- * also looks there. */
- p = mch_getenv("PATH");
- newpath = alloc((unsigned)(STRLEN(p) + STRLEN(exe_name) + 2));
- if (newpath != NULL)
+ exe_path = vim_strnsave(exe_name, gettail_sep(exe_name) - exe_name);
+ if (exe_path != NULL)
{
- STRCPY(newpath, p);
- STRCAT(newpath, ";");
- vim_strncpy(newpath + STRLEN(newpath), exe_name,
- gettail_sep(exe_name) - exe_name);
- vim_setenv((char_u *)"PATH", newpath);
- vim_free(newpath);
+ /* Append our starting directory to $PATH, so that when doing
+ * "!xxd" it's found in our starting directory. Needed because
+ * SearchPath() also looks there. */
+ p = mch_getenv("PATH");
+ if (STRLEN(p) + STRLEN(exe_path) + 2 < MAXPATHL);
+ {
+ STRCPY(temp, p);
+ STRCAT(temp, ";");
+ STRCAT(temp, exe_path);
+ vim_setenv((char_u *)"PATH", temp);
+ }
}
-
- did_set_PATH = TRUE;
}
}
+/*
+ * Load library "name".
+ */
+ HINSTANCE
+vimLoadLib(char *name)
+{
+ HINSTANCE dll = NULL;
+ char old_dir[MAXPATHL];
+
+ if (exe_path == NULL)
+ get_exe_name();
+ if (exe_path != NULL && mch_dirname(old_dir, MAXPATHL) == OK)
+ {
+ /* Change directory to where the executable is, both to make sure we
+ * find a .dll there and to avoid looking for a .dll in the current
+ * directory. */
+ mch_chdir(exe_path);
+ dll = LoadLibrary(name);
+ mch_chdir(old_dir);
+ }
+ return dll;
+}
+
#if defined(DYNAMIC_GETTEXT) || defined(PROTO)
# ifndef GETTEXT_DLL
# define GETTEXT_DLL "libintl.dll"
@@ -254,7 +275,7 @@
static char *null_libintl_bindtextdomain(const char *, const char *);
static char *null_libintl_bind_textdomain_codeset(const char *, const char *);
-static HINSTANCE hLibintlDLL = 0;
+static HINSTANCE hLibintlDLL = NULL;
char *(*dyn_libintl_gettext)(const char *) = null_libintl_gettext;
char *(*dyn_libintl_textdomain)(const char *) = null_libintl_textdomain;
char *(*dyn_libintl_bindtextdomain)(const char *, const char *)
@@ -282,26 +303,16 @@
if (hLibintlDLL)
return 1;
/* Load gettext library (libintl.dll) */
- hLibintlDLL = LoadLibrary(libname != NULL ? libname : GETTEXT_DLL);
+ hLibintlDLL = vimLoadLib(libname != NULL ? libname : GETTEXT_DLL);
if (!hLibintlDLL)
{
- char_u dirname[_MAX_PATH];
-
- /* Try using the path from gvim.exe to find the .dll there. */
- get_exe_name();
- STRCPY(dirname, exe_name);
- STRCPY(gettail(dirname), GETTEXT_DLL);
- hLibintlDLL = LoadLibrary((char *)dirname);
- if (!hLibintlDLL)
+ if (p_verbose > 0)
{
- if (p_verbose > 0)
- {
- verbose_enter();
- EMSG2(_(e_loadlib), GETTEXT_DLL);
- verbose_leave();
- }
- return 0;
+ verbose_enter();
+ EMSG2(_(e_loadlib), GETTEXT_DLL);
+ verbose_leave();
}
+ return 0;
}
for (i = 0; libintl_entry[i].name != NULL
&& libintl_entry[i].ptr != NULL; ++i)
@@ -430,7 +441,7 @@
* Seems like a lot of overhead to load/unload ADVAPI32.DLL each
* time we verify security...
*/
- advapi_lib = LoadLibrary("ADVAPI32.DLL");
+ advapi_lib = vimLoadLib("ADVAPI32.DLL");
if (advapi_lib != NULL)
{
pSetNamedSecurityInfo = (PSNSECINFO)GetProcAddress(advapi_lib,
diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro
index 5ca85c7..31aa269 100644
--- a/src/proto/os_win32.pro
+++ b/src/proto/os_win32.pro
@@ -1,4 +1,5 @@
/* os_win32.c */
+HINSTANCE vimLoadLib __ARGS((char *name));
int dyn_libintl_init __ARGS((char *libname));
void dyn_libintl_end __ARGS((void));
void PlatformId __ARGS((void));
diff --git a/src/version.c b/src/version.c
index 3b22477..934903d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -715,6 +715,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 34,
+/**/
33,
/**/
32,