xref: /vim-8.2.3635/src/VisVim/VisVim.cpp (revision 071d4279)
1*071d4279SBram Moolenaar // VisVim.cpp : Defines the initialization routines for the DLL.
2*071d4279SBram Moolenaar //
3*071d4279SBram Moolenaar 
4*071d4279SBram Moolenaar #include "stdafx.h"
5*071d4279SBram Moolenaar #include <initguid.h>
6*071d4279SBram Moolenaar #include "VisVim.h"
7*071d4279SBram Moolenaar #include "DSAddIn.h"
8*071d4279SBram Moolenaar #include "Commands.h"
9*071d4279SBram Moolenaar 
10*071d4279SBram Moolenaar #ifdef _DEBUG
11*071d4279SBram Moolenaar #define new DEBUG_NEW
12*071d4279SBram Moolenaar #undef THIS_FILE
13*071d4279SBram Moolenaar static char THIS_FILE[] = __FILE__;
14*071d4279SBram Moolenaar 
15*071d4279SBram Moolenaar #endif
16*071d4279SBram Moolenaar 
17*071d4279SBram Moolenaar CComModule _Module;
18*071d4279SBram Moolenaar 
19*071d4279SBram Moolenaar BEGIN_OBJECT_MAP (ObjectMap)
20*071d4279SBram Moolenaar OBJECT_ENTRY (CLSID_DSAddIn, CDSAddIn)
21*071d4279SBram Moolenaar END_OBJECT_MAP ()
22*071d4279SBram Moolenaar 
23*071d4279SBram Moolenaar class CVisVimApp : public CWinApp
24*071d4279SBram Moolenaar {
25*071d4279SBram Moolenaar     public:
26*071d4279SBram Moolenaar 	CVisVimApp ();
27*071d4279SBram Moolenaar 
28*071d4279SBram Moolenaar 	//{{AFX_VIRTUAL(CVisVimApp)
29*071d4279SBram Moolenaar     public:
30*071d4279SBram Moolenaar 	virtual BOOL InitInstance ();
31*071d4279SBram Moolenaar 	virtual int ExitInstance ();
32*071d4279SBram Moolenaar 	//}}AFX_VIRTUAL
33*071d4279SBram Moolenaar 
34*071d4279SBram Moolenaar 	//{{AFX_MSG(CVisVimApp)
35*071d4279SBram Moolenaar 	//}}AFX_MSG
36*071d4279SBram Moolenaar 	DECLARE_MESSAGE_MAP ()
37*071d4279SBram Moolenaar };
38*071d4279SBram Moolenaar 
39*071d4279SBram Moolenaar BEGIN_MESSAGE_MAP (CVisVimApp, CWinApp)
40*071d4279SBram Moolenaar //{{AFX_MSG_MAP(CVisVimApp)
41*071d4279SBram Moolenaar //}}AFX_MSG_MAP
42*071d4279SBram Moolenaar END_MESSAGE_MAP ()
43*071d4279SBram Moolenaar 
44*071d4279SBram Moolenaar // The one and only CVisVimApp object
45*071d4279SBram Moolenaar CVisVimApp theApp;
46*071d4279SBram Moolenaar 
CVisVimApp()47*071d4279SBram Moolenaar CVisVimApp::CVisVimApp ()
48*071d4279SBram Moolenaar {
49*071d4279SBram Moolenaar }
50*071d4279SBram Moolenaar 
InitInstance()51*071d4279SBram Moolenaar BOOL CVisVimApp::InitInstance ()
52*071d4279SBram Moolenaar {
53*071d4279SBram Moolenaar 	_Module.Init (ObjectMap, m_hInstance);
54*071d4279SBram Moolenaar 	return CWinApp::InitInstance ();
55*071d4279SBram Moolenaar }
56*071d4279SBram Moolenaar 
ExitInstance()57*071d4279SBram Moolenaar int CVisVimApp::ExitInstance ()
58*071d4279SBram Moolenaar {
59*071d4279SBram Moolenaar 	_Module.Term ();
60*071d4279SBram Moolenaar 	return CWinApp::ExitInstance ();
61*071d4279SBram Moolenaar }
62*071d4279SBram Moolenaar 
63*071d4279SBram Moolenaar // Special entry points required for inproc servers
64*071d4279SBram Moolenaar //
65*071d4279SBram Moolenaar 
DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID * ppv)66*071d4279SBram Moolenaar STDAPI DllGetClassObject (REFCLSID rclsid, REFIID riid, LPVOID * ppv)
67*071d4279SBram Moolenaar {
68*071d4279SBram Moolenaar 	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
69*071d4279SBram Moolenaar 	return _Module.GetClassObject (rclsid, riid, ppv);
70*071d4279SBram Moolenaar }
71*071d4279SBram Moolenaar 
DllCanUnloadNow(void)72*071d4279SBram Moolenaar STDAPI DllCanUnloadNow (void)
73*071d4279SBram Moolenaar {
74*071d4279SBram Moolenaar 	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
75*071d4279SBram Moolenaar 	return (AfxDllCanUnloadNow () == S_OK && _Module.GetLockCount () == 0)
76*071d4279SBram Moolenaar 		? S_OK : S_FALSE;
77*071d4279SBram Moolenaar }
78*071d4279SBram Moolenaar 
79*071d4279SBram Moolenaar // By exporting DllRegisterServer, you can use regsvr32.exe
80*071d4279SBram Moolenaar //
DllRegisterServer(void)81*071d4279SBram Moolenaar STDAPI DllRegisterServer (void)
82*071d4279SBram Moolenaar {
83*071d4279SBram Moolenaar 	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
84*071d4279SBram Moolenaar 	HRESULT hRes;
85*071d4279SBram Moolenaar 
86*071d4279SBram Moolenaar 	// Registers object, typelib and all interfaces in typelib
87*071d4279SBram Moolenaar 	hRes = _Module.RegisterServer (TRUE);
88*071d4279SBram Moolenaar 	if (FAILED (hRes))
89*071d4279SBram Moolenaar 		// Hack: When this fails we might be a normal user, while the
90*071d4279SBram Moolenaar 		// admin already registered the module.  Returning S_OK then
91*071d4279SBram Moolenaar 		// makes it work.  When the module was never registered it
92*071d4279SBram Moolenaar 		// will soon fail in another way.
93*071d4279SBram Moolenaar 		// old code: return hRes;
94*071d4279SBram Moolenaar 		return S_OK;
95*071d4279SBram Moolenaar 
96*071d4279SBram Moolenaar 	_ATL_OBJMAP_ENTRY *pEntry = _Module.m_pObjMap;
97*071d4279SBram Moolenaar 	CRegKey key;
98*071d4279SBram Moolenaar 	LONG lRes = key.Open (HKEY_CLASSES_ROOT, _T ("CLSID"));
99*071d4279SBram Moolenaar 
100*071d4279SBram Moolenaar 	if (lRes == ERROR_SUCCESS)
101*071d4279SBram Moolenaar 	{
102*071d4279SBram Moolenaar 		USES_CONVERSION;
103*071d4279SBram Moolenaar 		LPOLESTR lpOleStr;
104*071d4279SBram Moolenaar 
105*071d4279SBram Moolenaar 		StringFromCLSID (*pEntry->pclsid, &lpOleStr);
106*071d4279SBram Moolenaar 		LPTSTR lpsz = OLE2T (lpOleStr);
107*071d4279SBram Moolenaar 
108*071d4279SBram Moolenaar 		lRes = key.Open (key, lpsz);
109*071d4279SBram Moolenaar 		if (lRes == ERROR_SUCCESS)
110*071d4279SBram Moolenaar 		{
111*071d4279SBram Moolenaar 			CString strDescription;
112*071d4279SBram Moolenaar 
113*071d4279SBram Moolenaar 			strDescription.LoadString (IDS_VISVIM_DESCRIPTION);
114*071d4279SBram Moolenaar 			key.SetKeyValue (_T ("Description"), strDescription);
115*071d4279SBram Moolenaar 		}
116*071d4279SBram Moolenaar 		CoTaskMemFree (lpOleStr);
117*071d4279SBram Moolenaar 	}
118*071d4279SBram Moolenaar 
119*071d4279SBram Moolenaar 	if (lRes != ERROR_SUCCESS)
120*071d4279SBram Moolenaar 		hRes = HRESULT_FROM_WIN32 (lRes);
121*071d4279SBram Moolenaar 
122*071d4279SBram Moolenaar 	return hRes;
123*071d4279SBram Moolenaar 
124*071d4279SBram Moolenaar }
125*071d4279SBram Moolenaar 
126*071d4279SBram Moolenaar // DllUnregisterServer - Removes entries from the system registry
127*071d4279SBram Moolenaar //
DllUnregisterServer(void)128*071d4279SBram Moolenaar STDAPI DllUnregisterServer (void)
129*071d4279SBram Moolenaar {
130*071d4279SBram Moolenaar 	AFX_MANAGE_STATE (AfxGetStaticModuleState ());
131*071d4279SBram Moolenaar 
132*071d4279SBram Moolenaar 	HRESULT hRes = S_OK;
133*071d4279SBram Moolenaar 	_Module.UnregisterServer ();
134*071d4279SBram Moolenaar 	return hRes;
135*071d4279SBram Moolenaar }
136*071d4279SBram Moolenaar 
137*071d4279SBram Moolenaar 
138*071d4279SBram Moolenaar // Debugging support
139*071d4279SBram Moolenaar 
140*071d4279SBram Moolenaar // GetLastErrorDescription is used in the implementation of the VERIFY_OK
141*071d4279SBram Moolenaar //  macro, defined in stdafx.h.
142*071d4279SBram Moolenaar 
143*071d4279SBram Moolenaar #ifdef _DEBUG
144*071d4279SBram Moolenaar 
GetLastErrorDescription(CComBSTR & bstr)145*071d4279SBram Moolenaar void GetLastErrorDescription (CComBSTR & bstr)
146*071d4279SBram Moolenaar {
147*071d4279SBram Moolenaar 	CComPtr < IErrorInfo > pErrorInfo;
148*071d4279SBram Moolenaar 	if (GetErrorInfo (0, &pErrorInfo) == S_OK)
149*071d4279SBram Moolenaar 		pErrorInfo->GetDescription (&bstr);
150*071d4279SBram Moolenaar }
151*071d4279SBram Moolenaar 
152*071d4279SBram Moolenaar #endif //_DEBUG
153