Index: src/gui_w48.c
===================================================================
--- src/gui_w48.c	(revision 1112)
+++ src/gui_w48.c	(working copy)
@@ -3154,12 +3154,12 @@
 	    idc = MAKEINTRESOURCE(IDC_ARROW);
 	else
 	    idc = mshape_idcs[shape];
-#ifdef _WIN64
-	SetClassLongPtr(s_textArea, GCLP_HCURSOR, (LONG_PTR)LoadCursor(NULL, idc));
+#ifdef SetClassLongPtr
+	SetClassLongPtr(s_textArea, GCLP_HCURSOR, (__int3264)(LONG_PTR)LoadCursor(NULL, idc));
 #else
 # ifdef WIN32
-	SetClassLong(s_textArea, GCL_HCURSOR, (LONG)LoadCursor(NULL, idc));
-# else
+	SetClassLong(s_textArea, GCL_HCURSOR, (long_u)LoadCursor(NULL, idc));
+# else /* Win16 */
 	SetClassWord(s_textArea, GCW_HCURSOR, (WORD)LoadCursor(NULL, idc));
 # endif
 #endif
Index: src/GvimExt/gvimext.cpp
===================================================================
--- src/GvimExt/gvimext.cpp	(revision 1112)
+++ src/GvimExt/gvimext.cpp	(working copy)
@@ -205,13 +205,13 @@
 }
 
     static char *
-null_libintl_bindtextdomain(const char *domainname, const char *dirname)
+null_libintl_bindtextdomain(const char * /* domainname */, const char * /* dirname */)
 {
     return NULL;
 }
 
     static char *
-null_libintl_textdomain(const char* domainname)
+null_libintl_textdomain(const char*  /* domainname */)
 {
     return NULL;
 }
@@ -308,7 +308,7 @@
 // DllMain
 //---------------------------------------------------------------------------
 extern "C" int APIENTRY
-DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
+DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID  /* lpReserved */)
 {
     switch (dwReason)
     {
@@ -438,7 +438,7 @@
 }
 
 
-STDMETHODIMP CShellExtClassFactory::LockServer(BOOL fLock)
+STDMETHODIMP CShellExtClassFactory::LockServer(BOOL  /* fLock */)
 {
     return NOERROR;
 }
@@ -520,9 +520,9 @@
 //		It could be a context menu or a property sheet.
 //
 
-STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
+STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST  /* pIDFolder */,
 				   LPDATAOBJECT pDataObj,
-				   HKEY hRegKey)
+				   HKEY  /* hRegKey */)
 {
     // Initialize can be called more than once
     if (m_pDataObj)
@@ -562,8 +562,8 @@
 STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu,
 					 UINT indexMenu,
 					 UINT idCmdFirst,
-					 UINT idCmdLast,
-					 UINT uFlags)
+					 UINT  /* idCmdLast */,
+					 UINT  /* uFlags */)
 {
     UINT idCmd = idCmdFirst;
 
@@ -718,11 +718,11 @@
     return hr;
 }
 
