diff options
| author | Guido van Rossum <guido@python.org> | 1999-12-20 21:18:49 +0000 | 
|---|---|---|
| committer | Guido van Rossum <guido@python.org> | 1999-12-20 21:18:49 +0000 | 
| commit | 22a1d3671bd02fbbc3599e3b4c19648027d7b867 (patch) | |
| tree | 4cb5ba7264de29523a990a3ff3be02bd12e976d4 /Python/dynload_win.c | |
| parent | 72badf54048655ecbcb5b541428823386795231e (diff) | |
| download | cpython-git-22a1d3671bd02fbbc3599e3b4c19648027d7b867.tar.gz | |
The old platform-specific contents of importdl.c, broken down into one
file per platform (really: per style of Dl API; e.g. all platforms
using dlopen() are grouped together in dynload_shlib.c.).
This is part of a set of patches by Greg Stein.
Diffstat (limited to 'Python/dynload_win.c')
| -rw-r--r-- | Python/dynload_win.c | 149 | 
1 files changed, 149 insertions, 0 deletions
diff --git a/Python/dynload_win.c b/Python/dynload_win.c new file mode 100644 index 0000000000..9e68cac35d --- /dev/null +++ b/Python/dynload_win.c @@ -0,0 +1,149 @@ +/*********************************************************** +Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, +The Netherlands. + +                        All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Stichting Mathematisch +Centrum or CWI or Corporation for National Research Initiatives or +CNRI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +While CWI is the initial source for this software, a modified version +is made available by the Corporation for National Research Initiatives +(CNRI) at the Internet address ftp://ftp.python.org. + +STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH +CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +******************************************************************/ + +/* 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 *name, const char *funcname, +				    const char *pathname, FILE *fp) +{ +	dl_funcptr p; + +#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 { +				int 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; +}  | 
