# HG changeset patch # User Bram Moolenaar # Date 1287835374 -7200 # Node ID fa5dee44df3fd23f96090d225dc11dbc4de7bf20 # Parent 5b154df6fcd89b4d24d34da63626cc01d9b5c0c2 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 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -1260,7 +1260,7 @@ gui_mch_prepare(int *argc, char **argv) /* 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 @@ gui_mch_set_foreground(void) 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 --- a/src/if_lua.c +++ b/src/if_lua.c @@ -49,7 +49,7 @@ static const char LUAVIM_FREE[] = "luaV_ # 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 --- a/src/if_mzsch.c +++ b/src/if_mzsch.c @@ -556,8 +556,8 @@ mzscheme_runtime_link_init(char *sch_dll 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 --- a/src/if_perl.xs +++ b/src/if_perl.xs @@ -106,7 +106,7 @@ typedef int perl_key; #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 --- a/src/if_python.c +++ b/src/if_python.c @@ -110,7 +110,7 @@ struct PyMethodDef { Py_ssize_t a; }; # 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 --- a/src/if_python3.c +++ b/src/if_python3.c @@ -88,7 +88,7 @@ static void init_structs(void); # 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 --- 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 --- a/src/mbyte.c +++ b/src/mbyte.c @@ -4159,11 +4159,11 @@ iconv_enabled(verbose) { 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 --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -817,7 +817,11 @@ mch_libcall( 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 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -206,44 +206,65 @@ static char *vimrun_path = "vimrun "; 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_textdomain(con 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 @@ dyn_libintl_init(char *libname) 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 @@ PlatformId(void) * 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 --- 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 --- a/src/version.c +++ b/src/version.c @@ -715,6 +715,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 34, +/**/ 33, /**/ 32,