Mercurial > cpython-lru_cache-weakref
view Python/dynload_win.c @ 14914:79cdeeeefafa legacy-trunk
Removed the implib_dir instance variable because it is unused.
Removed get_ext_libname() because it is unused.
Fixed get_libraries() to append an '_d' to the python debug
import library. If MSVC is used, do not add 'pythonxx.lib' to
the list of libraries, because this is handled better
by a pragma in config.h.
This should fix bug #115595, but it needs some more testing.
| author | Thomas Heller <theller@ctypes.org> |
|---|---|
| date | Thu, 28 Sep 2000 19:28:35 +0000 |
| parents | 6f6f965c5e2d |
| children | 5ffa515e620e |
line wrap: on
line source
/* Support for dynamic loading of extension modules */ #include <windows.h> #include <direct.h> #include "Python.h" #include "importdl.h" const struct filedescr _PyImport_DynLoadFiletab[] = { #ifdef _DEBUG {"_d.pyd", "rb", C_EXTENSION}, {"_d.dll", "rb", C_EXTENSION}, #else {".pyd", "rb", C_EXTENSION}, {".dll", "rb", C_EXTENSION}, #endif {0, 0} }; dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, const char *pathname, FILE *fp) { dl_funcptr p; char funcname[258]; sprintf(funcname, "init%.200s", shortname); #ifdef MS_WIN32 { HINSTANCE hDLL; char pathbuf[260]; if (strchr(pathname, '\\') == NULL && strchr(pathname, '/') == NULL) { /* Prefix bare filename with ".\" */ char *p = pathbuf; *p = '\0'; _getcwd(pathbuf, sizeof pathbuf); if (*p != '\0' && p[1] == ':') p += 2; sprintf(p, ".\\%-.255s", pathname); pathname = pathbuf; } /* Look for dependent DLLs in directory of pathname first */ /* XXX This call doesn't exist in Windows CE */ hDLL = LoadLibraryEx(pathname, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (hDLL==NULL){ char errBuf[256]; unsigned int errorCode; /* Get an error string from Win32 error code */ char theInfo[256]; /* Pointer to error text from system */ int theLength; /* Length of error text */ errorCode = GetLastError(); theLength = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, /* flags */ NULL, /* message source */ errorCode, /* the message (error) ID */ 0, /* default language environment */ (LPTSTR) theInfo, /* the buffer */ sizeof(theInfo), /* the buffer size */ NULL); /* no additional format args. */ /* Problem: could not get the error message. This should not happen if called correctly. */ if (theLength == 0) { sprintf(errBuf, "DLL load failed with error code %d", errorCode); } else { size_t len; /* For some reason a \r\n is appended to the text */ if (theLength >= 2 && theInfo[theLength-2] == '\r' && theInfo[theLength-1] == '\n') { theLength -= 2; theInfo[theLength] = '\0'; } strcpy(errBuf, "DLL load failed: "); len = strlen(errBuf); strncpy(errBuf+len, theInfo, sizeof(errBuf)-len); errBuf[sizeof(errBuf)-1] = '\0'; } PyErr_SetString(PyExc_ImportError, errBuf); return NULL; } p = GetProcAddress(hDLL, funcname); } #endif /* MS_WIN32 */ #ifdef MS_WIN16 { HINSTANCE hDLL; char pathbuf[16]; if (strchr(pathname, '\\') == NULL && strchr(pathname, '/') == NULL) { /* Prefix bare filename with ".\" */ sprintf(pathbuf, ".\\%-.13s", pathname); pathname = pathbuf; } hDLL = LoadLibrary(pathname); if (hDLL < HINSTANCE_ERROR){ char errBuf[256]; sprintf(errBuf, "DLL load failed with error code %d", hDLL); PyErr_SetString(PyExc_ImportError, errBuf); return NULL; } p = GetProcAddress(hDLL, funcname); } #endif /* MS_WIN16 */ return p; }
