diff --git a/src/VisVim/Commands.cpp b/src/VisVim/Commands.cpp
new file mode 100644
index 0000000..254b7a9
--- /dev/null
+++ b/src/VisVim/Commands.cpp
@@ -0,0 +1,693 @@
+#include "stdafx.h"
+#include <comdef.h>	// For _bstr_t
+#include "VisVim.h"
+#include "Commands.h"
+#include "OleAut.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+
+#endif
+
+
+// Change directory before opening file?
+#define CD_SOURCE		0	// Cd to source path
+#define CD_SOURCE_PARENT	1	// Cd to parent directory of source path
+#define CD_NONE			2	// No cd
+
+
+static BOOL g_bEnableVim = TRUE;	// Vim enabled
+static BOOL g_bDevStudioEditor = FALSE;	// Open file in Dev Studio editor simultaneously
+static int g_ChangeDir = CD_NONE;	// CD after file open?
+
+static void VimSetEnableState (BOOL bEnableState);
+static BOOL VimOpenFile (BSTR& FileName, long LineNr);
+static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method);
+static void VimErrDiag (COleAutomationControl& VimOle);
+static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName);
+static void DebugMsg (char* Msg, char* Arg = NULL);
+
+
+/////////////////////////////////////////////////////////////////////////////
+// CCommands
+
+CCommands::CCommands ()
+{
+	// m_pApplication == NULL; M$ Code generation bug!!!
+	m_pApplication = NULL;
+	m_pApplicationEventsObj = NULL;
+	m_pDebuggerEventsObj = NULL;
+}
+
+CCommands::~CCommands ()
+{
+	ASSERT (m_pApplication != NULL);
+	if (m_pApplication)
+	{
+		m_pApplication->Release ();
+		m_pApplication = NULL;
+	}
+}
+
+void CCommands::SetApplicationObject (IApplication * pApplication)
+{
+	// This function assumes pApplication has already been AddRef'd
+	// for us, which CDSAddIn did in its QueryInterface call
+	// just before it called us.
+	m_pApplication = pApplication;
+	if (! m_pApplication)
+		return;
+
+	// Create Application event handlers
+	XApplicationEventsObj::CreateInstance (&m_pApplicationEventsObj);
+	if (! m_pApplicationEventsObj)
+	{
+		ReportInternalError ("XApplicationEventsObj::CreateInstance");
+		return;
+	}
+	m_pApplicationEventsObj->AddRef ();
+	m_pApplicationEventsObj->Connect (m_pApplication);
+	m_pApplicationEventsObj->m_pCommands = this;
+
+#ifdef NEVER
+	// Create Debugger event handler
+	CComPtr < IDispatch > pDebugger;
+	if (SUCCEEDED (m_pApplication->get_Debugger (&pDebugger))
+	    && pDebugger != NULL)
+	{
+		XDebuggerEventsObj::CreateInstance (&m_pDebuggerEventsObj);
+		m_pDebuggerEventsObj->AddRef ();
+		m_pDebuggerEventsObj->Connect (pDebugger);
+		m_pDebuggerEventsObj->m_pCommands = this;
+	}
+#endif
+
+	// Get settings from registry HKEY_CURRENT_USER\Software\Vim\VisVim
+	HKEY hAppKey = GetAppKey ("Vim");
+	if (hAppKey)
+	{
+		HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim");
+		if (hSectionKey)
+		{
+			g_bEnableVim = GetRegistryInt (hSectionKey, "EnableVim",
+						       g_bEnableVim);
+			g_bDevStudioEditor = GetRegistryInt(hSectionKey,"DevStudioEditor",
+							    g_bDevStudioEditor);
+			g_ChangeDir = GetRegistryInt (hSectionKey, "ChangeDir",
+						      g_ChangeDir);
+			RegCloseKey (hSectionKey);
+		}
+		RegCloseKey (hAppKey);
+	}
+}
+
+void CCommands::UnadviseFromEvents ()
+{
+	ASSERT (m_pApplicationEventsObj != NULL);
+	if (m_pApplicationEventsObj)
+	{
+		m_pApplicationEventsObj->Disconnect (m_pApplication);
+		m_pApplicationEventsObj->Release ();
+		m_pApplicationEventsObj = NULL;
+	}
+
+#ifdef NEVER
+	if (m_pDebuggerEventsObj)
+	{
+		// Since we were able to connect to the Debugger events, we
+		// should be able to access the Debugger object again to
+		// unadvise from its events (thus the VERIFY_OK below--see
+		// stdafx.h).
+		CComPtr < IDispatch > pDebugger;
+		VERIFY_OK (m_pApplication->get_Debugger (&pDebugger));
+		ASSERT (pDebugger != NULL);
+		m_pDebuggerEventsObj->Disconnect (pDebugger);
+		m_pDebuggerEventsObj->Release ();
+		m_pDebuggerEventsObj = NULL;
+	}
+#endif
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Event handlers
+
+// Application events
+
+HRESULT CCommands::XApplicationEvents::BeforeBuildStart ()
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return S_OK;
+}
+
+HRESULT CCommands::XApplicationEvents::BuildFinish (long nNumErrors, long nNumWarnings)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return S_OK;
+}
+
+HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown ()
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return S_OK;
+}
+
+// The open document event handle is the place where the real interface work
+// is done.
+// Vim gets called from here.
+//
+HRESULT CCommands::XApplicationEvents::DocumentOpen (IDispatch * theDocument)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+
+	if (! g_bEnableVim)
+		// Vim not enabled or empty command line entered
+		return S_OK;
+
+	// First get the current file name and line number
+
+	// Get the document object
+	CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (theDocument);
+	if (! pDoc)
+		return S_OK;
+
+	BSTR FileName;
+	long LineNr = -1;
+
+	// Get the document name
+	if (FAILED (pDoc->get_FullName (&FileName)))
+		return S_OK;
+
+	LPDISPATCH pDispSel;
+
+	// Get a selection object dispatch pointer
+	if (SUCCEEDED (pDoc->get_Selection (&pDispSel)))
+	{
+		// Get the selection object
+		CComQIPtr < ITextSelection, &IID_ITextSelection > pSel (pDispSel);
+
+		if (pSel)
+			// Get the selection line number
+			pSel->get_CurrentLine (&LineNr);
+
+		pDispSel->Release ();
+	}
+
+	// Open the file in Vim and position to the current line
+	if (VimOpenFile (FileName, LineNr))
+	{
+		if (! g_bDevStudioEditor)
+		{
+			// Close the document in developer studio
+			CComVariant vSaveChanges = dsSaveChangesPrompt;
+			DsSaveStatus Saved;
+
+			pDoc->Close (vSaveChanges, &Saved);
+		}
+	}
+
+	// We're done here
+	SysFreeString (FileName);
+	return S_OK;
+}
+
+HRESULT CCommands::XApplicationEvents::BeforeDocumentClose (IDispatch * theDocument)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return S_OK;
+}
+
+HRESULT CCommands::XApplicationEvents::DocumentSave (IDispatch * theDocument)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return S_OK;
+}
+
+HRESULT CCommands::XApplicationEvents::NewDocument (IDispatch * theDocument)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+
+	if (! g_bEnableVim)
+		// Vim not enabled or empty command line entered
+		return S_OK;
+
+	// First get the current file name and line number
+
+	CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (theDocument);
+	if (! pDoc)
+		return S_OK;
+
+	BSTR FileName;
+	HRESULT hr;
+
+	hr = pDoc->get_FullName (&FileName);
+	if (FAILED (hr))
+		return S_OK;
+
+	// Open the file in Vim and position to the current line
+	if (VimOpenFile (FileName, 0))
+	{
+		if (! g_bDevStudioEditor)
+		{
+			// Close the document in developer studio
+			CComVariant vSaveChanges = dsSaveChangesPrompt;
+			DsSaveStatus Saved;
+
+			pDoc->Close (vSaveChanges, &Saved);
+		}
+	}
+
+	SysFreeString (FileName);
+	return S_OK;
+}
+
+HRESULT CCommands::XApplicationEvents::WindowActivate (IDispatch * theWindow)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return S_OK;
+}
+
+HRESULT CCommands::XApplicationEvents::WindowDeactivate (IDispatch * theWindow)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return S_OK;
+}
+
+HRESULT CCommands::XApplicationEvents::WorkspaceOpen ()
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return S_OK;
+}
+
+HRESULT CCommands::XApplicationEvents::WorkspaceClose ()
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return S_OK;
+}
+
+HRESULT CCommands::XApplicationEvents::NewWorkspace ()
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return S_OK;
+}
+
+// Debugger event
+
+HRESULT CCommands::XDebuggerEvents::BreakpointHit (IDispatch * pBreakpoint)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return S_OK;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+// VisVim dialog
+
+class CMainDialog : public CDialog
+{
+    public:
+	CMainDialog (CWnd * pParent = NULL);	// Standard constructor
+
+	//{{AFX_DATA(CMainDialog)
+	enum { IDD = IDD_ADDINMAIN };
+	int	m_ChangeDir;
+	BOOL	m_bDevStudioEditor;
+	//}}AFX_DATA
+
+	//{{AFX_VIRTUAL(CMainDialog)
+    protected:
+	virtual void DoDataExchange (CDataExchange * pDX);	// DDX/DDV support
+	//}}AFX_VIRTUAL
+
+    protected:
+	//{{AFX_MSG(CMainDialog)
+	afx_msg void OnEnable();
+	afx_msg void OnDisable();
+	//}}AFX_MSG
+	DECLARE_MESSAGE_MAP ()
+};
+
+CMainDialog::CMainDialog (CWnd * pParent /* =NULL */ )
+	: CDialog (CMainDialog::IDD, pParent)
+{
+	//{{AFX_DATA_INIT(CMainDialog)
+	m_ChangeDir = -1;
+	m_bDevStudioEditor = FALSE;
+	//}}AFX_DATA_INIT
+}
+
+void CMainDialog::DoDataExchange (CDataExchange * pDX)
+{
+	CDialog::DoDataExchange (pDX);
+	//{{AFX_DATA_MAP(CMainDialog)
+	DDX_Radio(pDX, IDC_CD_SOURCE_PATH, m_ChangeDir);
+	DDX_Check (pDX, IDC_DEVSTUDIO_EDITOR, m_bDevStudioEditor);
+	//}}AFX_DATA_MAP
+}
+
+BEGIN_MESSAGE_MAP (CMainDialog, CDialog)
+	//{{AFX_MSG_MAP(CMainDialog)
+	//}}AFX_MSG_MAP
+END_MESSAGE_MAP ()
+
+
+/////////////////////////////////////////////////////////////////////////////
+// CCommands methods
+
+STDMETHODIMP CCommands::VisVimDialog ()
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+
+	// Use m_pApplication to access the Developer Studio Application
+	// object,
+	// and VERIFY_OK to see error strings in DEBUG builds of your add-in
+	// (see stdafx.h)
+
+	VERIFY_OK (m_pApplication->EnableModeless (VARIANT_FALSE));
+
+	CMainDialog Dlg;
+
+	Dlg.m_bDevStudioEditor = g_bDevStudioEditor;
+	Dlg.m_ChangeDir = g_ChangeDir;
+	if (Dlg.DoModal () == IDOK)
+	{
+		g_bDevStudioEditor = Dlg.m_bDevStudioEditor;
+		g_ChangeDir = Dlg.m_ChangeDir;
+
+		// Save settings to registry HKEY_CURRENT_USER\Software\Vim\VisVim
+		HKEY hAppKey = GetAppKey ("Vim");
+		if (hAppKey)
+		{
+			HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim");
+			if (hSectionKey)
+			{
+				WriteRegistryInt (hSectionKey, "DevStudioEditor",
+						  g_bDevStudioEditor);
+				WriteRegistryInt (hSectionKey, "ChangeDir", g_ChangeDir);
+				RegCloseKey (hSectionKey);
+			}
+			RegCloseKey (hAppKey);
+		}
+	}
+
+	VERIFY_OK (m_pApplication->EnableModeless (VARIANT_TRUE));
+	return S_OK;
+}
+
+STDMETHODIMP CCommands::VisVimEnable ()
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	VimSetEnableState (true);
+	return S_OK;
+}
+
+STDMETHODIMP CCommands::VisVimDisable ()
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	VimSetEnableState (false);
+	return S_OK;
+}
+
+STDMETHODIMP CCommands::VisVimToggle ()
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	VimSetEnableState (! g_bEnableVim);
+	return S_OK;
+}
+
+STDMETHODIMP CCommands::VisVimLoad ()
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+
+	// Use m_pApplication to access the Developer Studio Application object,
+	// and VERIFY_OK to see error strings in DEBUG builds of your add-in
+	// (see stdafx.h)
+
+	CComBSTR bStr;
+	// Define dispatch pointers for document and selection objects
+	CComPtr < IDispatch > pDispDoc, pDispSel;
+
+	// Get a document object dispatch pointer
+	VERIFY_OK (m_pApplication->get_ActiveDocument (&pDispDoc));
+	if (! pDispDoc)
+		return S_OK;
+
+	BSTR FileName;
+	long LineNr = -1;
+
+	// Get the document object
+	CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (pDispDoc);
+
+	if (! pDoc)
+		return S_OK;
+
+	// Get the document name
+	if (FAILED (pDoc->get_FullName (&FileName)))
+		return S_OK;
+
+	// Get a selection object dispatch pointer
+	if (SUCCEEDED (pDoc->get_Selection (&pDispSel)))
+	{
+		// Get the selection object
+		CComQIPtr < ITextSelection, &IID_ITextSelection > pSel (pDispSel);
+
+		if (pSel)
+			// Get the selection line number
+			pSel->get_CurrentLine (&LineNr);
+	}
+
+	// Open the file in Vim
+	VimOpenFile (FileName, LineNr);
+
+	SysFreeString (FileName);
+	return S_OK;
+}
+
+
+//
+// Here we do the actual processing and communication with Vim
+//
+
+// Set the enable state and save to registry
+//
+static void VimSetEnableState (BOOL bEnableState)
+{
+	g_bEnableVim = bEnableState;
+	HKEY hAppKey = GetAppKey ("Vim");
+	if (hAppKey)
+	{
+		HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim");
+		if (hSectionKey)
+			WriteRegistryInt (hSectionKey, "EnableVim", g_bEnableVim);
+		RegCloseKey (hAppKey);
+	}
+}
+
+// Open the file 'FileName' in Vim and goto line 'LineNr'
+// 'FileName' is expected to contain an absolute DOS path including the drive
+// letter.
+// 'LineNr' must contain a valid line number or 0, e. g. for a new file
+//
+static BOOL VimOpenFile (BSTR& FileName, long LineNr)
+{
+
+	// OLE automation object for com. with Vim
+	// When the object goes out of scope, it's desctructor destroys the OLE connection;
+	// This is imortant to avoid blocking the object
+	// (in this memory corruption would be likely when terminating Vim
+	// while still running DevStudio).
+	// So keep this object local!
+	COleAutomationControl VimOle;
+
+	// :cd D:/Src2/VisVim/
+	//
+	// Get a dispatch id for the SendKeys method of Vim;
+	// enables connection to Vim if necessary
+	DISPID DispatchId;
+	DispatchId = VimGetDispatchId (VimOle, "SendKeys");
+	if (! DispatchId)
+		// OLE error, can't obtain dispatch id
+		goto OleError;
+
+	OLECHAR Buf[MAX_OLE_STR];
+	char FileNameTmp[MAX_OLE_STR];
+	char VimCmd[MAX_OLE_STR];
+	char *s, *p;
+
+	// Prepend CTRL-\ CTRL-N to exit insert mode
+	VimCmd[0] = 0x1c;
+	VimCmd[1] = 0x0e;
+	VimCmd[2] = 0;
+
+#ifdef SINGLE_WINDOW
+	// Update the current file in Vim if it has been modified.
+	// Disabled, because it could write the file when you don't want to.
+	sprintf (VimCmd + 2, ":up\n");
+#endif
+	if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf)))
+		goto OleError;
+
+	// Change Vim working directory to where the file is if desired
+	if (g_ChangeDir != CD_NONE)
+		VimChangeDir (VimOle, DispatchId, FileName);
+
+	// Make Vim open the file.
+	// In the filename convert all \ to /, put a \ before a space.
+	sprintf(VimCmd, ":drop ");
+	sprintf(FileNameTmp, "%S", (char *)FileName);
+	s = VimCmd + 6;
+	for (p = FileNameTmp; *p != '\0' && s < FileNameTmp + MAX_OLE_STR - 4;
+									  ++p)
+		if (*p == '\\')
+			*s++ = '/';
+		else
+		{
+			if (*p == ' ')
+				*s++ = '\\';
+			*s++ = *p;
+		}
+	*s++ = '\n';
+	*s = '\0';
+
+	if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf)))
+		goto OleError;
+
+	if (LineNr > 0)
+	{
+		// Goto line
+		sprintf (VimCmd, ":%d\n", LineNr);
+		if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf)))
+			goto OleError;
+	}
+
+	// Make Vim come to the foreground
+	if (! VimOle.Method ("SetForeground"))
+		VimOle.ErrDiag ();
+
+	// We're done
+	return true;
+
+    OleError:
+	// There was an OLE error
+	// Check if it's the "unknown class string" error
+	VimErrDiag (VimOle);
+	return false;
+}
+
+// Return the dispatch id for the Vim method 'Method'
+// Create the Vim OLE object if necessary
+// Returns a valid dispatch id or null on error
+//
+static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method)
+{
+	// Initialize Vim OLE connection if not already done
+	if (! VimOle.IsCreated ())
+	{
+		if (! VimOle.CreateObject ("Vim.Application"))
+			return NULL;
+	}
+
+	// Get the dispatch id for the SendKeys method.
+	// By doing this, we are checking if Vim is still there...
+	DISPID DispatchId = VimOle.GetDispatchId ("SendKeys");
+	if (! DispatchId)
+	{
+		// We can't get a dispatch id.
+		// This means that probably Vim has been terminated.
+		// Don't issue an error message here, instead
+		// destroy the OLE object and try to connect once more
+		//
+		// In fact, this should never happen, because the OLE aut. object
+		// should not be kept long enough to allow the user to terminate Vim
+		// to avoid memory corruption (why the heck is there no system garbage
+		// collection for those damned OLE memory chunks???).
+		VimOle.DeleteObject ();
+		if (! VimOle.CreateObject ("Vim.Application"))
+			// If this create fails, it's time for an error msg
+			return NULL;
+
+		if (! (DispatchId = VimOle.GetDispatchId ("SendKeys")))
+			// There is something wrong...
+			return NULL;
+	}
+
+	return DispatchId;
+}
+
+// Output an error message for an OLE error
+// Check on the classstring error, which probably means Vim wasn't registered.
+//
+static void VimErrDiag (COleAutomationControl& VimOle)
+{
+	SCODE sc = GetScode (VimOle.GetResult ());
+	if (sc == CO_E_CLASSSTRING)
+	{
+		char Buf[256];
+		sprintf (Buf, "There is no registered OLE automation server named "
+			 "\"Vim.Application\".\n"
+			 "Use the OLE-enabled version of Vim with VisVim and "
+			 "make sure to register Vim by running \"vim -register\".");
+		MessageBox (NULL, Buf, "OLE Error", MB_OK);
+	}
+	else
+		VimOle.ErrDiag ();
+}
+
+// Change directory to the directory the file 'FileName' is in or it's parent
+// directory according to the setting of the global 'g_ChangeDir':
+// 'FileName' is expected to contain an absolute DOS path including the drive
+// letter.
+//	CD_NONE
+//	CD_SOURCE_PATH
+//	CD_SOURCE_PARENT
+//
+static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName)
+{
+	// Do a :cd first
+
+	// Get the path name of the file ("dir/")
+	CString StrFileName = FileName;
+	char Drive[_MAX_DRIVE];
+	char Dir[_MAX_DIR];
+	char DirUnix[_MAX_DIR * 2];
+	char *s, *t;
+
+	_splitpath (StrFileName, Drive, Dir, NULL, NULL);
+
+	// Convert to Unix path name format, escape spaces.
+	t = DirUnix;
+	for (s = Dir; *s; ++s)
+		if (*s == '\\')
+			*t++ = '/';
+		else
+		{
+			if (*s == ' ')
+				*t++ = '\\';
+			*t++ = *s;
+		}
+	*t = '\0';
+
+
+	// Construct the cd command; append /.. if cd to parent
+	// directory and not in root directory
+	OLECHAR Buf[MAX_OLE_STR];
+	char VimCmd[MAX_OLE_STR];
+
+	sprintf (VimCmd, ":cd %s%s%s\n", Drive, DirUnix,
+		 g_ChangeDir == CD_SOURCE_PARENT && DirUnix[1] ? ".." : "");
+	VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf));
+}
+
+#ifdef _DEBUG
+// Print out a debug message
+//
+static void DebugMsg (char* Msg, char* Arg)
+{
+	char Buf[400];
+	sprintf (Buf, Msg, Arg);
+	AfxMessageBox (Buf);
+}
+#endif
+
diff --git a/src/VisVim/Commands.h b/src/VisVim/Commands.h
new file mode 100644
index 0000000..e47c81a
--- /dev/null
+++ b/src/VisVim/Commands.h
@@ -0,0 +1,127 @@
+// Commands.h : header file
+//
+
+#if !defined(AFX_COMMANDS_H__AC726717_2977_11D1_B2F3_006008040780__INCLUDED_)
+#define AFX_COMMANDS_H__AC726717_2977_11D1_B2F3_006008040780__INCLUDED_
+
+#include "vsvtypes.h"
+
+class CCommands :
+	public   CComDualImpl < ICommands,
+				 &IID_ICommands,
+				 &LIBID_VisVim >,
+	public   CComObjectRoot,
+	public   CComCoClass < CCommands,
+				 &CLSID_Commands >
+{
+    protected:
+	IApplication * m_pApplication;
+
+    public:
+	CCommands ();
+	~CCommands ();
+	void SetApplicationObject (IApplication * m_pApplication);
+	IApplication *GetApplicationObject ()
+	{
+		return m_pApplication;
+	}
+	void UnadviseFromEvents ();
+
+	BEGIN_COM_MAP (CCommands)
+	COM_INTERFACE_ENTRY (IDispatch)
+	COM_INTERFACE_ENTRY (ICommands)
+	END_COM_MAP ()
+	DECLARE_NOT_AGGREGATABLE (CCommands)
+
+    protected:
+	// This class template is used as the base class for the Application
+	// event handler object and the Debugger event handler object,
+	// which are declared below.
+	template < class IEvents,
+		const IID * piidEvents,
+		const GUID * plibid,
+		class XEvents,
+		const CLSID * pClsidEvents >
+		class XEventHandler :
+		public	      CComDualImpl < IEvents,
+			      piidEvents,
+			      plibid >,
+		public	      CComObjectRoot,
+		public	      CComCoClass < XEvents,
+			      pClsidEvents >
+	{
+	    public:
+		BEGIN_COM_MAP (XEvents)
+		COM_INTERFACE_ENTRY (IDispatch)
+		COM_INTERFACE_ENTRY_IID (*piidEvents, IEvents)
+		END_COM_MAP ()
+		DECLARE_NOT_AGGREGATABLE (XEvents)
+		void Connect (IUnknown * pUnk)
+		{
+			VERIFY (SUCCEEDED (AtlAdvise (pUnk, this, *piidEvents,
+						      &m_dwAdvise)));
+		}
+		void Disconnect (IUnknown * pUnk)
+		{
+			AtlUnadvise (pUnk, *piidEvents, m_dwAdvise);
+		}
+
+		CCommands *m_pCommands;
+
+	    protected:
+		DWORD m_dwAdvise;
+	};
+
+	// This object handles events fired by the Application object
+	class XApplicationEvents : public XEventHandler < IApplicationEvents,
+			&IID_IApplicationEvents,
+			&LIBID_VisVim,
+			XApplicationEvents,
+			&CLSID_ApplicationEvents >
+	{
+	    public:
+		// IApplicationEvents methods
+		STDMETHOD (BeforeBuildStart) (THIS);
+		STDMETHOD (BuildFinish) (THIS_ long nNumErrors, long nNumWarnings);
+		STDMETHOD (BeforeApplicationShutDown) (THIS);
+		STDMETHOD (DocumentOpen) (THIS_ IDispatch * theDocument);
+		STDMETHOD (BeforeDocumentClose) (THIS_ IDispatch * theDocument);
+		STDMETHOD (DocumentSave) (THIS_ IDispatch * theDocument);
+		STDMETHOD (NewDocument) (THIS_ IDispatch * theDocument);
+		STDMETHOD (WindowActivate) (THIS_ IDispatch * theWindow);
+		STDMETHOD (WindowDeactivate) (THIS_ IDispatch * theWindow);
+		STDMETHOD (WorkspaceOpen) (THIS);
+		STDMETHOD (WorkspaceClose) (THIS);
+		STDMETHOD (NewWorkspace) (THIS);
+	};
+	typedef CComObject < XApplicationEvents > XApplicationEventsObj;
+	XApplicationEventsObj *m_pApplicationEventsObj;
+
+	// This object handles events fired by the Application object
+	class XDebuggerEvents : public XEventHandler < IDebuggerEvents,
+			&IID_IDebuggerEvents,
+			&LIBID_VisVim,
+			XDebuggerEvents,
+			&CLSID_DebuggerEvents >
+	{
+	    public:
+		// IDebuggerEvents method
+		STDMETHOD (BreakpointHit) (THIS_ IDispatch * pBreakpoint);
+	};
+	typedef CComObject < XDebuggerEvents > XDebuggerEventsObj;
+	XDebuggerEventsObj *m_pDebuggerEventsObj;
+
+    public:
+	// ICommands methods
+	STDMETHOD (VisVimDialog) (THIS);
+	STDMETHOD (VisVimEnable) (THIS);
+	STDMETHOD (VisVimDisable) (THIS);
+	STDMETHOD (VisVimToggle) (THIS);
+	STDMETHOD (VisVimLoad) (THIS);
+};
+
+typedef CComObject < CCommands > CCommandsObj;
+
+//{{AFX_INSERT_LOCATION}}
+
+#endif // !defined(AFX_COMMANDS_H__AC726717_2977_11D1_B2F3_006008040780__INCLUDED)
diff --git a/src/VisVim/DSAddIn.cpp b/src/VisVim/DSAddIn.cpp
new file mode 100644
index 0000000..3e72544
--- /dev/null
+++ b/src/VisVim/DSAddIn.cpp
@@ -0,0 +1,160 @@
+#include "stdafx.h"
+#include "VisVim.h"
+#include "DSAddIn.h"
+#include "Commands.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+
+#endif
+
+// This is called when the user first loads the add-in, and on start-up
+//  of each subsequent Developer Studio session
+STDMETHODIMP CDSAddIn::OnConnection (IApplication * pApp, VARIANT_BOOL bFirstTime,
+				     long dwCookie, VARIANT_BOOL * OnConnection)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	*OnConnection = VARIANT_FALSE;
+
+	// Store info passed to us
+	IApplication *pApplication = NULL;
+	HRESULT hr;
+
+	hr = pApp->QueryInterface (IID_IApplication, (void **) &pApplication);
+	if (FAILED (hr))
+	{
+		ReportLastError (hr);
+		return E_UNEXPECTED;
+	}
+	if (pApplication == NULL)
+	{
+		ReportInternalError ("IApplication::QueryInterface");
+		return E_UNEXPECTED;
+	}
+
+	m_dwCookie = dwCookie;
+
+	// Create command dispatch, send info back to DevStudio
+	CCommandsObj::CreateInstance (&m_pCommands);
+	if (! m_pCommands)
+	{
+		ReportInternalError ("CCommandsObj::CreateInstance");
+		return E_UNEXPECTED;
+	}
+	m_pCommands->AddRef ();
+
+	// The QueryInterface above AddRef'd the Application object.  It will
+	// be Release'd in CCommand's destructor.
+	m_pCommands->SetApplicationObject (pApplication);
+
+	hr = pApplication->SetAddInInfo ((long) AfxGetInstanceHandle (),
+		(LPDISPATCH) m_pCommands, IDR_TOOLBAR_MEDIUM, IDR_TOOLBAR_LARGE,
+		m_dwCookie);
+	if (FAILED (hr))
+	{
+		ReportLastError (hr);
+		return E_UNEXPECTED;
+	}
+
+	// Inform DevStudio of the commands we implement
+	if (! AddCommand (pApplication, "VisVimDialog", "VisVimDialogCmd",
+			  IDS_CMD_DIALOG, 0, bFirstTime))
+		return E_UNEXPECTED;
+	if (! AddCommand (pApplication, "VisVimEnable", "VisVimEnableCmd",
+			  IDS_CMD_ENABLE, 1, bFirstTime))
+		return E_UNEXPECTED;
+	if (! AddCommand (pApplication, "VisVimDisable", "VisVimDisableCmd",
+			  IDS_CMD_DISABLE, 2, bFirstTime))
+		return E_UNEXPECTED;
+	if (! AddCommand (pApplication, "VisVimToggle", "VisVimToggleCmd",
+			  IDS_CMD_TOGGLE, 3, bFirstTime))
+		return E_UNEXPECTED;
+	if (! AddCommand (pApplication, "VisVimLoad", "VisVimLoadCmd",
+			  IDS_CMD_LOAD, 4, bFirstTime))
+		return E_UNEXPECTED;
+
+	*OnConnection = VARIANT_TRUE;
+	return S_OK;
+}
+
+// This is called on shut-down, and also when the user unloads the add-in
+STDMETHODIMP CDSAddIn::OnDisconnection (VARIANT_BOOL bLastTime)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+
+	m_pCommands->UnadviseFromEvents ();
+	m_pCommands->Release ();
+	m_pCommands = NULL;
+
+	return S_OK;
+}
+
+// Add a command to DevStudio
+// Creates a toolbar button for the command also.
+// 'MethodName' is the name of the methode specified in the .odl file
+// 'StrResId' the resource id of the descriptive string
+// 'GlyphIndex' the image index into the command buttons bitmap
+// Return true on success
+//
+bool CDSAddIn::AddCommand (IApplication* pApp, char* MethodName, char* CmdName,
+			   UINT StrResId, UINT GlyphIndex, VARIANT_BOOL bFirstTime)
+{
+	CString CmdString;
+	CString CmdText;
+
+	CmdText.LoadString (StrResId);
+	CmdString = CmdName;
+	CmdString += CmdText;
+
+	CComBSTR bszCmdString (CmdString);
+	CComBSTR bszMethod (MethodName);
+	CComBSTR bszCmdName (CmdName);
+
+	// (see stdafx.h for the definition of VERIFY_OK)
+
+	VARIANT_BOOL bRet;
+	VERIFY_OK (pApp->AddCommand (bszCmdString, bszMethod, GlyphIndex,
+				     m_dwCookie, &bRet));
+	if (bRet == VARIANT_FALSE)
+	{
+		// AddCommand failed because a command with this name already exists.
+		ReportInternalError ("IApplication::AddCommand");
+		return FALSE;
+	}
+
+	// Add toolbar buttons only if this is the first time the add-in
+	// is being loaded.  Toolbar buttons are automatically remembered
+	// by Developer Studio from session to session, so we should only
+	// add the toolbar buttons once.
+	if (bFirstTime == VARIANT_TRUE)
+		VERIFY_OK (pApp->AddCommandBarButton (dsGlyph, bszCmdName, m_dwCookie));
+
+	return TRUE;
+}
+
+void ReportLastError (HRESULT Err)
+{
+	char *Buf = NULL;
+	char Msg[512];
+
+	FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
+		       NULL, Err,
+		       MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
+		       Buf, 400, NULL);
+	sprintf (Msg, "Unexpected error (Error code: %lx)\n%s", Err, Buf);
+
+	::MessageBox (NULL, Msg, "VisVim", MB_OK | MB_ICONSTOP);
+	if (Buf)
+		LocalFree (Buf);
+}
+
+void ReportInternalError (char* Fct)
+{
+	char Msg[512];
+
+	sprintf (Msg, "Unexpected error\n%s failed", Fct);
+	::MessageBox (NULL, Msg, "VisVim", MB_OK | MB_ICONSTOP);
+}
+
diff --git a/src/VisVim/DSAddIn.h b/src/VisVim/DSAddIn.h
new file mode 100644
index 0000000..7282872
--- /dev/null
+++ b/src/VisVim/DSAddIn.h
@@ -0,0 +1,53 @@
+// DSAddIn.h : header file
+//
+
+#if !defined(AFX_DSADDIN_H__AC726715_2977_11D1_B2F3_006008040780__INCLUDED_)
+#define AFX_DSADDIN_H__AC726715_2977_11D1_B2F3_006008040780__INCLUDED_
+
+#include "commands.h"
+
+// {4F9E01C0-406B-11d2-8006-00001C405077}
+DEFINE_GUID (CLSID_DSAddIn,
+	0x4f9e01c0, 0x406b, 0x11d2, 0x80, 0x6, 0x0, 0x0, 0x1c, 0x40, 0x50, 0x77);
+
+/////////////////////////////////////////////////////////////////////////////
+// CDSAddIn
+
+class CDSAddIn :
+	public   IDSAddIn,
+	public   CComObjectRoot,
+	public   CComCoClass < CDSAddIn,
+		 &CLSID_DSAddIn >
+{
+    public:
+	DECLARE_REGISTRY (CDSAddIn, "VisVim.DSAddIn.1",
+			  "VisVim Developer Studio Add-in", IDS_VISVIM_LONGNAME,
+			  THREADFLAGS_BOTH)
+
+	CDSAddIn ()
+	{
+	}
+
+	BEGIN_COM_MAP (CDSAddIn)
+	COM_INTERFACE_ENTRY (IDSAddIn)
+	END_COM_MAP ()
+	DECLARE_NOT_AGGREGATABLE (CDSAddIn)
+
+	// IDSAddIns
+    public:
+	STDMETHOD (OnConnection) (THIS_ IApplication * pApp, VARIANT_BOOL bFirstTime,
+				  long dwCookie, VARIANT_BOOL * OnConnection);
+	STDMETHOD (OnDisconnection) (THIS_ VARIANT_BOOL bLastTime);
+
+    protected:
+	bool AddCommand (IApplication* pApp, char* MethodName, char* CmdName,
+			 UINT StrResId, UINT GlyphIndex, VARIANT_BOOL bFirstTime);
+
+    protected:
+	CCommandsObj * m_pCommands;
+	DWORD m_dwCookie;
+};
+
+//{{AFX_INSERT_LOCATION}}
+
+#endif // !defined(AFX_DSADDIN_H__AC726715_2977_11D1_B2F3_006008040780__INCLUDED)
diff --git a/src/VisVim/OleAut.cpp b/src/VisVim/OleAut.cpp
new file mode 100644
index 0000000..0e01b1e
--- /dev/null
+++ b/src/VisVim/OleAut.cpp
@@ -0,0 +1,781 @@
+//
+// Class for creating OLE automation controllers.
+//
+// CreateObject() creates an automation object
+// Invoke() will call a property or method of the automation object.
+// GetProperty() returns a property
+// SetProperty() changes a property
+// Method() invokes a method
+//
+// For example, the following VB code will control Microsoft Word:
+//
+//    Private Sub Form_Load()
+//    Dim wb As Object
+//    Set wb = CreateObject("Word.Basic")
+//    wb.AppShow
+//    wb.FileNewDefault
+//    wb.Insert "This is a test"
+//    wb.FileSaveAs "c:\sample.doc)"
+//    End Sub
+//
+// A C++ automation controller that does the same can be written as follows:
+// the helper functions:
+//
+//   Void FormLoad ()
+//   {
+//       COleAutomationControl Aut;
+//       Aut.CreateObject("Word.Basic");
+//       Aut.Method ("AppShow");
+//       Aut.Method ("FileNewDefault");
+//       Aut.Method ("Insert", "s", (LPOLESTR) OLESTR ("This is a test"));
+//       Aut.Method ("FileSaveAs", "s", OLESTR ("c:\\sample.doc"));
+//   }
+//
+//
+
+#include "stdafx.h"
+#include <stdarg.h>
+#include "oleaut.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+
+static bool CountArgsInFormat (LPCTSTR Format, UINT* nArgs);
+static LPCTSTR GetNextVarType (LPCTSTR Format, VARTYPE* pVarType);
+
+
+COleAutomationControl::COleAutomationControl ()
+{
+	m_pDispatch = NULL;
+	m_hResult = NOERROR;
+	m_nErrArg = 0;
+	VariantInit (&m_VariantResult);
+}
+
+COleAutomationControl::~COleAutomationControl ()
+{
+	DeleteObject ();
+}
+
+void COleAutomationControl::DeleteObject ()
+{
+	if (m_pDispatch)
+	{
+		m_pDispatch->Release ();
+		m_pDispatch = NULL;
+	}
+}
+
+// Creates an instance of the Automation object and
+// obtains it's IDispatch interface.
+//
+// Parameters:
+// ProgId	  ProgID of Automation object
+//
+bool COleAutomationControl::CreateObject (char* ProgId)
+{
+	CLSID ClsId;			// CLSID of automation object
+	LPUNKNOWN pUnknown = NULL;	// IUnknown of automation object
+
+	// Retrieve CLSID from the progID that the user specified
+	LPOLESTR OleProgId = TO_OLE_STR (ProgId);
+	m_hResult = CLSIDFromProgID (OleProgId, &ClsId);
+	if (FAILED (m_hResult))
+		goto error;
+
+	// Create an instance of the automation object and ask for the
+	// IDispatch interface
+	m_hResult = CoCreateInstance (ClsId, NULL, CLSCTX_SERVER,
+			       IID_IUnknown, (void**) &pUnknown);
+	if (FAILED (m_hResult))
+		goto error;
+
+	m_hResult = pUnknown->QueryInterface (IID_IDispatch, (void**) &m_pDispatch);
+	if (FAILED (m_hResult))
+		goto error;
+
+	pUnknown->Release ();
+	return true;
+
+error:
+	if (pUnknown)
+		pUnknown->Release ();
+	if (m_pDispatch)
+		m_pDispatch->Release ();
+	return false;
+}
+
+// Return the dispatch id of a named service
+// This id can be used in subsequent calls to GetProperty (), SetProperty () and
+// Method (). This is the prefered method when performance is important.
+//
+DISPID COleAutomationControl::GetDispatchId (char* Name)
+{
+	DISPID DispatchId;
+
+	ASSERT (m_pDispatch);
+
+	// Get DISPID of property/method
+	LPOLESTR OleName = TO_OLE_STR (Name);
+	m_hResult = m_pDispatch->GetIDsOfNames (IID_NULL, &OleName, 1,
+						LOCALE_USER_DEFAULT, &DispatchId);
+	if (FAILED (m_hResult))
+		return NULL;
+	return DispatchId;
+}
+
+//  The following functions use these parameters:
+//
+// Parameters:
+//
+//  Name      Name of property or method.
+//
+//  Format    Format string that describes the variable list of parameters that
+//	      follows. The format string can contain the follwoing characters.
+//	      & = mark the following format character as VT_BYREF
+//	      B = VT_BOOL
+//	      i = VT_I2
+//	      I = VT_I4
+//	      r = VT_R2
+//	      R = VT_R4
+//	      c = VT_CY
+//	      s = VT_BSTR (string pointer can be passed,
+//			BSTR will be allocated by this function).
+//	      e = VT_ERROR
+//	      d = VT_DATE
+//	      v = VT_VARIANT. Use this to pass data types that are not described
+//			in the format string. (For example SafeArrays).
+//	      D = VT_DISPATCH
+//	      U = VT_UNKNOWN
+//
+//  ...       Arguments of the property or method.
+//	      Arguments are described by Format.
+//
+
+bool COleAutomationControl::GetProperty (char* Name)
+{
+	return Invoke (DISPATCH_PROPERTYGET, Name, NULL, NULL);
+}
+
+bool COleAutomationControl::GetProperty (DISPID DispatchId)
+{
+	return Invoke (DISPATCH_PROPERTYGET, DispatchId, NULL, NULL);
+}
+
+bool COleAutomationControl::PutProperty (char* Name, LPCTSTR Format, ...)
+{
+	va_list ArgList;
+
+	va_start (ArgList, Format);
+	bool bRet = Invoke (DISPATCH_PROPERTYPUT, Name, Format, ArgList);
+	va_end (ArgList);
+	return bRet;
+}
+
+bool COleAutomationControl::PutProperty (DISPID DispatchId, LPCTSTR Format, ...)
+{
+	va_list ArgList;
+
+	va_start (ArgList, Format);
+	bool bRet = Invoke (DISPATCH_PROPERTYPUT, DispatchId, Format, ArgList);
+	va_end (ArgList);
+	return bRet;
+}
+
+bool COleAutomationControl::Method (char* Name, LPCTSTR Format, ...)
+{
+	va_list ArgList;
+
+	va_start (ArgList, Format);
+	bool bRet = Invoke (DISPATCH_METHOD, Name, Format, ArgList);
+	va_end (ArgList);
+	return bRet;
+}
+
+bool COleAutomationControl::Method (DISPID DispatchId, LPCTSTR Format, ...)
+{
+	va_list ArgList;
+
+	va_start (ArgList, Format);
+	bool bRet = Invoke (DISPATCH_METHOD, DispatchId, Format, ArgList);
+	va_end (ArgList);
+	return bRet;
+}
+
+bool COleAutomationControl::Invoke (WORD Flags, char* Name,
+				    LPCTSTR Format, va_list ArgList)
+{
+	DISPID DispatchId = GetDispatchId (Name);
+	if (! DispatchId)
+		return false;
+	return Invoke (Flags, DispatchId, Format, ArgList);
+}
+
+bool COleAutomationControl::Invoke (WORD Flags, DISPID DispatchId,
+				    LPCTSTR Format, va_list ArgList)
+{
+	UINT ArgCount = 0;
+	VARIANTARG* ArgVector = NULL;
+
+	ASSERT (m_pDispatch);
+
+	DISPPARAMS DispatchParams;
+	memset (&DispatchParams, 0, sizeof (DispatchParams));
+
+	// Determine number of arguments
+	if (Format)
+		CountArgsInFormat (Format, &ArgCount);
+
+	// Property puts have a named argument that represents the value that
+	// the property is being assigned.
+	DISPID DispIdNamed = DISPID_PROPERTYPUT;
+	if (Flags & DISPATCH_PROPERTYPUT)
+	{
+		if (ArgCount == 0)
+		{
+			m_hResult = ResultFromScode (E_INVALIDARG);
+			return false;
+		}
+		DispatchParams.cNamedArgs = 1;
+		DispatchParams.rgdispidNamedArgs = &DispIdNamed;
+	}
+
+	if (ArgCount)
+	{
+		// Allocate memory for all VARIANTARG parameters
+		ArgVector = (VARIANTARG*) CoTaskMemAlloc (
+				ArgCount * sizeof (VARIANTARG));
+		if (! ArgVector)
+		{
+			m_hResult = ResultFromScode (E_OUTOFMEMORY);
+			return false;
+		}
+		memset (ArgVector, 0, sizeof (VARIANTARG) * ArgCount);
+
+		// Get ready to walk vararg list
+		LPCTSTR s = Format;
+
+		VARIANTARG *p = ArgVector + ArgCount - 1;  // Params go in opposite order
+
+		for (;;)
+		{
+			VariantInit (p);
+			if (! (s = GetNextVarType (s, &p->vt)))
+				break;
+
+			if (p < ArgVector)
+			{
+				m_hResult = ResultFromScode (E_INVALIDARG);
+				goto Cleanup;
+			}
+			switch (p->vt)
+			{
+			    case VT_I2:
+				V_I2 (p) = va_arg (ArgList, short);
+				break;
+			    case VT_I4:
+				V_I4 (p) = va_arg (ArgList, long);
+				break;
+			    case VT_R4:
+				V_R4 (p) = va_arg (ArgList, float);
+				break;
+			    case VT_DATE:
+			    case VT_R8:
+				V_R8 (p) = va_arg (ArgList, double);
+				break;
+			    case VT_CY:
+				V_CY (p) = va_arg (ArgList, CY);
+				break;
+			    case VT_BSTR:
+				V_BSTR (p) = SysAllocString (va_arg (ArgList,
+								     OLECHAR*));
+				if (! p->bstrVal)
+				{
+					m_hResult = ResultFromScode (E_OUTOFMEMORY);
+					p->vt = VT_EMPTY;
+					goto Cleanup;
+				}
+				break;
+			    case VT_DISPATCH:
+				V_DISPATCH (p) = va_arg (ArgList, LPDISPATCH);
+				break;
+			    case VT_ERROR:
+				V_ERROR (p) = va_arg (ArgList, SCODE);
+				break;
+			    case VT_BOOL:
+				V_BOOL (p) = va_arg (ArgList, BOOL) ? -1 : 0;
+				break;
+			    case VT_VARIANT:
+				*p = va_arg (ArgList, VARIANTARG);
+				break;
+			    case VT_UNKNOWN:
+				V_UNKNOWN (p) = va_arg (ArgList, LPUNKNOWN);
+				break;
+
+			    case VT_I2 | VT_BYREF:
+				V_I2REF (p) = va_arg (ArgList, short*);
+				break;
+			    case VT_I4 | VT_BYREF:
+				V_I4REF (p) = va_arg (ArgList, long*);
+				break;
+			    case VT_R4 | VT_BYREF:
+				V_R4REF (p) = va_arg (ArgList, float*);
+				break;
+			    case VT_R8 | VT_BYREF:
+				V_R8REF (p) = va_arg (ArgList, double*);
+				break;
+			    case VT_DATE | VT_BYREF:
+				V_DATEREF (p) = va_arg (ArgList, DATE*);
+				break;
+			    case VT_CY | VT_BYREF:
+				V_CYREF (p) = va_arg (ArgList, CY*);
+				break;
+			    case VT_BSTR | VT_BYREF:
+				V_BSTRREF (p) = va_arg (ArgList, BSTR*);
+				break;
+			    case VT_DISPATCH | VT_BYREF:
+				V_DISPATCHREF (p) = va_arg (ArgList, LPDISPATCH*);
+				break;
+			    case VT_ERROR | VT_BYREF:
+				V_ERRORREF (p) = va_arg (ArgList, SCODE*);
+				break;
+			    case VT_BOOL | VT_BYREF:
+				{
+					BOOL* pBool = va_arg (ArgList, BOOL*);
+
+					*pBool = 0;
+					V_BOOLREF (p) = (VARIANT_BOOL*) pBool;
+				}
+				break;
+			    case VT_VARIANT | VT_BYREF:
+				V_VARIANTREF (p) = va_arg (ArgList, VARIANTARG*);
+				break;
+			    case VT_UNKNOWN | VT_BYREF:
+				V_UNKNOWNREF (p) = va_arg (ArgList, LPUNKNOWN*);
+				break;
+
+			    default:
+				{
+					m_hResult = ResultFromScode (E_INVALIDARG);
+					goto Cleanup;
+				}
+				break;
+			}
+
+			--p;	// Get ready to fill next argument
+		}
+	}
+
+	DispatchParams.cArgs = ArgCount;
+	DispatchParams.rgvarg = ArgVector;
+
+	// Initialize return variant, in case caller forgot. Caller can pass
+	// NULL if return value is not expected.
+	VariantInit (&m_VariantResult);
+
+	// Make the call
+	m_hResult = m_pDispatch->Invoke (DispatchId, IID_NULL, LOCALE_USER_DEFAULT,
+					 Flags, &DispatchParams, &m_VariantResult,
+					 &m_ExceptionInfo, &m_nErrArg);
+
+    Cleanup:
+	// Cleanup any arguments that need cleanup
+	if (ArgCount)
+	{
+		VARIANTARG* p = ArgVector;
+
+		while (ArgCount--)
+		{
+			switch (p->vt)
+			{
+			    case VT_BSTR:
+				VariantClear (p);
+				break;
+			}
+			++p;
+		}
+		CoTaskMemFree (ArgVector);
+	}
+
+	return FAILED (m_hResult) ? false : true;
+}
+
+#define CASE_SCODE(sc)  \
+	case sc: \
+	lstrcpy((char*)ErrName, (char*)#sc); \
+	break;
+
+void COleAutomationControl::ErrDiag ()
+{
+	char ErrName[200];
+
+	SCODE sc = GetScode (m_hResult);
+	switch (sc)
+	{
+	    // SCODE's defined in SCODE.H
+	    CASE_SCODE (S_OK)
+	    CASE_SCODE (S_FALSE)
+	    CASE_SCODE (E_UNEXPECTED)
+	    CASE_SCODE (E_OUTOFMEMORY)
+	    CASE_SCODE (E_INVALIDARG)
+	    CASE_SCODE (E_NOINTERFACE)
+	    CASE_SCODE (E_POINTER)
+	    CASE_SCODE (E_HANDLE)
+	    CASE_SCODE (E_ABORT)
+	    CASE_SCODE (E_FAIL)
+	    CASE_SCODE (E_ACCESSDENIED)
+
+	    // SCODE's defined in OLE2.H
+	    CASE_SCODE (OLE_E_OLEVERB)
+	    CASE_SCODE (OLE_E_ADVF)
+	    CASE_SCODE (OLE_E_ENUM_NOMORE)
+	    CASE_SCODE (OLE_E_ADVISENOTSUPPORTED)
+	    CASE_SCODE (OLE_E_NOCONNECTION)
+	    CASE_SCODE (OLE_E_NOTRUNNING)
+	    CASE_SCODE (OLE_E_NOCACHE)
+	    CASE_SCODE (OLE_E_BLANK)
+	    CASE_SCODE (OLE_E_CLASSDIFF)
+	    CASE_SCODE (OLE_E_CANT_GETMONIKER)
+	    CASE_SCODE (OLE_E_CANT_BINDTOSOURCE)
+	    CASE_SCODE (OLE_E_STATIC)
+	    CASE_SCODE (OLE_E_PROMPTSAVECANCELLED)
+	    CASE_SCODE (OLE_E_INVALIDRECT)
+	    CASE_SCODE (OLE_E_WRONGCOMPOBJ)
+	    CASE_SCODE (OLE_E_INVALIDHWND)
+	    CASE_SCODE (OLE_E_NOT_INPLACEACTIVE)
+	    CASE_SCODE (OLE_E_CANTCONVERT)
+	    CASE_SCODE (OLE_E_NOSTORAGE)
+
+	    CASE_SCODE (DV_E_FORMATETC)
+	    CASE_SCODE (DV_E_DVTARGETDEVICE)
+	    CASE_SCODE (DV_E_STGMEDIUM)
+	    CASE_SCODE (DV_E_STATDATA)
+	    CASE_SCODE (DV_E_LINDEX)
+	    CASE_SCODE (DV_E_TYMED)
+	    CASE_SCODE (DV_E_CLIPFORMAT)
+	    CASE_SCODE (DV_E_DVASPECT)
+	    CASE_SCODE (DV_E_DVTARGETDEVICE_SIZE)
+	    CASE_SCODE (DV_E_NOIVIEWOBJECT)
+
+	    CASE_SCODE (OLE_S_USEREG)
+	    CASE_SCODE (OLE_S_STATIC)
+	    CASE_SCODE (OLE_S_MAC_CLIPFORMAT)
+
+	    CASE_SCODE (CONVERT10_E_OLESTREAM_GET)
+	    CASE_SCODE (CONVERT10_E_OLESTREAM_PUT)
+	    CASE_SCODE (CONVERT10_E_OLESTREAM_FMT)
+	    CASE_SCODE (CONVERT10_E_OLESTREAM_BITMAP_TO_DIB)
+	    CASE_SCODE (CONVERT10_E_STG_FMT)
+	    CASE_SCODE (CONVERT10_E_STG_NO_STD_STREAM)
+	    CASE_SCODE (CONVERT10_E_STG_DIB_TO_BITMAP)
+	    CASE_SCODE (CONVERT10_S_NO_PRESENTATION)
+
+	    CASE_SCODE (CLIPBRD_E_CANT_OPEN)
+	    CASE_SCODE (CLIPBRD_E_CANT_EMPTY)
+	    CASE_SCODE (CLIPBRD_E_CANT_SET)
+	    CASE_SCODE (CLIPBRD_E_BAD_DATA)
+	    CASE_SCODE (CLIPBRD_E_CANT_CLOSE)
+
+	    CASE_SCODE (DRAGDROP_E_NOTREGISTERED)
+	    CASE_SCODE (DRAGDROP_E_ALREADYREGISTERED)
+	    CASE_SCODE (DRAGDROP_E_INVALIDHWND)
+	    CASE_SCODE (DRAGDROP_S_DROP)
+	    CASE_SCODE (DRAGDROP_S_CANCEL)
+	    CASE_SCODE (DRAGDROP_S_USEDEFAULTCURSORS)
+
+	    CASE_SCODE (OLEOBJ_E_NOVERBS)
+	    CASE_SCODE (OLEOBJ_E_INVALIDVERB)
+	    CASE_SCODE (OLEOBJ_S_INVALIDVERB)
+	    CASE_SCODE (OLEOBJ_S_CANNOT_DOVERB_NOW)
+	    CASE_SCODE (OLEOBJ_S_INVALIDHWND)
+	    CASE_SCODE (INPLACE_E_NOTUNDOABLE)
+	    CASE_SCODE (INPLACE_E_NOTOOLSPACE)
+	    CASE_SCODE (INPLACE_S_TRUNCATED)
+
+	    // SCODE's defined in COMPOBJ.H
+	    CASE_SCODE (CO_E_NOTINITIALIZED)
+	    CASE_SCODE (CO_E_ALREADYINITIALIZED)
+	    CASE_SCODE (CO_E_CANTDETERMINECLASS)
+	    CASE_SCODE (CO_E_CLASSSTRING)
+	    CASE_SCODE (CO_E_IIDSTRING)
+	    CASE_SCODE (CO_E_APPNOTFOUND)
+	    CASE_SCODE (CO_E_APPSINGLEUSE)
+	    CASE_SCODE (CO_E_ERRORINAPP)
+	    CASE_SCODE (CO_E_DLLNOTFOUND)
+	    CASE_SCODE (CO_E_ERRORINDLL)
+	    CASE_SCODE (CO_E_WRONGOSFORAPP)
+	    CASE_SCODE (CO_E_OBJNOTREG)
+	    CASE_SCODE (CO_E_OBJISREG)
+	    CASE_SCODE (CO_E_OBJNOTCONNECTED)
+	    CASE_SCODE (CO_E_APPDIDNTREG)
+	    CASE_SCODE (CLASS_E_NOAGGREGATION)
+	    CASE_SCODE (CLASS_E_CLASSNOTAVAILABLE)
+	    CASE_SCODE (REGDB_E_READREGDB)
+	    CASE_SCODE (REGDB_E_WRITEREGDB)
+	    CASE_SCODE (REGDB_E_KEYMISSING)
+	    CASE_SCODE (REGDB_E_INVALIDVALUE)
+	    CASE_SCODE (REGDB_E_CLASSNOTREG)
+	    CASE_SCODE (REGDB_E_IIDNOTREG)
+	    CASE_SCODE (RPC_E_CALL_REJECTED)
+	    CASE_SCODE (RPC_E_CALL_CANCELED)
+	    CASE_SCODE (RPC_E_CANTPOST_INSENDCALL)
+	    CASE_SCODE (RPC_E_CANTCALLOUT_INASYNCCALL)
+	    CASE_SCODE (RPC_E_CANTCALLOUT_INEXTERNALCALL)
+	    CASE_SCODE (RPC_E_CONNECTION_TERMINATED)
+	    CASE_SCODE (RPC_E_SERVER_DIED)
+	    CASE_SCODE (RPC_E_CLIENT_DIED)
+	    CASE_SCODE (RPC_E_INVALID_DATAPACKET)
+	    CASE_SCODE (RPC_E_CANTTRANSMIT_CALL)
+	    CASE_SCODE (RPC_E_CLIENT_CANTMARSHAL_DATA)
+	    CASE_SCODE (RPC_E_CLIENT_CANTUNMARSHAL_DATA)
+	    CASE_SCODE (RPC_E_SERVER_CANTMARSHAL_DATA)
+	    CASE_SCODE (RPC_E_SERVER_CANTUNMARSHAL_DATA)
+	    CASE_SCODE (RPC_E_INVALID_DATA)
+	    CASE_SCODE (RPC_E_INVALID_PARAMETER)
+	    CASE_SCODE (RPC_E_CANTCALLOUT_AGAIN)
+	    CASE_SCODE (RPC_E_UNEXPECTED)
+
+	    // SCODE's defined in DVOBJ.H
+	    CASE_SCODE (DATA_S_SAMEFORMATETC)
+	    CASE_SCODE (VIEW_E_DRAW)
+	    CASE_SCODE (VIEW_S_ALREADY_FROZEN)
+	    CASE_SCODE (CACHE_E_NOCACHE_UPDATED)
+	    CASE_SCODE (CACHE_S_FORMATETC_NOTSUPPORTED)
+	    CASE_SCODE (CACHE_S_SAMECACHE)
+	    CASE_SCODE (CACHE_S_SOMECACHES_NOTUPDATED)
+
+	    // SCODE's defined in STORAGE.H
+	    CASE_SCODE (STG_E_INVALIDFUNCTION)
+	    CASE_SCODE (STG_E_FILENOTFOUND)
+	    CASE_SCODE (STG_E_PATHNOTFOUND)
+	    CASE_SCODE (STG_E_TOOMANYOPENFILES)
+	    CASE_SCODE (STG_E_ACCESSDENIED)
+	    CASE_SCODE (STG_E_INVALIDHANDLE)
+	    CASE_SCODE (STG_E_INSUFFICIENTMEMORY)
+	    CASE_SCODE (STG_E_INVALIDPOINTER)
+	    CASE_SCODE (STG_E_NOMOREFILES)
+	    CASE_SCODE (STG_E_DISKISWRITEPROTECTED)
+	    CASE_SCODE (STG_E_SEEKERROR)
+	    CASE_SCODE (STG_E_WRITEFAULT)
+	    CASE_SCODE (STG_E_READFAULT)
+	    CASE_SCODE (STG_E_SHAREVIOLATION)
+	    CASE_SCODE (STG_E_LOCKVIOLATION)
+	    CASE_SCODE (STG_E_FILEALREADYEXISTS)
+	    CASE_SCODE (STG_E_INVALIDPARAMETER)
+	    CASE_SCODE (STG_E_MEDIUMFULL)
+	    CASE_SCODE (STG_E_ABNORMALAPIEXIT)
+	    CASE_SCODE (STG_E_INVALIDHEADER)
+	    CASE_SCODE (STG_E_INVALIDNAME)
+	    CASE_SCODE (STG_E_UNKNOWN)
+	    CASE_SCODE (STG_E_UNIMPLEMENTEDFUNCTION)
+	    CASE_SCODE (STG_E_INVALIDFLAG)
+	    CASE_SCODE (STG_E_INUSE)
+	    CASE_SCODE (STG_E_NOTCURRENT)
+	    CASE_SCODE (STG_E_REVERTED)
+	    CASE_SCODE (STG_E_CANTSAVE)
+	    CASE_SCODE (STG_E_OLDFORMAT)
+	    CASE_SCODE (STG_E_OLDDLL)
+	    CASE_SCODE (STG_E_SHAREREQUIRED)
+	    CASE_SCODE (STG_E_NOTFILEBASEDSTORAGE)
+	    CASE_SCODE (STG_E_EXTANTMARSHALLINGS)
+	    CASE_SCODE (STG_S_CONVERTED)
+
+	    // SCODE's defined in STORAGE.H
+	    CASE_SCODE (MK_E_CONNECTMANUALLY)
+	    CASE_SCODE (MK_E_EXCEEDEDDEADLINE)
+	    CASE_SCODE (MK_E_NEEDGENERIC)
+	    CASE_SCODE (MK_E_UNAVAILABLE)
+	    CASE_SCODE (MK_E_SYNTAX)
+	    CASE_SCODE (MK_E_NOOBJECT)
+	    CASE_SCODE (MK_E_INVALIDEXTENSION)
+	    CASE_SCODE (MK_E_INTERMEDIATEINTERFACENOTSUPPORTED)
+	    CASE_SCODE (MK_E_NOTBINDABLE)
+	    CASE_SCODE (MK_E_NOTBOUND)
+	    CASE_SCODE (MK_E_CANTOPENFILE)
+	    CASE_SCODE (MK_E_MUSTBOTHERUSER)
+	    CASE_SCODE (MK_E_NOINVERSE)
+	    CASE_SCODE (MK_E_NOSTORAGE)
+	    CASE_SCODE (MK_E_NOPREFIX)
+	    CASE_SCODE (MK_S_REDUCED_TO_SELF)
+	    CASE_SCODE (MK_S_ME)
+	    CASE_SCODE (MK_S_HIM)
+	    CASE_SCODE (MK_S_US)
+	    CASE_SCODE (MK_S_MONIKERALREADYREGISTERED)
+
+	    // SCODE's defined in DISPATCH.H
+	    CASE_SCODE (DISP_E_UNKNOWNINTERFACE)
+	    CASE_SCODE (DISP_E_MEMBERNOTFOUND)
+	    CASE_SCODE (DISP_E_PARAMNOTFOUND)
+	    CASE_SCODE (DISP_E_TYPEMISMATCH)
+	    CASE_SCODE (DISP_E_UNKNOWNNAME)
+	    CASE_SCODE (DISP_E_NONAMEDARGS)
+	    CASE_SCODE (DISP_E_BADVARTYPE)
+	    CASE_SCODE (DISP_E_EXCEPTION)
+	    CASE_SCODE (DISP_E_OVERFLOW)
+	    CASE_SCODE (DISP_E_BADINDEX)
+	    CASE_SCODE (DISP_E_UNKNOWNLCID)
+	    CASE_SCODE (DISP_E_ARRAYISLOCKED)
+	    CASE_SCODE (DISP_E_BADPARAMCOUNT)
+	    CASE_SCODE (DISP_E_PARAMNOTOPTIONAL)
+	    CASE_SCODE (DISP_E_BADCALLEE)
+	    CASE_SCODE (DISP_E_NOTACOLLECTION)
+
+	    CASE_SCODE (TYPE_E_BUFFERTOOSMALL)
+	    CASE_SCODE (TYPE_E_INVDATAREAD)
+	    CASE_SCODE (TYPE_E_UNSUPFORMAT)
+	    CASE_SCODE (TYPE_E_REGISTRYACCESS)
+	    CASE_SCODE (TYPE_E_LIBNOTREGISTERED)
+	    CASE_SCODE (TYPE_E_UNDEFINEDTYPE)
+	    CASE_SCODE (TYPE_E_QUALIFIEDNAMEDISALLOWED)
+	    CASE_SCODE (TYPE_E_INVALIDSTATE)
+	    CASE_SCODE (TYPE_E_WRONGTYPEKIND)
+	    CASE_SCODE (TYPE_E_ELEMENTNOTFOUND)
+	    CASE_SCODE (TYPE_E_AMBIGUOUSNAME)
+	    CASE_SCODE (TYPE_E_NAMECONFLICT)
+	    CASE_SCODE (TYPE_E_UNKNOWNLCID)
+	    CASE_SCODE (TYPE_E_DLLFUNCTIONNOTFOUND)
+	    CASE_SCODE (TYPE_E_BADMODULEKIND)
+	    CASE_SCODE (TYPE_E_SIZETOOBIG)
+	    CASE_SCODE (TYPE_E_DUPLICATEID)
+	    CASE_SCODE (TYPE_E_TYPEMISMATCH)
+	    CASE_SCODE (TYPE_E_OUTOFBOUNDS)
+	    CASE_SCODE (TYPE_E_IOERROR)
+	    CASE_SCODE (TYPE_E_CANTCREATETMPFILE)
+	    CASE_SCODE (TYPE_E_CANTLOADLIBRARY)
+	    CASE_SCODE (TYPE_E_INCONSISTENTPROPFUNCS)
+	    CASE_SCODE (TYPE_E_CIRCULARTYPE)
+
+	    default:
+		lstrcpy (ErrName, "UNKNOWN SCODE");
+	}
+
+	char Buf[256];
+	sprintf (Buf, "An OLE error occured:\r\nCode = %s\r\nResult = %lx.",
+		 (char*) ErrName, m_hResult);
+	MessageBox (NULL, Buf, "OLE Error", MB_OK);
+}
+
+
+static bool CountArgsInFormat (LPCTSTR Format, UINT* pArgCount)
+{
+	*pArgCount = 0;
+
+	if (! Format)
+		return true;
+
+	while (*Format)
+	{
+		if (*Format == '&')
+			Format++;
+
+		switch (*Format)
+		{
+		    case 'b':
+		    case 'i':
+		    case 'I':
+		    case 'r':
+		    case 'R':
+		    case 'c':
+		    case 's':
+		    case 'e':
+		    case 'd':
+		    case 'v':
+		    case 'D':
+		    case 'U':
+			++ (*pArgCount);
+			Format++;
+			break;
+		    case '\0':
+		    default:
+			return false;
+		}
+	}
+	return true;
+}
+
+static LPCTSTR GetNextVarType (LPCTSTR Format, VARTYPE* pVarType)
+{
+	*pVarType = 0;
+	if (*Format == '&')
+	{
+		*pVarType = VT_BYREF;
+		Format++;
+		if (!*Format)
+			return NULL;
+	}
+	switch (*Format)
+	{
+	    case 'b':
+		*pVarType |= VT_BOOL;
+		break;
+	    case 'i':
+		*pVarType |= VT_I2;
+		break;
+	    case 'I':
+		*pVarType |= VT_I4;
+		break;
+	    case 'r':
+		*pVarType |= VT_R4;
+		break;
+	    case 'R':
+		*pVarType |= VT_R8;
+		break;
+	    case 'c':
+		*pVarType |= VT_CY;
+		break;
+	    case 's':
+		*pVarType |= VT_BSTR;
+		break;
+	    case 'e':
+		*pVarType |= VT_ERROR;
+		break;
+	    case 'd':
+		*pVarType |= VT_DATE;
+		break;
+	    case 'v':
+		*pVarType |= VT_VARIANT;
+		break;
+	    case 'U':
+		*pVarType |= VT_UNKNOWN;
+		break;
+	    case 'D':
+		*pVarType |= VT_DISPATCH;
+		break;
+	    case '\0':
+		return NULL;	// End of Format string
+	    default:
+		return NULL;
+	}
+	return ++Format;
+}
+
+#ifndef UNICODE
+char* ConvertToAnsi (OLECHAR* sUnicode)
+{
+	static char BufAscii[MAX_OLE_STR];
+	return ConvertToAnsiBuf (sUnicode, BufAscii);
+}
+
+char* ConvertToAnsiBuf (OLECHAR* sUnicode, char* BufAscii)
+{
+	WideCharToMultiByte (CP_ACP, 0, sUnicode, -1, BufAscii, MAX_OLE_STR, NULL, NULL);
+	return BufAscii;
+}
+
+OLECHAR* ConvertToUnicode (char* sAscii)
+{
+	static OLECHAR BufUnicode[MAX_OLE_STR];
+	return ConvertToUnicodeBuf (sAscii, BufUnicode);
+}
+
+OLECHAR* ConvertToUnicodeBuf (char* sAscii, OLECHAR* BufUnicode)
+{
+	MultiByteToWideChar (CP_ACP, 0, sAscii, -1, BufUnicode, MAX_OLE_STR);
+	return BufUnicode;
+}
+#endif
+
diff --git a/src/VisVim/OleAut.h b/src/VisVim/OleAut.h
new file mode 100644
index 0000000..37de807
--- /dev/null
+++ b/src/VisVim/OleAut.h
@@ -0,0 +1,73 @@
+#ifndef __OLEAUT_H__
+#define __OLEAUT_H__
+
+class COleAutomationControl : public CObject
+{
+    public:
+	COleAutomationControl ();
+	~COleAutomationControl ();
+	bool CreateObject (char* ProgId);
+	DISPID GetDispatchId (char* Name);
+	bool GetProperty (char* Name);
+	bool GetProperty (DISPID DispatchId);
+	bool PutProperty (char* Name, LPCTSTR Format, ...);
+	bool PutProperty (DISPID DispatchId, LPCTSTR Format, ...);
+	bool Method (char* Name, LPCTSTR Format = NULL, ...);
+	bool Method (DISPID DispatchId, LPCTSTR Format = NULL, ...);
+	void DeleteObject ();
+	void ErrDiag ();
+	bool IsCreated ()
+	{
+		return m_pDispatch ? true : false;
+	}
+	bool IsAlive ();
+	HRESULT GetResult ()
+	{
+		return m_hResult;
+	}
+	UINT GetErrArgNr ()
+	{
+		return m_nErrArg;
+	}
+	EXCEPINFO* GetExceptionInfo ()
+	{
+		return &m_ExceptionInfo;
+	}
+	LPVARIANT GetResultVariant ()
+	{
+		return &m_VariantResult;
+	}
+
+    protected:
+	bool Invoke (WORD Flags, char* Name, LPCTSTR Format, va_list ArgList);
+	bool Invoke (WORD Flags, DISPID DispatchId, LPCTSTR Format, va_list ArgList);
+
+    protected:
+	IDispatch*	m_pDispatch;
+	HRESULT		m_hResult;
+	UINT		m_nErrArg;
+	EXCEPINFO	m_ExceptionInfo;
+	VARIANTARG	m_VariantResult;
+};
+
+#ifdef UNICODE
+    #define FROM_OLE_STRING(str)		str
+    #define FROM_OLE_STRING_BUF(str,buf)	str
+    #define TO_OLE_STR(str)			str
+    #define TO_OLE_STR_BUF(str,buf)		str
+    #define MAX_OLE_STR				1
+#else
+    #define FROM_OLE_STR(str)			ConvertToAnsi(str)
+    #define FROM_OLE_STR_BUF(str,buf)		ConvertToAnsiBuf(str,buf)
+    char* ConvertToAnsi (OLECHAR* sUnicode);
+    char* ConvertToAnsiBuf (OLECHAR* sUnicode, char* Buf);
+    #define TO_OLE_STR(str)			ConvertToUnicode(str)
+    #define TO_OLE_STR_BUF(str,buf)		ConvertToUnicodeBuf(str,buf)
+    OLECHAR* ConvertToUnicode (char* sAscii);
+    OLECHAR* ConvertToUnicodeBuf (char* sAscii, OLECHAR* Buf);
+    // Maximum length of string that can be converted between Ansi & Unicode
+    #define MAX_OLE_STR				500
+#endif
+
+
+#endif		 // __OLEAUT_H__
diff --git a/src/VisVim/README_VisVim.txt b/src/VisVim/README_VisVim.txt
new file mode 100644
index 0000000..fe22b12
--- /dev/null
+++ b/src/VisVim/README_VisVim.txt
@@ -0,0 +1,322 @@
+===============================
+Visual Studio - Vim Integration
+===============================
+
+Copyright (C) 1997 Heiko Erhardt
+
+VisVim is a Visual Studio Add-In that allows Vim to be integrated
+as the default text editor. It will be used instead of the Visual
+Studio built-in editor when you double-click on a file or press F4
+after compiling (it will go to the proper line in the Vim buffer).
+The file can be loaded exclusively by Vim or additionally to the
+builtin Visual Studio editor (this option can be set in the VisVim
+configuration dialog inside Visual Studio).
+Vim does not replace the Visual Studio editor, it still runs in its
+own window.
+
+VisVim is based upon VisEmacs by Christopher Payne
+(Copyright (C) Christopher Payne 1997).
+
+Author: Heiko Erhardt <Heiko.Erhardt@munich.netsurf.de>
+Based upon: VisEmacs by Christopher Payne <payneca@sagian.com>
+Version: 1.0
+Created: 23 Oct 1997
+Date: 23 Oct 1997
+
+VisVim is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+VisVim is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+
+Requirements
+------------
+
+VisVim works with the *OLE-enabled* version of Vim version 5.0 and higher
+only!!!  You must download the extra archive containing the OLE-enabled
+executable from your Vim download site.  When building your own Vim
+executable, use the if_ole_vc.mak makefile (Vim 5.1 and higher).
+VisVim needs DevStudio 5.0 or higher. It does not work with DevStudio 4.2.
+
+
+Installation
+------------
+
+1) Close running instances of DevStudio.
+
+2) Copy VisVim.dll into a convenient directory like \vim,
+   \vim\lib, or \vim\addin
+
+3) Register the DLL using regsvr32.exe ...  (Skip this on Windows 95/98)
+   Example:
+   > cd \vim\addin
+   > regsvr32 VisVim.dll
+   On NT, you should do this from an administrator account.
+   Before installing a new version of VisVim you should unregister
+   the old one using
+   > regsvr32 -unregister VisVim.dll
+   The batch files register.bat and unregister.bat can do that for you.
+
+3a) If you didn't do this yet: Register the OLE gvim:
+   > gvim -register
+
+4) Start Visual Studio and go to:
+      Tools
+	 Customize...
+	    Add-Ins and Macro Files
+
+5) Click on Browse, and point Visual Studio to your VisVim.dll file.
+
+6) Click the checkbox to indicate that you want to use the Add-In, and
+   Close the Customize dialog box.
+
+7) You should notice the VisVim Toolbar with the Vim Icon.
+   Click the first item of the toolbar to get to the options dialog.
+
+
+Compiling VisVim
+----------------
+
+Two Options:
+
+1) Load the VisVim.mak file as a Workspace in Visual Studio and compile
+
+2) Use the MSVC command line compiler:
+	vcvars32
+	nmake -f VisVim.mak
+
+
+Using VisVim
+------------
+
+The VisVim DLL exposes several functions to the user. These functions are
+accessible using the toolbar or by assigning hotkeys to them (see below).
+The following functions are visible on the toolbar (from left to right):
+
+1. VisVim settings dialog
+   The settings you adjust here will be saved in the registry and
+   will be reloaded on program startup.
+
+2. Enable Vim
+   Enables Vim as Visual Studio editor. Control will be switched to Vim when:
+   - Clicking a file in the file view
+   - Clicking a compiler error message line
+   - Using the 'File-Open' Dialog
+   - Showing the current source line when encountering a debugger breakpoint.
+   - Using File-New
+
+3. Disable Vim
+   The internal Visual Studio editor will be used to edit files.
+
+4. Toggle enable state
+   Toggles the enable state of VisVim. Use this function if you want to have
+   one button only to activate/deactivate Vim.
+
+5. Load current file in Vim
+   Loads the file shown in the internal editor into Vim. Use this function if
+   you want the internal editor to stay active and just edit one file in Vim.
+   This command works always whether Vim is enabled as default editor or not.
+
+You cannot use DevStudio's debugger commands from inside Vim, so you should
+disable Vim before running the debugger.
+
+You can customize the Vim toolbar itself or add the Vim buttons to other
+toolbars.
+To have fast access to the VisVim options dialog I suggest to create keyboard
+shortcuts:
+
+1) Choose
+      Tools
+	 Customize...
+	    Keyboard
+2) Choose Category:AddIns and Commands:VisVim.
+3) Choose 'Main' as editor, enter each hotkey and press the Assign button.
+   I suggest:
+       VisVimDialogCmd    Alt+Shift+V
+       VisVimEnableCmd    Alt+Shift+E
+       VisVimDisableCmd   Alt+Shift+D
+       VisVimToggleCmd    Alt+Shift+T
+       VisVimLoadCmd      Alt+Shift+G
+4) Close the dialog
+
+Now a typical debugging example:
+
+Using "Alt+Shift+d" you turn off Vim before starting the debugger.
+After hitting the breakpoint you single step through your application
+using the internal source code editor and examine variables.
+When you stumble across the line with the null pointer
+assignment, just press "Alt+Shift+g", and correct the error in Vim.
+Save the file, press Alt+Tab to return to DevStudio and press F7 to compile.
+That's it.
+
+
+Troubleshooting
+---------------
+
+1. When opening a file in DevStudio the file is opened in the DevStudio
+   editor and immediately vanishes. No Vim shows up.
+   Cause:       Probably you don't have the OLE-enabled Vim or you didn't
+		register it.
+   Explanation: VisVim is notified by DevStudio if an 'open document' event
+		occurs. It then closes the document in the internal editor
+		and tries to start Vim. If Vim isn't properly OLE-registered,
+		this won't work.
+   Workaround:  Download and install the OLE-enable version of Vim and
+		execute "gvim -register".
+
+2. Sometimes when clicking on a file, the file won't be opened by Vim but
+   instead the Visual Studio editor comes up.
+   Cause:       The file was already loaded by the DevStudio editor.
+   Explanation: VisVim works by hooks exposed by Visual Studio.
+		Most of the functionality works from the OpenDocument hook.
+		If a document is already loaded in the Visual Studio editor,
+		no 'open document' event will be generated when clicking the
+		file in the file list.
+   Workaround:  Close the document in Visual Studio first.
+
+3. I can't get VisVim to work. Either the Vim toolbar does not appear at all
+   or weird crashes happen.
+   Cause:       The Visual Studio installation is messed up.
+   Explanation: I can't give you one. Ask M$.
+   Workaround:  Reinstall DevStudio (I know this is brute, but in some cases
+		it helped). There was one case where the service pack 1 had
+		to be installed, too.
+
+4. If an instance of Vim is already running, VisVim will use that instance
+   and not start a new one.
+   Cause:	 This is proper OLE behaviour
+   Explanation:  Some call it a bug, some a feature. That's just the way OLE
+		 works.
+
+5. When being in insert mode in Vim and selecting a file in Visual Studio,
+   the Vim command :e ... is inserted as text instead of being executed.
+   Cause:	 You probably know...
+   Explanation:  The Vim OLE automation interface interpretes the VisVim
+		 commands as if they were typed in by the user.
+		 So if you're in insert mode Vim considers it to be text.
+		 I decided against sending an ESC before the command because
+		 it may cause a beep or at least a screen flash when noeb is
+		 set.
+   Workaround:	 Get used to press ESC before switching to DevStudio.
+
+6. I'm tired of VisVim but I can't get rid of it. I can't delete it in
+   Tools-Customize-Add-Ins.
+   Cause:	 You can't delete an item you once added to the add-ins
+		 list box.
+   Explanation:  M$ just didn't put a 'delete' button in the dialog box.
+		 Unfortunately there is no DEL key accellerator as well...
+   Workaround:	 You can't kill it, but you can knock it out:
+		 1. Uncheck the check box in front of 'Vim Developer Studio
+		    Add-in'.
+		 2. Close Visual Studio.
+		 3. Delete VisVim.dll or move it somewhere it can't be found.
+		 4. Run Visual Studio.
+		 5. Tools -> Cursomize ->Add-ins and Macro-Files.
+		 6. A message appears:
+		    ".../VisVim.dll" "This add-in no longer exists.  It will
+		    no longer be displayed."
+		 That's it!
+
+
+Change history
+--------------
+
+1.0a to 1.0
+-----------
+
+- All settings in the VisVim dialog are remembered between DevStudio sessions
+  by keeping them in the registry (HKEY_CURRENT_USER\Software\Vim\VisVim).
+- Added an option to do a :cd before opening the file (having a file opened
+  by clicking it but finding out to be still in C:\Windows\system when trying to
+  open another file by ":e" can be annoying). Change directory can be
+  done to the source file's directory or it's parent directory.
+- Added some explanations to the error message for the CO_E_CLASSSTRING error
+  ("Use OLE Vim and make sure to register...").
+
+1.0 to 1.1a
+-----------
+
+- The VisVim toolbar button now shows the new Vim icon instead of the old one.
+- Made some changes to the documentation, added the troubleshooting chapter
+  and ToDo list.
+- File-New-* now invokes Vim instead of the builtin editor if enabled.
+
+1.1 to 1.1b
+-----------
+
+- Extended the VisVim toolbar to have multiple buttons instead of one.
+- Moved the enable/disable commands from the settings dialog to the toolbar.
+- Added the toggle enable/disable command
+- Added the 'load current file' command.
+
+1.1b to 1.2
+-----------
+
+No new features, just some fine tuning:
+
+- Changed the GUID of the VisVim OLE interface to avoid conflicts with a
+  version of VisEmacs or VisVile on the same computer (Guy Gascoigne)
+- Fixed a bug caused by a bug in the Developer Studio add-in code generator
+  (Clark Morgan)
+- Fixed a memory leak (Clark Morgan)
+- Added an option in the VisVim dialog to prepend ESC before the first command
+  that is sent to Vim. This will avoid inserting the command as text when Vim
+  is still in insert mode.
+- An :update command is sent to Vim before any other command to update the
+  current file if it is modified, or else the following :cd or :e command will fail.
+
+1.2 to 1.3a
+-----------
+
+- Fixed a bug caused by a missing EnableModeless() function call in VimLoad().
+  This seems to reduce VisVim crashing DevStudio on some systems (it
+  occasionally still seems to happen, but it's more stable now).
+  (Vince Negri)
+- Added support for the new CTRL-\ CTRL-N command of Vim 5.4a.
+  This prevents Vim from beeping when a VisVim command is executed an Vim is
+  not in insert mode.
+
+
+ToDo List
+---------
+
+P1 is highest priority, P10 lowest
+
+P9  Switching to DevStudio using ALT-TAB may get annoying. Would be nice to
+    have the option to map ActivateApplication("Visual Studio") in Vim.
+    Vim DLLs would solve that problem.
+
+P8  Execute :tag command in Vim for word under cursor in DevStudio
+
+P7  Controlling the Visual Studio Debugger from inside Vim
+    See message above. Also a 'Debug' highligh group and a
+    command to highlight a certain line would be necessary.
+
+P6  Provide an option to open the current file in VisVim in
+    Visual Studio editor
+    Same as above message. A kind of two way OLE automation would have to be
+    established between VisVim and Vim. Also a 'Debug' highlight group and a
+    command to highlight a certain line would be necessary.
+
+
+Known Problems
+--------------
+
+- Occasional memory corruptions in DevStudio may appear on some systems.
+  Reinstalling DevStudio helped in some cases.
+  The cause of these crashes is unclear; there is no way to debug this.
+  Recompiling VisVim with DevStudio SP3 didn't help.
+  I assume it's a problem deep inside the DevStudio add-in OLE interfaces.
+  This will hopefully be fixed with DevStudio 6.
+
+
+Have fun!
+
+Heiko Erhardt
+Heiko.Erhardt@munich.netsurf.de
+
diff --git a/src/VisVim/Reg.cpp b/src/VisVim/Reg.cpp
new file mode 100644
index 0000000..b4378e5
--- /dev/null
+++ b/src/VisVim/Reg.cpp
@@ -0,0 +1,56 @@
+#include "stdafx.h"
+
+// Returns key for HKEY_CURRENT_USER\"Software"\Company\AppName
+// creating it if it doesn't exist
+// responsibility of the caller to call RegCloseKey() on the returned HKEY
+//
+HKEY GetAppKey (char* AppName)
+{
+	HKEY hAppKey = NULL;
+	HKEY hSoftKey = NULL;
+	if (RegOpenKeyEx (HKEY_CURRENT_USER, "Software", 0, KEY_WRITE | KEY_READ,
+		&hSoftKey) == ERROR_SUCCESS)
+	{
+		DWORD Dummy;
+		RegCreateKeyEx (hSoftKey, AppName, 0, REG_NONE,
+			REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_READ, NULL,
+			&hAppKey, &Dummy);
+	}
+	if (hSoftKey)
+		RegCloseKey (hSoftKey);
+
+	return hAppKey;
+}
+
+// Returns key for
+// HKEY_CURRENT_USER\"Software"\RegistryKey\AppName\Section
+// creating it if it doesn't exist.
+// responsibility of the caller to call RegCloseKey () on the returned HKEY
+//
+HKEY GetSectionKey (HKEY hAppKey, LPCTSTR Section)
+{
+	HKEY hSectionKey = NULL;
+	DWORD Dummy;
+	RegCreateKeyEx (hAppKey, Section, 0, REG_NONE,
+		REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
+		&hSectionKey, &Dummy);
+	return hSectionKey;
+}
+
+int GetRegistryInt (HKEY hSectionKey, LPCTSTR Entry, int Default)
+{
+	DWORD Value;
+	DWORD Type;
+	DWORD Count = sizeof (DWORD);
+	if (RegQueryValueEx (hSectionKey, (LPTSTR) Entry, NULL, &Type,
+			     (LPBYTE) &Value, &Count) == ERROR_SUCCESS)
+		return Value;
+	return Default;
+}
+
+bool WriteRegistryInt (HKEY hSectionKey, char* Entry, int nValue)
+{
+	return RegSetValueEx (hSectionKey, Entry, NULL, REG_DWORD,
+		(LPBYTE) &nValue, sizeof (nValue)) == ERROR_SUCCESS;
+}
+
diff --git a/src/VisVim/Register.bat b/src/VisVim/Register.bat
new file mode 100644
index 0000000..baef50b
--- /dev/null
+++ b/src/VisVim/Register.bat
@@ -0,0 +1 @@
+regsvr32.exe visvim.dll
diff --git a/src/VisVim/Resource.h b/src/VisVim/Resource.h
new file mode 100644
index 0000000..e098b38
--- /dev/null
+++ b/src/VisVim/Resource.h
@@ -0,0 +1,29 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by VisVim.rc
+//
+#define IDS_VISVIM_LONGNAME		1
+#define IDS_VISVIM_DESCRIPTION		2
+#define IDS_CMD_DIALOG			3
+#define IDS_CMD_ENABLE			4
+#define IDS_CMD_DISABLE			5
+#define IDS_CMD_TOGGLE			6
+#define IDS_CMD_LOAD			7
+#define IDR_TOOLBAR_MEDIUM		128
+#define IDR_TOOLBAR_LARGE		129
+#define IDD_ADDINMAIN			130
+#define IDC_DEVSTUDIO_EDITOR		1000
+#define IDC_CD_SOURCE_PATH		1001
+#define IDC_CD_SOURCE_PARENT		1002
+#define IDC_CD_NONE			1003
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE	131
+#define _APS_NEXT_COMMAND_VALUE		32771
+#define _APS_NEXT_CONTROL_VALUE		1004
+#define _APS_NEXT_SYMED_VALUE		101
+#endif
+#endif
diff --git a/src/VisVim/StdAfx.cpp b/src/VisVim/StdAfx.cpp
new file mode 100644
index 0000000..f4f6eb5
--- /dev/null
+++ b/src/VisVim/StdAfx.cpp
@@ -0,0 +1,6 @@
+// Stdafx.cpp : source file that includes just the standard includes
+//	VisEmacs.pch will be the pre-compiled header
+//	stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+#include "atlimpl.cpp"
diff --git a/src/VisVim/StdAfx.h b/src/VisVim/StdAfx.h
new file mode 100644
index 0000000..10bfdc0
--- /dev/null
+++ b/src/VisVim/StdAfx.h
@@ -0,0 +1,73 @@
+// Stdafx.h : include file for standard system include files,
+//  or project specific include files that are used frequently, but
+//      are changed infrequently
+//
+
+#if !defined(AFX_STDAFX_H__AC72670E_2977_11D1_B2F3_006008040780__INCLUDED_)
+#define AFX_STDAFX_H__AC72670E_2977_11D1_B2F3_006008040780__INCLUDED_
+
+#define VC_EXTRALEAN		// Exclude rarely-used stuff from Windows headers
+
+#include <afxwin.h>	    // MFC core and standard components
+#include <afxdisp.h>
+
+#include <atlbase.h>
+//You may derive a class from CComModule and use it if you want to override
+//something, but do not change the name of _Module
+extern CComModule _Module;
+
+#include <atlcom.h>
+
+// Developer Studio Object Model
+#include <ObjModel\addauto.h>
+#include <ObjModel\appdefs.h>
+#include <ObjModel\appauto.h>
+#include <ObjModel\blddefs.h>
+#include <ObjModel\bldauto.h>
+#include <ObjModel\textdefs.h>
+#include <ObjModel\textauto.h>
+#include <ObjModel\dbgdefs.h>
+#include <ObjModel\dbgauto.h>
+
+/////////////////////////////////////////////////////////////////////////////
+// Debugging support
+
+// Use VERIFY_OK around all calls to the Developer Studio objects which
+//  you expect to return S_OK.
+// In DEBUG builds of your add-in, VERIFY_OK displays an ASSERT dialog box
+//  if the expression returns an HRESULT other than S_OK.  If the HRESULT
+//  is a success code, the ASSERT box will display that HRESULT.  If it
+//  is a failure code, the ASSERT box will display that HRESULT plus the
+//  error description string provided by the object which raised the error.
+// In RETAIL builds of your add-in, VERIFY_OK just evaluates the expression
+//  and ignores the returned HRESULT.
+
+#ifdef _DEBUG
+
+void GetLastErrorDescription (CComBSTR & bstr);	// Defined in VisVim.cpp
+#define VERIFY_OK(f) \
+	{ \
+		HRESULT hr = (f); \
+		if (hr != S_OK) \
+		{ \
+			if (FAILED(hr)) \
+			{ \
+				CComBSTR bstr; \
+				GetLastErrorDescription(bstr); \
+				_RPTF2(_CRT_ASSERT, "Object call returned %lx\n\n%S", hr, (BSTR) bstr); \
+			} \
+			else \
+				_RPTF1(_CRT_ASSERT, "Object call returned %lx", hr); \
+		} \
+	}
+
+#else //_DEBUG
+
+#define VERIFY_OK(f) (f);
+
+#endif //_DEBUG
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_STDAFX_H__AC72670E_2977_11D1_B2F3_006008040780__INCLUDED)
diff --git a/src/VisVim/UnRegist.bat b/src/VisVim/UnRegist.bat
new file mode 100644
index 0000000..9ea105d
--- /dev/null
+++ b/src/VisVim/UnRegist.bat
@@ -0,0 +1 @@
+regsvr32.exe -unregister visvim.dll
diff --git a/src/VisVim/VisVim.cpp b/src/VisVim/VisVim.cpp
new file mode 100644
index 0000000..222925a
--- /dev/null
+++ b/src/VisVim/VisVim.cpp
@@ -0,0 +1,152 @@
+// VisVim.cpp : Defines the initialization routines for the DLL.
+//
+
+#include "stdafx.h"
+#include <initguid.h>
+#include "VisVim.h"
+#include "DSAddIn.h"
+#include "Commands.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+
+#endif
+
+CComModule _Module;
+
+BEGIN_OBJECT_MAP (ObjectMap)
+OBJECT_ENTRY (CLSID_DSAddIn, CDSAddIn)
+END_OBJECT_MAP ()
+
+class CVisVimApp : public CWinApp
+{
+    public:
+	CVisVimApp ();
+
+	//{{AFX_VIRTUAL(CVisVimApp)
+    public:
+	virtual BOOL InitInstance ();
+	virtual int ExitInstance ();
+	//}}AFX_VIRTUAL
+
+	//{{AFX_MSG(CVisVimApp)
+	//}}AFX_MSG
+	DECLARE_MESSAGE_MAP ()
+};
+
+BEGIN_MESSAGE_MAP (CVisVimApp, CWinApp)
+//{{AFX_MSG_MAP(CVisVimApp)
+//}}AFX_MSG_MAP
+END_MESSAGE_MAP ()
+
+// The one and only CVisVimApp object
+CVisVimApp theApp;
+
+CVisVimApp::CVisVimApp ()
+{
+}
+
+BOOL CVisVimApp::InitInstance ()
+{
+	_Module.Init (ObjectMap, m_hInstance);
+	return CWinApp::InitInstance ();
+}
+
+int CVisVimApp::ExitInstance ()
+{
+	_Module.Term ();
+	return CWinApp::ExitInstance ();
+}
+
+// Special entry points required for inproc servers
+//
+
+STDAPI DllGetClassObject (REFCLSID rclsid, REFIID riid, LPVOID * ppv)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return _Module.GetClassObject (rclsid, riid, ppv);
+}
+
+STDAPI DllCanUnloadNow (void)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	return (AfxDllCanUnloadNow () == S_OK && _Module.GetLockCount () == 0)
+		? S_OK : S_FALSE;
+}
+
+// By exporting DllRegisterServer, you can use regsvr32.exe
+//
+STDAPI DllRegisterServer (void)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+	HRESULT hRes;
+
+	// Registers object, typelib and all interfaces in typelib
+	hRes = _Module.RegisterServer (TRUE);
+	if (FAILED (hRes))
+		// Hack: When this fails we might be a normal user, while the
+		// admin already registered the module.  Returning S_OK then
+		// makes it work.  When the module was never registered it
+		// will soon fail in another way.
+		// old code: return hRes;
+		return S_OK;
+
+	_ATL_OBJMAP_ENTRY *pEntry = _Module.m_pObjMap;
+	CRegKey key;
+	LONG lRes = key.Open (HKEY_CLASSES_ROOT, _T ("CLSID"));
+
+	if (lRes == ERROR_SUCCESS)
+	{
+		USES_CONVERSION;
+		LPOLESTR lpOleStr;
+
+		StringFromCLSID (*pEntry->pclsid, &lpOleStr);
+		LPTSTR lpsz = OLE2T (lpOleStr);
+
+		lRes = key.Open (key, lpsz);
+		if (lRes == ERROR_SUCCESS)
+		{
+			CString strDescription;
+
+			strDescription.LoadString (IDS_VISVIM_DESCRIPTION);
+			key.SetKeyValue (_T ("Description"), strDescription);
+		}
+		CoTaskMemFree (lpOleStr);
+	}
+
+	if (lRes != ERROR_SUCCESS)
+		hRes = HRESULT_FROM_WIN32 (lRes);
+
+	return hRes;
+
+}
+
+// DllUnregisterServer - Removes entries from the system registry
+//
+STDAPI DllUnregisterServer (void)
+{
+	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
+
+	HRESULT hRes = S_OK;
+	_Module.UnregisterServer ();
+	return hRes;
+}
+
+
+// Debugging support
+
+// GetLastErrorDescription is used in the implementation of the VERIFY_OK
+//  macro, defined in stdafx.h.
+
+#ifdef _DEBUG
+
+void GetLastErrorDescription (CComBSTR & bstr)
+{
+	CComPtr < IErrorInfo > pErrorInfo;
+	if (GetErrorInfo (0, &pErrorInfo) == S_OK)
+		pErrorInfo->GetDescription (&bstr);
+}
+
+#endif //_DEBUG
diff --git a/src/VisVim/VisVim.def b/src/VisVim/VisVim.def
new file mode 100644
index 0000000..023d478
--- /dev/null
+++ b/src/VisVim/VisVim.def
@@ -0,0 +1,11 @@
+; VisVim.def : Declares the module parameters for the DLL.
+
+LIBRARY      "VISVIM"
+DESCRIPTION  'VISVIM Windows Dynamic Link Library'
+
+EXPORTS
+    ; Explicit exports can go here
+	DllCanUnloadNow PRIVATE
+	DllGetClassObject PRIVATE
+	DllRegisterServer PRIVATE
+	DllUnregisterServer PRIVATE
diff --git a/src/VisVim/VisVim.dll b/src/VisVim/VisVim.dll
new file mode 100644
index 0000000..017b417
--- /dev/null
+++ b/src/VisVim/VisVim.dll
Binary files differ
diff --git a/src/VisVim/VisVim.h b/src/VisVim/VisVim.h
new file mode 100644
index 0000000..7759778
--- /dev/null
+++ b/src/VisVim/VisVim.h
@@ -0,0 +1,33 @@
+// VisVIM.h : main header file for the VisVim DLL
+//
+
+#if !defined(AFX_VISVIM_H__AC72670B_2977_11D1_B2F3_006008040780__INCLUDED_)
+#define AFX_VISVIM_H__AC72670B_2977_11D1_B2F3_006008040780__INCLUDED_
+
+#ifndef __AFXWIN_H__
+#error include 'stdafx.h' before including this file for PCH
+#endif
+
+#include "resource.h"		// Main symbols
+
+#include <ObjModel\addguid.h>
+#include <ObjModel\appguid.h>
+#include <ObjModel\bldguid.h>
+#include <ObjModel\textguid.h>
+#include <ObjModel\dbgguid.h>
+
+//
+// Prototypes
+//
+
+HKEY GetAppKey (char* AppName);
+HKEY GetSectionKey (HKEY hAppKey, LPCTSTR Section);
+int GetRegistryInt (HKEY hSectionKey, LPCTSTR Entry, int Default);
+bool WriteRegistryInt (HKEY hSectionKey, char* Entry, int nValue);
+void ReportLastError (HRESULT Err);
+void ReportInternalError (char* Fct);
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_VISVIM_H__AC72670B_2977_11D1_B2F3_006008040780__INCLUDED)
diff --git a/src/VisVim/VisVim.mak b/src/VisVim/VisVim.mak
new file mode 100644
index 0000000..30a9cf4
--- /dev/null
+++ b/src/VisVim/VisVim.mak
@@ -0,0 +1,205 @@
+# Microsoft Developer Studio Generated NMAKE File, Format Version 4.00
+# ** DO NOT EDIT **
+#
+# When       Who       What
+# 1999-08-01 Anon      Original VisVim.dsp
+# 2001-08-08 W.Briscoe Back-ported to a condensed VC4 Makefile
+#		       Reduced inter-dependency of Release and Debug builds.
+#
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+!IF "$(CFG)" == ""
+CFG=VisVim - Win32 Release
+!MESSAGE No configuration specified.  Defaulting to VisVim - Win32 Release.
+!ENDIF 
+
+!IF "$(CFG)" != "VisVim - Win32 Release" && "$(CFG)" != "VisVim - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE on this makefile
+!MESSAGE by defining the macro CFG on the command line.  For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "VisVim.mak" CFG="VisVim - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "VisVim - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "VisVim - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+!ERROR An invalid configuration is specified.
+!ENDIF 
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+DEL_TREE = rmdir /s /q
+!ELSE 
+NULL=nul
+DEL_TREE = deltree /y
+!ENDIF 
+# Begin Project
+# PROP Target_Last_Scanned "VisVim - Win32 Release"
+# PROP Use_MFC 2
+CPP=cl.exe
+RSC=rc.exe
+LINK32=link.exe
+
+!IF  "$(CFG)" == "VisVim - Win32 Release"
+
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\Release"
+# PROP Intermediate_Dir ".\Release"
+# PROP Target_Dir ""
+OUTDIR=.\Release
+INTDIR=.\Release
+CPP_OBJS=.\Release/
+
+# ADD CPP /MD /O2 /D "NDEBUG" /I.\Release
+CPP_PROJ= /MD /O2 /D "NDEBUG" /I.\Release
+# ADD RSC /d "NDEBUG
+RSC_PROJ= /d "NDEBUG"
+# ADD LINK32 /pdb:none
+LINK32_FLAGS=/pdb:none
+
+!ELSEIF  "$(CFG)" == "VisVim - Win32 Debug"
+
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\Debug"
+# PROP Intermediate_Dir ".\Debug"
+# PROP Target_Dir ""
+OUTDIR=.\Debug
+INTDIR=.\Debug
+CPP_OBJS=.\Debug/
+
+# ADD CPP /MDd /Gm /Zi /Od /D "_DEBUG" /I.\Debug
+CPP_PROJ= /MDd /Gm /Zi /Od /D "_DEBUG" /I.\Debug /Fd"$(INTDIR)/"
+MTL_PROJ= /D "_DEBUG"
+# ADD RSC /d "_DEBUG
+RSC_PROJ= /d "_DEBUG"
+# ADD LINK32 /debug /pdbtype:sept /pdb:".\Debug/VisVim.pdb"
+LINK32_FLAGS=/debug /pdbtype:sept /pdb:"$(OUTDIR)/VisVim.pdb"
+
+!ENDIF 
+
+# ADD CPP            /nologo /W3 /GX /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_AFXDLL" /D "_USRDLL" /c
+CPP_PROJ=$(CPP_PROJ) /nologo /W3 /GX /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_AFXDLL" /D "_USRDLL" /c /Fo"$(INTDIR)/"
+# ADD RSC            /l 0x409 /d "_AFXDLL"
+RSC_PROJ=$(RSC_PROJ) /l 0x409 /d "_AFXDLL" /fo"$(INTDIR)/VisVim.res"
+# ADD LINK32                 /nologo /subsystem:windows /dll /machine:I386 /incremental:no
+LINK32_FLAGS=$(LINK32_FLAGS) /nologo /subsystem:windows /dll /machine:I386\
+ /incremental:no /def:".\VisVim.def"\
+ /out:"$(OUTDIR)/VisVim.dll" /implib:"$(OUTDIR)/VisVim.lib"
+
+ALL : "$(OUTDIR)\VisVim.dll"
+
+CLEAN : 
+	-@if exist "$(INTDIR)/$(NULL)" $(DEL_TREE) "$(INTDIR)"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+LINK32_OBJS= \
+	"$(INTDIR)/VisVim.res" \
+	"$(INTDIR)/VisVim.obj" \
+	"$(INTDIR)/StdAfx.obj" \
+	"$(INTDIR)/Reg.obj" \
+	"$(INTDIR)/DSAddIn.obj" \
+	"$(INTDIR)/OleAut.obj" \
+	"$(INTDIR)/Commands.obj"
+
+"$(OUTDIR)\VisVim.dll" : "$(OUTDIR)" ".\VisVim.def" $(LINK32_OBJS)
+    $(LINK32) $(LINK32_FLAGS) $(LINK32_OBJS)
+
+{.}.c{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+{.}.cpp{$(CPP_OBJS)}.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+# Begin Target
+
+# Name "VisVim - Win32 Release"
+# Name "VisVim - Win32 Debug"
+
+# Begin Source File
+
+SOURCE=.\VisVim.cpp
+
+"$(INTDIR)\VisVim.obj" : $(SOURCE) "$(INTDIR)"
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\VisVim.def
+# End Source File
+# Begin Source File
+
+SOURCE=.\VisVim.odl
+
+!IF  "$(CFG)" == "VisVim - Win32 Release"
+
+# PROP Ignore_Default_Tool 1
+# Begin Custom Build
+
+"$(INTDIR)\VisVim.tlb" : $(SOURCE) "$(INTDIR)"
+	midl /nologo /mktyplib203 /win32 /tlb VisVim.tlb /h VSVTypes.h .\VisVim.odl /out .\Release /D "NDEBUG"
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "VisVim - Win32 Debug"
+
+# PROP Ignore_Default_Tool 1
+# Begin Custom Build
+
+"$(INTDIR)\VisVim.tlb" : $(SOURCE) "$(INTDIR)"
+	midl /nologo /mktyplib203 /win32 /tlb VisVim.tlb /h VSVTypes.h .\VisVim.odl /out .\Debug /D "_DEBUG"
+
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\StdAfx.cpp
+
+"$(INTDIR)\StdAfx.obj" : $(SOURCE) "$(INTDIR)"
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\VisVim.rc
+
+"$(INTDIR)\VisVim.res" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\VisVim.tlb"
+ $(RSC) $(RSC_PROJ) /i "$(INTDIR)" $(SOURCE)
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\Reg.cpp
+
+"$(INTDIR)\Reg.obj" : $(SOURCE) "$(INTDIR)"
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\DSAddIn.cpp
+
+"$(INTDIR)\DSAddIn.obj" : $(SOURCE) "$(INTDIR)"
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\OleAut.cpp
+
+"$(INTDIR)\OleAut.obj" : $(SOURCE) "$(INTDIR)"
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\Commands.cpp
+
+"$(INTDIR)\Commands.obj" : $(SOURCE) "$(INTDIR)"
+
+# End Source File
+# End Target
+# End Project
diff --git a/src/VisVim/VisVim.odl b/src/VisVim/VisVim.odl
new file mode 100644
index 0000000..0491b8f
--- /dev/null
+++ b/src/VisVim/VisVim.odl
@@ -0,0 +1,61 @@
+// VisVim.odl : type library source for VisVim.dll
+
+// This file will be processed by the Make Type Library (mktyplib) tool to
+// produce the type library (VisVim.tlb).
+
+[	uuid(AC726707-2977-11D1-B2F3-006008040780), version(1.0),
+	helpstring ("VisVim Developer Studio Add-in") ]
+library VisVim
+{
+	importlib("stdole32.tlb");
+	importlib("devshl.dll");
+	importlib("ide\devdbg.pkg");
+
+
+	//  Dual interface for CCommands
+	//
+	//  All commands that your add-in adds to DevStudio
+	//   must appear in this interface.  You may use the
+	//   ClassView to add methods to this interface, which
+	//   will cause stub implementations of those methods to
+	//   appear in your CCommands class.
+
+	[	uuid(AC726703-2977-11D1-B2F3-006008040780),
+		oleautomation,
+		dual
+	]
+
+	interface ICommands : IDispatch
+	{
+		// methods
+		[id(1)]
+		HRESULT VisVimDialog();
+		HRESULT VisVimEnable();
+		HRESULT VisVimDisable();
+		HRESULT VisVimToggle();
+		HRESULT VisVimLoad();
+	};
+
+	//  Class information for CCommands
+
+	[ uuid(AC726704-2977-11D1-B2F3-006008040780) ]
+	coclass Commands
+	{
+		[default] interface ICommands;
+	};
+
+	[ hidden, uuid(AC726705-2977-11D1-B2F3-006008040780) ]
+	coclass ApplicationEvents
+	{
+		[default] interface IApplicationEvents;
+	}
+
+	[ hidden, uuid(AC726706-2977-11D1-B2F3-006008040780) ]
+	coclass DebuggerEvents
+	{
+		[default] interface IDebuggerEvents;
+	}
+
+	//{{AFX_APPEND_ODL}}
+	//}}AFX_APPEND_ODL}}
+};
diff --git a/src/VisVim/VisVim.rc b/src/VisVim/VisVim.rc
new file mode 100644
index 0000000..f227e53
--- /dev/null
+++ b/src/VisVim/VisVim.rc
@@ -0,0 +1,199 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Englisch (USA) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
+    "#define _AFX_NO_OLE_RESOURCES\r\n"
+    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
+    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
+    "\r\n"
+    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
+    "#ifdef _WIN32\r\n"
+    "LANGUAGE 9, 1\r\n"
+    "#pragma code_page(1252)\r\n"
+    "#endif\r\n"
+    "#include ""afxres.rc""         // Standard components\r\n"
+    "#endif\r\n"
+    "1 TYPELIB ""VisVim.tlb""\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Bitmap
+//
+
+IDR_TOOLBAR_MEDIUM      BITMAP  MOVEABLE PURE   "res\\ToolbarM.bmp"
+IDR_TOOLBAR_LARGE       BITMAP  MOVEABLE PURE   "res\\ToolbarL.bmp"
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,1,0,1
+ PRODUCTVERSION 1,1,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "CompanyName", "\0"
+            VALUE "FileDescription", "VisVim DLL\0"
+            VALUE "FileVersion", "1, 1, 0, 1\0"
+            VALUE "InternalName", "VisVim\0"
+            VALUE "LegalCopyright", "Copyright (C) 1998\0"
+            VALUE "OriginalFilename", "VisVim.DLL\0"
+            VALUE "ProductName", "VisVim Dynamic Link Library\0"
+            VALUE "ProductVersion", "1, 1, 0, 1\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+#endif    // !_MAC
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_ADDINMAIN DIALOG DISCARDABLE  0, 0, 178, 124
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Vim Add-In 1.4"
+FONT 8, "MS Sans Serif"
+BEGIN
+    CONTROL         "&Open file in DevStudio editor simultaneously",
+                    IDC_DEVSTUDIO_EDITOR,"Button",BS_AUTOCHECKBOX | WS_GROUP | 
+                    WS_TABSTOP,7,7,153,10
+    GROUPBOX        "Current directory",IDC_STATIC,7,35,164,58,WS_GROUP
+    CONTROL         "Set to &source file path",IDC_CD_SOURCE_PATH,"Button",
+                    BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,17,49,85,10
+    CONTROL         "Set to &parent directory of source file path",
+                    IDC_CD_SOURCE_PARENT,"Button",BS_AUTORADIOBUTTON,17,63,
+                    143,10
+    CONTROL         "Do &not change",IDC_CD_NONE,"Button",BS_AUTORADIOBUTTON,
+                    17,78,63,10
+    DEFPUSHBUTTON   "&Ok",IDOK,7,102,74,14,WS_GROUP
+    PUSHBUTTON      "&Cancel",IDCANCEL,97,102,74,14,WS_GROUP
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE 
+BEGIN
+    IDD_ADDINMAIN, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 171
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 117
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE 
+BEGIN
+    IDS_VISVIM_LONGNAME     "Vim Developer Studio Add-In"
+    IDS_VISVIM_DESCRIPTION  "Allows integration of Vim as the text editor in Developer Studio."
+    IDS_CMD_DIALOG          "\nVim Add-In Dialog\nDisplays the options dialog box of the Vim Add-In\nVim Add-In Dialog"
+    IDS_CMD_ENABLE          "\nEnable Vim Add-In\nEnables Vim as Visual Studio editor\nEnable Vim Add-In"
+    IDS_CMD_DISABLE         "\nDisable Vim Add-In\nDisables Vim as Visual Studio editor\nDisable Vim Add-In"
+    IDS_CMD_TOGGLE          "\nToggle Vim Add-In State\nToggles the enable state of the Vim Add-In\nToggle Vim Add-In State"
+    IDS_CMD_LOAD            "\nVim Add-In Load Document\nLoads the current document in Vim\nVim Add-In Load Document"
+END
+
+#endif    // Englisch (USA) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+#define _AFX_NO_SPLITTER_RESOURCES
+#define _AFX_NO_OLE_RESOURCES
+#define _AFX_NO_TRACKER_RESOURCES
+#define _AFX_NO_PROPERTY_RESOURCES
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE 9, 1
+#pragma code_page(1252)
+#endif
+#include "afxres.rc"         // Standard components
+#endif
+1 TYPELIB "VisVim.tlb"
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
diff --git a/src/VisVim/VsReadMe.txt b/src/VisVim/VsReadMe.txt
new file mode 100644
index 0000000..f480c6b
--- /dev/null
+++ b/src/VisVim/VsReadMe.txt
@@ -0,0 +1,91 @@
+========================================================================
+       DEVELOPER STUDIO ADD-IN : VisVim
+========================================================================
+
+
+The Add-in Wizard has created this VisVim DLL for you.  This DLL not only
+demonstrates the basics of creating a Developer Studio add-in, but it is also
+a starting point for writing your own add-in.
+
+An add-in mainly does two things.
+	(1) It adds commands to Developer Studio, which can then be tied
+	    to keystrokes or toolbar buttons by the user or programmatically
+		by the add-in.
+	(2) It responds to events fired by Developer Studio.
+In both cases, the add-in code has access to the full Developer Studio
+Automation Object Model, and may manipulate those objects to affect the
+behavior of Developer Studio.
+
+This file contains a summary of what you will find in each of the files that
+make up your VisVim DLL.
+
+
+VisVim.h
+    This is the main header file for the DLL.  It declares the
+    CVisVimApp class.
+
+VisVim.cpp
+    This is the main DLL source file.  It contains the class CVisVimApp.
+    It also contains the OLE entry points required of inproc servers.
+
+VisVim.odl
+    This file contains the Object Description Language source code for the
+    type library of your DLL.
+
+VisVim.rc
+    This is a listing of all of the Microsoft Windows resources that the
+    program uses.  It includes the sample toolbar bitmap that is stored
+    in the RES subdirectory.  This file can be directly edited in Microsoft
+    Developer Studio.
+
+res\VisVim.rc2
+    This file contains resources that are not edited by Microsoft
+    Developer Studio.  You should place all resources not
+    editable by the resource editor in this file.
+
+VisVim.def
+    This file contains information about the DLL that must be
+    provided to run with Microsoft Windows.  It defines parameters
+    such as the name and description of the DLL.  It also exports
+	functions from the DLL.
+
+VisVim.clw
+    This file contains information used by ClassWizard to edit existing
+    classes or add new classes.  ClassWizard also uses this file to store
+    information needed to create and edit message maps and dialog data
+    maps and to create prototype member functions.
+
+/////////////////////////////////////////////////////////////////////////////
+Add-in-specific files:
+
+DSAddIn.cpp, DSAddIn.h
+    These files contain the CDSAddIn class, which implements the
+    IDSAddIn interface.  This interface contains handlers
+    for connecting and disconnecting the add-in.
+
+Commands.cpp, Commands.h
+    These files contain the CCommands class, which implements your
+    command dispatch interface.  This interface contains one method
+    for each command you add to Developer Studio.
+    These files also contain stub implementations of handlers for all events
+    fired by the Developer Studio Application object.
+
+OleAut.cpp
+    These files contain a general OLE automation class used to communicate
+    with vim.
+
+Reg.cpp
+    These files contain functions to access the registry.
+
+
+/////////////////////////////////////////////////////////////////////////////
+Other standard files:
+
+StdAfx.h, StdAfx.cpp
+    These files are used to build a precompiled header (PCH) file
+    named VisVim.pch and a precompiled types file named StdAfx.obj.
+
+Resource.h
+    This is the standard header file, which defines new resource IDs.
+    Microsoft Developer Studio reads and updates this file.
+
