X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fos_win32.cpp;h=82e57d2eb69adfe1a72074505bae21856b58016b;hb=b96ce9a9c101a711ef8a1cdd5d6fe812a18966da;hp=e947b7f42b0892b4437c503c8d912181b72b76b8;hpb=522f3517e1d7f61ed2bbcafe0632f50cb3e8ae2f;p=lyx.git diff --git a/src/support/os_win32.cpp b/src/support/os_win32.cpp index e947b7f42b..82e57d2eb6 100644 --- a/src/support/os_win32.cpp +++ b/src/support/os_win32.cpp @@ -38,6 +38,7 @@ #include #include // _getdrive +#include // GetFinalPathNameByHandle #include // SHGetFolderPath #include #include @@ -97,9 +98,9 @@ BOOL terminate_handler(DWORD event) return FALSE; } -} // namespace anon +} // namespace -void init(int argc, char * argv[]) +void init(int argc, char ** argv[]) { /* Note from Angus, 17 Jan 2005: * @@ -158,6 +159,27 @@ void init(int argc, char * argv[]) */ + // Remove PYTHONPATH from the environment as it may point to an + // external python installation and cause reconfigure failures. + unsetEnv("PYTHONPATH"); + + +#if defined(_MSC_VER) && (_MSC_VER >= 1900) + // Removing an argument from argv leads to an assertion on Windows + // when compiling with MSVC 2015 in debug mode (see bug #10440). + // To avoid this we make a copy of the array of pointers. + char ** newargv = (char **) malloc((argc + 1) * sizeof(char *)); + if (newargv) { + memcpy(newargv, *argv, (argc + 1) * sizeof(char *)); + *argv = newargv; + } else { + lyxerr << "LyX warning: Cannot make a copy of " + "command line arguments!" + << endl; + } +#endif + + // Get the wide program arguments array #if defined(_MSC_VER) && (_MSC_VER >= 1900) argv_ = CommandLineToArgvW(GetCommandLineW(), &argc_); @@ -426,23 +448,6 @@ string latex_path_list(string const & p) } -bool is_valid_strftime(string const & p) -{ - string::size_type pos = p.find_first_of('%'); - while (pos != string::npos) { - if (pos + 1 == string::npos) - break; - if (!containsOnly(p.substr(pos + 1, 1), - "aAbBcdfHIjmMpSUwWxXyYzZ%")) - return false; - if (pos + 2 == string::npos) - break; - pos = p.find_first_of('%', pos + 2); - } - return true; -} - - // returns a string suitable to be passed to popen when // reading a pipe char const * popen_read_mode() @@ -567,18 +572,13 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode, setEnv("TEXFONTS", newtexfonts); } - string fname8; - try { - fname8 = to_local8bit(from_utf8(filename)); - } catch (...) { - LYXERR0("Cannot encode file name `" << filename << "' to local 8 bit encoding"); - return false; - } + QString const wname = toqstr(filename); // reference: http://msdn.microsoft.com/en-us/library/bb762153.aspx - char const * action = (mode == VIEW) ? "open" : "edit"; - bool success = reinterpret_cast(ShellExecute(NULL, action, - fname8.c_str(), NULL, NULL, 1)) > 32; + wchar_t const * action = (mode == VIEW) ? L"open" : L"edit"; + bool success = reinterpret_cast(ShellExecuteW(NULL, action, + reinterpret_cast(wname.utf16()), + NULL, NULL, 1)) > 32; if (!path.empty() && !lyxrc.texinputs_prefix.empty()) { setEnv("TEXINPUTS", oldtexinputs); @@ -595,45 +595,18 @@ string real_path(string const & path) // See http://msdn.microsoft.com/en-us/library/aa366789(VS.85).aspx QString const qpath = get_long_path(toqstr(path)); HANDLE hpath = CreateFileW((wchar_t *) qpath.utf16(), GENERIC_READ, - FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + FILE_SHARE_READ, NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL); if (hpath == INVALID_HANDLE_VALUE) { // The file cannot be accessed. return path; } - // Get the file size. - DWORD size_hi = 0; - DWORD size_lo = GetFileSize(hpath, &size_hi); - - if (size_lo == 0 && size_hi == 0) { - // A zero-length file cannot be mapped. - CloseHandle(hpath); - return path; - } - - // Create a file mapping object. - HANDLE hmap = CreateFileMapping(hpath, NULL, PAGE_READONLY, 0, 1, NULL); - - if (!hmap) { - CloseHandle(hpath); - return path; - } - - // Create a file mapping to get the file name. - void * pmem = MapViewOfFile(hmap, FILE_MAP_READ, 0, 0, 1); - - if (!pmem) { - CloseHandle(hmap); - CloseHandle(hpath); - return path; - } - TCHAR realpath[MAX_PATH + 1]; - if (!GetMappedFileName(GetCurrentProcess(), pmem, realpath, MAX_PATH)) { - UnmapViewOfFile(pmem); - CloseHandle(hmap); + DWORD size = GetFinalPathNameByHandle(hpath, realpath, MAX_PATH, VOLUME_NAME_NT); + if (size > MAX_PATH) { CloseHandle(hpath); return path; } @@ -679,8 +652,6 @@ string real_path(string const & path) while (*p++) ; } while (!found && *p); } - UnmapViewOfFile(pmem); - CloseHandle(hmap); CloseHandle(hpath); string const retpath = subst(string(realpath), '\\', '/'); return FileName::fromFilesystemEncoding(retpath).absFileName();