]> granicus.if.org Git - python/commitdiff
On Windows, when import fails to load a dll module, the message says
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Thu, 3 Jan 2008 23:42:13 +0000 (23:42 +0000)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Thu, 3 Jan 2008 23:42:13 +0000 (23:42 +0000)
"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.

Python/dynload_win.c

index fc641b9ff9e2d034186cc5097ee74f7c4f60aecc..2b9e0bee3765c922e425fbc6ae76d3ef497286b9 100644 (file)
@@ -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];