diff options
Diffstat (limited to 'src/VisVim/VisVim.cpp')
-rw-r--r-- | src/VisVim/VisVim.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
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 |