diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py
index 8ad49ec..8106e2d 100644
--- a/Cython/Compiler/ModuleNode.py
+++ b/Cython/Compiler/ModuleNode.py
@@ -168,12 +168,14 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
             if options.capi_reexport_cincludes:
                 self.generate_includes(env, [], h_code)
             h_code.putln("")
+            # Python.h needed for PyMODINIT_FUNC
+            h_code.putln("#include <Python.h>")
             api_guard = Naming.api_guard_prefix + self.api_name(env)
             h_code.putln("#ifndef %s" % api_guard)
             h_code.putln("")
             self.generate_extern_c_macro_definition(h_code)
             h_code.putln("")
-            self.generate_dl_import_macro(h_code)
+            self.generate_dl_import_macro(h_code, env)
             if h_extension_types:
                 h_code.putln("")
                 for entry in h_extension_types:
@@ -183,11 +185,11 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
             if h_funcs:
                 h_code.putln("")
                 for entry in h_funcs:
-                    self.generate_public_declaration(entry, h_code, i_code)
+                    self.generate_public_declaration(entry, env, h_code, i_code)
             if h_vars:
                 h_code.putln("")
                 for entry in h_vars:
-                    self.generate_public_declaration(entry, h_code, i_code)
+                    self.generate_public_declaration(entry, env, h_code, i_code)
             h_code.putln("")
             h_code.putln("#endif /* !%s */" % api_guard)
             h_code.putln("")
@@ -205,11 +207,11 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
             finally:
                 f.close()
 
-    def generate_public_declaration(self, entry, h_code, i_code):
+    def generate_public_declaration(self, entry, env, h_code, i_code):
         h_code.putln("%s %s;" % (
             Naming.extern_c_macro,
             entry.type.declaration_code(
-                entry.cname, dll_linkage="DL_IMPORT")))
+                entry.cname, dll_linkage=self.dll_macro_name(env))))
         if i_code:
             i_code.putln("cdef extern %s" % (
                 entry.type.declaration_code(entry.cname, pyrex=1)))
@@ -217,6 +219,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
     def api_name(self, env):
         return env.qualified_name.replace(".", "__")
 
+    def dll_macro_name(self, env):
+        return 'DLL_EXPORT__' + self.api_name(env)
+
     def generate_api_code(self, env, options, result):
         def api_entries(entries, pxd=0):
             return [entry for entry in entries
@@ -337,6 +342,13 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
         globalstate.initialize_main_c_code()
         h_code = globalstate['h_code']
 
+        distutils_metadata = result.embedded_metadata['distutils']
+        define_macros = [self.dll_macro_name(env)]
+        if 'define_macros' in distutils_metadata:
+            distutils_metadata['define_macros'].extend(define_macros)
+        else:
+            distutils_metadata['define_macros'] = define_macros
+
         self.generate_module_preamble(env, options, modules, result.embedded_metadata, h_code)
 
         globalstate.module_pos = self.pos
@@ -716,9 +728,15 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
         code.putln("  #endif")
         code.putln("#endif")
 
-    def generate_dl_import_macro(self, code):
-        code.putln("#ifndef DL_IMPORT")
-        code.putln("  #define DL_IMPORT(_T) _T")
+    def generate_dl_import_macro(self, code, env):
+        export_macro = 'EXPORT__' + self.api_name(env)
+        declspec_macro = self.dll_macro_name(env)
+        code.putln("#ifdef HAVE_DECLSPEC_DLL")
+        code.putln("    #ifdef %s" % export_macro)
+        code.putln("        #define %s(_T) __declspec(dllexport) _T" % declspec_macro)
+        code.putln("    #else")
+        code.putln("        #define %s(_T) __declspec(dllimport) _T" % declspec_macro)
+        code.putln("    #endif")
         code.putln("#endif")
 
     def generate_includes(self, env, cimported_modules, code):
