summaryrefslogtreecommitdiffstats
path: root/Python/dynload_win.c
diff options
context:
space:
mode:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-01-03 23:42:13 (GMT)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-01-03 23:42:13 (GMT)
commitd6179e120d3ed98ec28cb5e4b6feabed2d670235 (patch)
tree6585b427604d6aaeed44093618daaf99f512862c /Python/dynload_win.c
parent819b8bf403f19017f9e7ea11cd83699b517f3394 (diff)
downloadcpython-d6179e120d3ed98ec28cb5e4b6feabed2d670235.zip
cpython-d6179e120d3ed98ec28cb5e4b6feabed2d670235.tar.gz
cpython-d6179e120d3ed98ec28cb5e4b6feabed2d670235.tar.bz2
On Windows, when import fails to load a dll module, the message says
"error code 193" instead of a more informative text. It turns out that FormatMessage needs additional parameters for some error codes. For example: 193 means "%1 is not a valid Win32 application". Since it is impossible to know which parameter to pass, we use FORMAT_MESSAGE_IGNORE_INSERTS to get the raw message, which is still better than the number. Also use the Unicode version of the API, to deal with accented letters.
Diffstat (limited to 'Python/dynload_win.c')
-rw-r--r--Python/dynload_win.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/Python/dynload_win.c b/Python/dynload_win.c
index fc641b9..2b9e0be 100644
--- a/Python/dynload_win.c
+++ b/Python/dynload_win.c
@@ -183,33 +183,35 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
hDLL = LoadLibraryEx(pathname, NULL,
LOAD_WITH_ALTERED_SEARCH_PATH);
if (hDLL==NULL){
- char errBuf[256];
+ PyObject *message;
unsigned int errorCode;
/* Get an error string from Win32 error code */
- char theInfo[256]; /* Pointer to error text
+ wchar_t theInfo[256]; /* Pointer to error text
from system */
int theLength; /* Length of error text */
errorCode = GetLastError();
- theLength = FormatMessage(
- FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
+ theLength = FormatMessageW(
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS, /* flags */
NULL, /* message source */
errorCode, /* the message (error) ID */
- 0, /* default language environment */
- (LPTSTR) theInfo, /* the buffer */
+ MAKELANGID(LANG_NEUTRAL,
+ SUBLANG_DEFAULT),
+ /* Default language */
+ 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) {
- PyOS_snprintf(errBuf, sizeof(errBuf),
- "DLL load failed with error code %d",
- errorCode);
+ message = PyUnicode_FromFormat(
+ "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 &&
@@ -218,13 +220,16 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
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';
+ message = PyUnicode_FromString(
+ "DLL load failed: ");
+
+ PyUnicode_AppendAndDel(&message,
+ PyUnicode_FromUnicode(
+ theInfo,
+ theLength));
}
- PyErr_SetString(PyExc_ImportError, errBuf);
+ PyErr_SetObject(PyExc_ImportError, message);
+ Py_XDECREF(message);
return NULL;
} else {
char buffer[256];