-STDMETHODIMP CShellExt::PushToWindow(HWND hParent,
-				   LPCSTR pszWorkingDir,
-				   LPCSTR pszCmd,
-				   LPCSTR pszParam,
-				   int iShowCmd,
+STDMETHODIMP CShellExt::PushToWindow(HWND  /* hParent */,
+				   LPCSTR  /* pszWorkingDir */,
+				   LPCSTR  /* pszCmd */,
+				   LPCSTR  /* pszParam */,
+				   int  /* iShowCmd */,
 				   int idHWnd)
 {
     HWND hWnd = m_hWnd[idHWnd];
@@ -740,9 +740,9 @@
     return NOERROR;
 }
 
-STDMETHODIMP CShellExt::GetCommandString(UINT_PTR idCmd,
+STDMETHODIMP CShellExt::GetCommandString(UINT_PTR  /* idCmd */,
 					 UINT uFlags,
-					 UINT FAR *reserved,
+					 UINT FAR * /* reserved */,
 					 LPSTR pszName,
 					 UINT cchMax)
 {
@@ -841,10 +841,10 @@
 #endif
 
 STDMETHODIMP CShellExt::InvokeGvim(HWND hParent,
-				   LPCSTR pszWorkingDir,
-				   LPCSTR pszCmd,
-				   LPCSTR pszParam,
-				   int iShowCmd)
+				   LPCSTR  /* pszWorkingDir */,
+				   LPCSTR  /* pszCmd */,
+				   LPCSTR  /* pszParam */,
+				   int  /* iShowCmd */)
 {
     char m_szFileUserClickedOn[BUFSIZE];
     char cmdStr[BUFSIZE];
@@ -911,10 +911,10 @@
 
 
 STDMETHODIMP CShellExt::InvokeSingleGvim(HWND hParent,
-				   LPCSTR pszWorkingDir,
-				   LPCSTR pszCmd,
-				   LPCSTR pszParam,
-				   int iShowCmd,
+				   LPCSTR  /* pszWorkingDir */,
+				   LPCSTR  /* pszCmd */,
+				   LPCSTR  /* pszParam */,
+				   int  /* iShowCmd */,
 				   int useDiff)
 {
     char	m_szFileUserClickedOn[BUFSIZE];
Index: src/Make_mvc.mak
===================================================================
--- src/Make_mvc.mak	(revision 1112)
+++ src/Make_mvc.mak	(working copy)
@@ -207,9 +207,9 @@
 
 !include <Win32.mak>
 
-# Turn on Win64 compatibility warnings for 32-bit compiler in VC8. (/Wp64 is
-# deprecated in VC9.)
-!if ("$(MSVCVER)" == "8.0") 
+# Turn on Win64 compatibility warnings for VC7.x and VC8.
+# (/Wp64 is deprecated in VC9 and generates an obnoxious warning.)
+!if ("$(MSVCVER)" == "7.0") || ("$(MSVCVER)" == "7.1") || ("$(MSVCVER)" == "8.0") 
 DEFINES=$(DEFINES) /Wp64
 !endif
 
Index: src/os_win32.c
===================================================================
--- src/os_win32.c	(revision 1112)
+++ src/os_win32.c	(working copy)
@@ -4663,7 +4663,7 @@
 # endif
        )
     {
-# if defined(DEBUG) && _MSC_VER > 1200
+# if defined(DEBUG) && _MSC_VER >= 1400
 	/* Work around an annoying assertion in the Microsoft debug CRT
 	 * when mode's text/binary setting doesn't match _get_fmode(). */
 	char newMode = mode[strlen(mode) - 1];
@@ -4682,7 +4682,7 @@
 	vim_free(wn);
 	vim_free(wm);
 
-# if defined(DEBUG) && _MSC_VER > 1200
+# if defined(DEBUG) && _MSC_VER >= 1400
 	_set_fmode(oldMode);
 # endif
 
Index: src/vim.h
===================================================================
--- src/vim.h	(revision 1112)
+++ src/vim.h	(working copy)
@@ -352,8 +352,8 @@
 typedef unsigned short	short_u;
 typedef unsigned int	int_u;
 /* Make sure long_u is big enough to hold a pointer.
- * On Win64 longs are 32 bit and pointers 64 bit.
- * For printf() and scanf() we need to take care of long_u specifically. */
+ * On Win64, longs are 32 bits and pointers are 64 bits.
+ * For printf() and scanf(), we need to take care of long_u specifically. */
 #ifdef _WIN64
 typedef unsigned __int64        long_u;
 typedef		 __int64        long_i;
@@ -361,8 +361,16 @@
 # define SCANF_DECIMAL_LONG_U   "%Iu"
 # define PRINTF_HEX_LONG_U      "0x%Ix"
 #else
-typedef unsigned long	        long_u;
-typedef		 long	        long_i;
+  /* Microsoft-specific. The __w64 keyword should be specified on any typedefs
+   * that change size between 32-bit and 64-bit platforms.  For any such type,
+   * __w64 should appear only on the 32-bit definition of the typedef.
+   * Define __w64 as an empty token for everything but MSVC 7.x or later.
+   */
+# if !defined(_MSC_VER)	|| (_MSC_VER < 1300)
+#  define __w64 
+# endif
+typedef unsigned long __w64	long_u;
+typedef		 long __w64     long_i;
 # define SCANF_HEX_LONG_U       "%lx"
 # define SCANF_DECIMAL_LONG_U   "%lu"
 # define PRINTF_HEX_LONG_U      "0x%lx"
