Is this Py3k specific? On Jan 3, 2008 3:42 PM, amaury.forgeotdarc <[email protected]> wrote: > Author: amaury.forgeotdarc > Date: Fri Jan 4 00:42:13 2008 > New Revision: 59682 > > Modified: > python/branches/py3k/Python/dynload_win.c > Log: > 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. > > > > Modified: python/branches/py3k/Python/dynload_win.c > ============================================================================== > --- python/branches/py3k/Python/dynload_win.c (original) > +++ python/branches/py3k/Python/dynload_win.c Fri Jan 4 00:42:13 2008 > @@ -183,33 +183,35 @@ > 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 @@ > 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]; > _______________________________________________ > Python-3000-checkins mailing list > [email protected] > http://mail.python.org/mailman/listinfo/python-3000-checkins >
-- --Guido van Rossum (home page: http://www.python.org/~guido/) _______________________________________________ Python-3000-checkins mailing list [email protected] http://mail.python.org/mailman/listinfo/python-3000-checkins
