/* Support for dynamic loading of extension modules */ #include #include #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; }