From 17aa8cc255d313ac33eca4f2727ed2a6b8bdd8ef Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 21 Oct 2012 21:38:45 +0200 Subject: updated for version 7.3.707 Problem: Problems loading a library for a file name with non-latin characters. Solution: Use wide system functions when possible. (Ken Takata) --- src/os_win32.c | 43 ++++++++++++++++++++++++++++--------------- src/os_win32.h | 2 +- src/version.c | 2 ++ 3 files changed, 31 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/os_win32.c b/src/os_win32.c index 006a36144..96e115ca2 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -287,27 +287,40 @@ unescape_shellxquote(char_u *p, char_u *escaped) HINSTANCE vimLoadLib(char *name) { - HINSTANCE dll = NULL; - TCHAR old_dir[MAXPATHL]; + HINSTANCE dll = NULL; + char old_dir[MAXPATHL]; /* NOTE: Do not use mch_dirname() and mch_chdir() here, they may call * vimLoadLib() recursively, which causes a stack overflow. */ if (exe_path == NULL) get_exe_name(); - if (exe_path != NULL && GetCurrentDirectory(MAXPATHL, old_dir) != 0) + if (exe_path != NULL) { - /* 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. */ - SetCurrentDirectory(exe_path); - dll = LoadLibrary(name); - SetCurrentDirectory(old_dir); - } - else - { - /* We are not able to change directory to where the executable is, try - * to load library anyway. */ - dll = LoadLibrary(name); +#ifdef FEAT_MBYTE + WCHAR old_dirw[MAXPATHL]; + + if (GetCurrentDirectoryW(MAXPATHL, old_dirw) != 0) + { + /* 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. */ + SetCurrentDirectory(exe_path); + dll = LoadLibrary(name); + SetCurrentDirectoryW(old_dirw); + return dll; + } + /* Retry with non-wide function (for Windows 98). */ + if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) +#endif + if (GetCurrentDirectory(MAXPATHL, old_dir) != 0) + { + /* 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. */ + SetCurrentDirectory(exe_path); + dll = LoadLibrary(name); + SetCurrentDirectory(old_dir); + } } return dll; } diff --git a/src/os_win32.h b/src/os_win32.h index 5303d6ddc..c155fb23f 100644 --- a/src/os_win32.h +++ b/src/os_win32.h @@ -108,7 +108,7 @@ */ #define CMDBUFFSIZE 1024 /* size of the command processing buffer */ -/* _MAX_PATH is only 256 (stdlib.h), but we want more for the 'path' option, +/* _MAX_PATH is only 260 (stdlib.h), but we want more for the 'path' option, * thus use a larger number. */ #define MAXPATHL 1024 diff --git a/src/version.c b/src/version.c index 321dfdfd5..4631c7204 100644 --- a/src/version.c +++ b/src/version.c @@ -725,6 +725,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 707, /**/ 706, /**/ -- cgit v1.2.1