# HG changeset patch # User Gregory Szorc # Date 2016-04-27 16:23:39 # Node ID 210bb28ca4fb577907bfccfd4ae4615da0280973 # Parent 602cc9bf036ef8ea32c9061234b2e73a056e80e2 exewrapper: add .dll to LoadLibrary() argument LoadLibrary() changes behavior depending on whether the argument passed to it contains a period. From the MSDN docs: If no file name extension is specified in the lpFileName parameter, the default library extension .dll is appended. However, the file name string can include a trailing point character (.) to indicate that the module name has no extension. When no path is specified, the function searches for loaded modules whose base name matches the base name of the module to be loaded. If the name matches, the load succeeds. Otherwise, the function searches for the file. As the subsequent patch will show, some environments on Windows define their Python library as e.g. "libpython2.7.dll." The existing code would pass "libpython2.7" into LoadLibrary(). It would assume "7" was the file extension and look for a "libpython2.dll" to load. By passing ".dll" into LoadLibrary(), we force it to search for the exact basename we want, even if it contains a period. diff --git a/mercurial/exewrapper.c b/mercurial/exewrapper.c --- a/mercurial/exewrapper.c +++ b/mercurial/exewrapper.c @@ -96,7 +96,8 @@ int main(int argc, char *argv[]) /* path pyhome exists, let's use it */ FindClose(hfind); strcpy_s(pydllfile, sizeof(pydllfile), pyhome); - strcat_s(pydllfile, sizeof(pydllfile), "\\" HGPYTHONLIB); + strcat_s(pydllfile, sizeof(pydllfile), + "\\" HGPYTHONLIB ".dll"); pydll = LoadLibrary(pydllfile); if (pydll == NULL) { err = "failed to load private Python DLL " @@ -114,7 +115,7 @@ int main(int argc, char *argv[]) } if (pydll == NULL) { - pydll = LoadLibrary(HGPYTHONLIB); + pydll = LoadLibrary(HGPYTHONLIB ".dll"); if (pydll == NULL) { err = "failed to load Python DLL " HGPYTHONLIB ".dll"; goto bail;