* stdwinmodule.c (stdwin_done): interface to shutdown stdwin (now this is
  no longer done by config.c).
* stdwinmodule.c (initstdwin), config.c (initall): get command line
  arguments from sys.argv instead of special-casing stdwin in config.c
* import.c (get_module): fix core dump when foomodule.o does not define
  initfoo().
* ChangeLog: documented changes by Sjoerd.
diff --git a/Modules/config.c.in b/Modules/config.c.in
index f19655f..fc80362 100644
--- a/Modules/config.c.in
+++ b/Modules/config.c.in
@@ -70,14 +70,6 @@
 #define DATE ">= 29 Jul 1993"
 #endif
 
-#ifdef USE_STDWIN
-#ifdef macintosh
-#include ":::stdwin:H:stdwin.h"
-#else /* !macintosh */
-#include "stdwin.h"
-#endif /* !macintosh */
-#endif /* USE_STDWIN */
-
 char version[80];
 
 char *argv0; /* For dynamic loading in import.c */
@@ -94,12 +86,6 @@
 
 	argv0 = **p_argv;
 
-#ifdef USE_STDWIN
-#ifdef THINK_C_3_0
-	wsetstdio(1);
-#endif
-	wargs(p_argc, p_argv);
-#endif /* USE_STDWIN */
 #ifdef USE_FROZEN
 	if (verbose)
 #else
@@ -120,9 +106,6 @@
 void
 donecalls()
 {
-#ifdef USE_STDWIN
-	wdone();
-#endif
 #ifdef USE_AUDIO
 	asa_done();
 #endif
diff --git a/Modules/stdwinmodule.c b/Modules/stdwinmodule.c
index a6f6fba..1fff814 100644
--- a/Modules/stdwinmodule.c
+++ b/Modules/stdwinmodule.c
@@ -66,6 +66,7 @@
 #include "allobjects.h"
 #include "modsupport.h"
 #include "ceval.h"
+#include "sysmodule.h"
 
 #ifdef macintosh
 #include ":::stdwin:H:stdwin.h"
@@ -1943,6 +1944,21 @@
 /* Stdwin methods */
 
 static object *
+stdwin_done(sw, args)
+	object *sw;
+	object *args;
+{
+	if (!getnoarg(args))
+		return NULL;
+	wdone();
+	/* XXX There is no protection against continued use of
+	   XXX stdwin functions or objects after this call is made.
+	   XXX Use at own risk */
+	INCREF(None);
+	return None;
+}
+
+static object *
 stdwin_open(sw, args)
 	object *sw;
 	object *args;
@@ -2467,6 +2483,7 @@
 	{"askfile",		stdwin_askfile},
 	{"askstr",		stdwin_askstr},
 	{"askync",		stdwin_askync},
+	{"done",		stdwin_done},
 	{"fetchcolor",		stdwin_fetchcolor},
 #ifdef unix
 	{"fileno",		stdwin_connectionnumber},
@@ -2515,6 +2532,67 @@
 	{NULL,			NULL}		/* sentinel */
 };
 
+static int
+checkstringlist(args, ps, pn)
+	object *args;
+	char ***ps;
+	int *pn;
+{
+	int i, n;
+	char **s;
+	if (!is_listobject(args)) {
+		err_setstr(TypeError, "list of strings expected");
+		return 0;
+	}
+	n = getlistsize(args);
+	s = NEW(char *, n+1);
+	if (s == NULL) {
+		err_nomem();
+		return 0;
+	}
+	for (i = 0; i < n; i++) {
+		object *item = getlistitem(args, i);
+		if (!is_stringobject(item)) {
+			err_setstr(TypeError, "list of strings expected");
+			return 0;
+		}
+		s[i] = getstringvalue(item);
+	}
+	s[n] = NULL; /* In case caller wants a NULL-terminated list */
+	*ps = s;
+	*pn = n;
+	return 1;
+}
+
+static int
+putbackstringlist(list, s, n)
+	object *list;
+	char **s;
+	int n;
+{
+	int oldsize = getlistsize(list);
+	object *newlist;
+	int i;
+	if (n == oldsize)
+		return 1;
+	newlist = newlistobject(n);
+	for (i = 0; i < n && newlist != NULL; i++) {
+		object *item = newstringobject(s[i]);
+		if (item == NULL) {
+			DECREF(newlist);
+			newlist = NULL;
+		}
+		else
+			setlistitem(newlist, i, item);
+	}
+	if (newlist == NULL)
+		return 0;
+	(*list->ob_type->tp_as_sequence->sq_ass_slice)
+		(list, 0, oldsize, newlist);
+	DECREF(newlist);
+	return 1;
+}
+
 void
 initstdwin()
 {
@@ -2522,7 +2600,18 @@
 	static int inited = 0;
 
 	if (!inited) {
-		winit();
+		int argc = 0;
+		char **argv = NULL;
+		object *sys_argv = sysget("argv");
+		if (sys_argv != NULL) {
+			if (!checkstringlist(sys_argv, &argv, &argc))
+				err_clear();
+		}
+		winitargs(&argc, &argv);
+		if (argv != NULL) {
+			if (!putbackstringlist(sys_argv, argv, argc))
+				err_clear();
+		}
 		inited = 1;
 	}
 	m = initmodule("stdwin", stdwin_methods);
diff --git a/Python/import.c b/Python/import.c
index 284d881..4d01daf 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -191,20 +191,22 @@
 		  p = (dl_funcptr) dlsym(handle, funcname);
 		}
 #else
+		if (verbose)
+			fprintf(stderr,
+				"import %s # dynamically loaded from \"%s\"\n",
+				name, namebuf);
 		p =  dl_loadmod(argv0, namebuf, funcname);
 #endif /* SUN_SHLIB */
 		if (p == NULL) {
-			D(fprintf(stderr, "dl_loadmod failed\n"));
+			err_setstr(SystemError,
+			   "dynamic module does not define init function");
+			return NULL;
 		} else {
-			if (verbose)
-				fprintf(stderr,
-			"import %s # dynamically loaded from \"%s\"\n",
-					name, namebuf);
 			(*p)();
 			*m_ret = m = dictlookup(modules, name);
 			if (m == NULL) {
 				err_setstr(SystemError,
-					   "dynamic module missing");
+				   "dynamic module not initialized properly");
 				return NULL;
 			} else {
 				D(fprintf(stderr,