annotate src/if_ole.cpp @ 2378:85b7dc8da5eb vim73

Add the 'concealcursor' option to decide when the cursor line is to be concealed or not. Rename 'conc' to 'cole' as the short name for 'conceallevel'.
author Bram Moolenaar <bram@vim.org>
date Fri, 23 Jul 2010 22:10:27 +0200
parents a0cce15dd2a9
children 499bff609a86
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9 #if defined(FEAT_OLE) && defined(FEAT_GUI_W32)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 * OLE server implementation.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13 * See os_mswin.c for the client side.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15
931
c5871806d7e6 updated for version 7.0-057
vimboss
parents: 919
diff changeset
16 /*
c5871806d7e6 updated for version 7.0-057
vimboss
parents: 919
diff changeset
17 * We have some trouble with order of includes here. For Borland it needs to
c5871806d7e6 updated for version 7.0-057
vimboss
parents: 919
diff changeset
18 * be different from MSVC...
c5871806d7e6 updated for version 7.0-057
vimboss
parents: 919
diff changeset
19 */
c5871806d7e6 updated for version 7.0-057
vimboss
parents: 919
diff changeset
20 #ifndef __BORLANDC__
919
3cd88bdcd97d updated for version 7.0-045
vimboss
parents: 859
diff changeset
21 extern "C" {
931
c5871806d7e6 updated for version 7.0-057
vimboss
parents: 919
diff changeset
22 # include "vim.h"
919
3cd88bdcd97d updated for version 7.0-045
vimboss
parents: 859
diff changeset
23 }
931
c5871806d7e6 updated for version 7.0-057
vimboss
parents: 919
diff changeset
24 #endif
919
3cd88bdcd97d updated for version 7.0-045
vimboss
parents: 859
diff changeset
25
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26 #include <windows.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27 #include <oleauto.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 extern "C" {
931
c5871806d7e6 updated for version 7.0-057
vimboss
parents: 919
diff changeset
30 #ifdef __BORLANDC__
c5871806d7e6 updated for version 7.0-057
vimboss
parents: 919
diff changeset
31 # include "vim.h"
c5871806d7e6 updated for version 7.0-057
vimboss
parents: 919
diff changeset
32 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33 extern HWND s_hwnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
34 extern HWND vim_parent_hwnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
35 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
36
2224
a0cce15dd2a9 Fix definition of UINT_PTR for 64 bit systems.
Bram Moolenaar <bram@vim.org>
parents: 1791
diff changeset
37 #if (defined(_MSC_VER) && _MSC_VER < 1300) || !defined(MAXULONG_PTR)
1569
9fbb40a1228a updated for version 7.1-282
vimboss
parents: 931
diff changeset
38 /* Work around old versions of basetsd.h which wrongly declares
9fbb40a1228a updated for version 7.1-282
vimboss
parents: 931
diff changeset
39 * UINT_PTR as unsigned long */
2224
a0cce15dd2a9 Fix definition of UINT_PTR for 64 bit systems.
Bram Moolenaar <bram@vim.org>
parents: 1791
diff changeset
40 # undef UINT_PTR
1569
9fbb40a1228a updated for version 7.1-282
vimboss
parents: 931
diff changeset
41 # define UINT_PTR UINT
9fbb40a1228a updated for version 7.1-282
vimboss
parents: 931
diff changeset
42 #endif
9fbb40a1228a updated for version 7.1-282
vimboss
parents: 931
diff changeset
43
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
44 #include "if_ole.h" // Interface definitions
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
45 #include "iid_ole.c" // UUID definitions (compile here)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
46
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
47 /* Supply function prototype to work around bug in Mingw oleauto.h header */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48 #ifdef __MINGW32__
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
49 WINOLEAUTAPI UnRegisterTypeLib(REFGUID libID, WORD wVerMajor,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50 WORD wVerMinor, LCID lcid, SYSKIND syskind);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
52
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
53 /*****************************************************************************
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
54 1. Internal definitions for this file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
55 *****************************************************************************/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 class CVim;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 class CVimCF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 /* Internal data */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61 // The identifier of the registered class factory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 static unsigned long cf_id = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64 // The identifier of the running application object
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 static unsigned long app_id = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 // The single global instance of the class factory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
68 static CVimCF *cf = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70 // The single global instance of the application object
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71 static CVim *app = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
72
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73 /* GUIDs, versions and type library information */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74 #define MYCLSID CLSID_Vim
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
75 #define MYLIBID LIBID_Vim
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 #define MYIID IID_IVim
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78 #define MAJORVER 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79 #define MINORVER 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80 #define LOCALE 0x0409
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 #define MYNAME "Vim"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83 #define MYPROGID "Vim.Application.1"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 #define MYVIPROGID "Vim.Application"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 #define MAX_CLSID_LEN 100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88 /*****************************************************************************
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 2. The application object
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 *****************************************************************************/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
91
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
92 /* Definition
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
93 * ----------
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
94 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
95
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
96 class CVim : public IVim
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
97 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98 public:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99 ~CVim();
380
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
100 static CVim *Create(int *pbDoRestart);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
102 // IUnknown members
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103 STDMETHOD(QueryInterface)(REFIID riid, void ** ppv);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 STDMETHOD_(unsigned long, AddRef)(void);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 STDMETHOD_(unsigned long, Release)(void);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 // IDispatch members
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 STDMETHOD(GetTypeInfoCount)(UINT *pCount);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
109 STDMETHOD(GetTypeInfo)(UINT iTypeInfo, LCID, ITypeInfo **ppITypeInfo);
380
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
110 STDMETHOD(GetIDsOfNames)(const IID &iid, OLECHAR **names, UINT n, LCID, DISPID *dispids);
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
111 STDMETHOD(Invoke)(DISPID member, const IID &iid, LCID, WORD flags, DISPPARAMS *dispparams, VARIANT *result, EXCEPINFO *excepinfo, UINT *argerr);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
112
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113 // IVim members
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
114 STDMETHOD(SendKeys)(BSTR keys);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115 STDMETHOD(Eval)(BSTR expr, BSTR *result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 STDMETHOD(SetForeground)(void);
1569
9fbb40a1228a updated for version 7.1-282
vimboss
parents: 931
diff changeset
117 STDMETHOD(GetHwnd)(UINT_PTR *result);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
118
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
119 private:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120 // Constructor is private - create using CVim::Create()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121 CVim() : ref(0), typeinfo(0) {};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123 // Reference count
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124 unsigned long ref;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
125
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
126 // The object's TypeInfo
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
127 ITypeInfo *typeinfo;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
128 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 /* Implementation
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 * --------------
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133
380
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
134 CVim *CVim::Create(int *pbDoRestart)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
135 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 HRESULT hr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137 CVim *me = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
138 ITypeLib *typelib = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
139 ITypeInfo *typeinfo = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
140
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141 *pbDoRestart = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
142
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
143 // Create the object
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
144 me = new CVim();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
145 if (me == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
146 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
147 MessageBox(0, "Cannot create application object", "Vim Initialisation", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
148 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151 // Load the type library from the registry
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 hr = LoadRegTypeLib(MYLIBID, 1, 0, 0x00, &typelib);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 if (FAILED(hr))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155 HKEY hKey;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 // Check we can write to the registry.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158 // RegCreateKeyEx succeeds even if key exists. W.Briscoe W2K 20021011
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159 if (RegCreateKeyEx(HKEY_CLASSES_ROOT, MYVIPROGID, 0, NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
162 delete me;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
163 return NULL; // Unable to write to registry. Quietly fail.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 RegCloseKey(hKey);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 if (MessageBox(0, "Cannot load registered type library.\nDo you want to register Vim now?",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168 "Vim Initialisation", MB_YESNO | MB_ICONQUESTION) != IDYES)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
170 delete me;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
172 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
173
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
174 RegisterMe(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
175
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176 // Load the type library from the registry
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177 hr = LoadRegTypeLib(MYLIBID, 1, 0, 0x00, &typelib);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
178 if (FAILED(hr))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
180 MessageBox(0, "You must restart Vim in order for the registration to take effect.",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
181 "Vim Initialisation", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182 *pbDoRestart = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183 delete me;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188 // Get the type info of the vtable interface
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189 hr = typelib->GetTypeInfoOfGuid(MYIID, &typeinfo);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 typelib->Release();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
191
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192 if (FAILED(hr))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
194 MessageBox(0, "Cannot get interface type information",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 "Vim Initialisation", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 delete me;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
197 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
200 // Save the type information
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 me->typeinfo = typeinfo;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 return me;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
205 CVim::~CVim()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
206 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207 if (typeinfo && vim_parent_hwnd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 typeinfo->Release();
380
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
209 typeinfo = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212 STDMETHODIMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213 CVim::QueryInterface(REFIID riid, void **ppv)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215 if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IDispatch) || IsEqualIID(riid, MYIID))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
217 AddRef();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 *ppv = this;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 return S_OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222 *ppv = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223 return E_NOINTERFACE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 STDMETHODIMP_(ULONG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 CVim::AddRef()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229 return ++ref;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 STDMETHODIMP_(ULONG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233 CVim::Release()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 // Don't delete the object when the reference count reaches zero, as there
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 // is only a single application object, and its lifetime is controlled by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 // the running instance, not by its reference count.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 if (ref > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 --ref;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 return ref;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 STDMETHODIMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 CVim::GetTypeInfoCount(UINT *pCount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 *pCount = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 return S_OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 STDMETHODIMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251 CVim::GetTypeInfo(UINT iTypeInfo, LCID, ITypeInfo **ppITypeInfo)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253 *ppITypeInfo = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 if (iTypeInfo != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 return DISP_E_BADINDEX;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 typeinfo->AddRef();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 *ppITypeInfo = typeinfo;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 return S_OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 STDMETHODIMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 CVim::GetIDsOfNames(
380
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
265 const IID &iid,
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
266 OLECHAR **names,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 UINT n,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 LCID,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 DISPID *dispids)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 if (iid != IID_NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 return DISP_E_UNKNOWNINTERFACE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 return typeinfo->GetIDsOfNames(names, n, dispids);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277 STDMETHODIMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 CVim::Invoke(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 DISPID member,
380
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
280 const IID &iid,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281 LCID,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282 WORD flags,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283 DISPPARAMS *dispparams,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 VARIANT *result,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 EXCEPINFO *excepinfo,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 UINT *argerr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 if (iid != IID_NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289 return DISP_E_UNKNOWNINTERFACE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 ::SetErrorInfo(0, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 return typeinfo->Invoke(static_cast<IDispatch*>(this),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 member, flags, dispparams,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 result, excepinfo, argerr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 STDMETHODIMP
1569
9fbb40a1228a updated for version 7.1-282
vimboss
parents: 931
diff changeset
298 CVim::GetHwnd(UINT_PTR *result)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 {
1569
9fbb40a1228a updated for version 7.1-282
vimboss
parents: 931
diff changeset
300 *result = (UINT_PTR)s_hwnd;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 return S_OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 STDMETHODIMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 CVim::SetForeground(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 /* Make the Vim window come to the foreground */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 gui_mch_set_foreground();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 return S_OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 STDMETHODIMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 CVim::SendKeys(BSTR keys)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 char *buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317 char_u *str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 /* Get a suitable buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 len = WideCharToMultiByte(CP_ACP, 0, keys, -1, 0, 0, 0, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 buffer = (char *)alloc(len+1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 if (buffer == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 return E_OUTOFMEMORY;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 len = WideCharToMultiByte(CP_ACP, 0, keys, -1, buffer, len, 0, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 if (len == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
332 return E_INVALIDARG;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 /* Translate key codes like <Esc> */
859
99305c4c42d4 updated for version 7.0g02
vimboss
parents: 714
diff changeset
336 str = replace_termcodes((char_u *)buffer, &ptr, FALSE, TRUE, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 /* If ptr was set, then a new buffer was allocated,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
339 * so we can free the old one.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
341 if (ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342 vim_free((char_u *)(buffer));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
343
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
344 /* Reject strings too long to fit in the input buffer. Allow 10 bytes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 * space to cover for the (remote) possibility that characters may enter
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346 * the input buffer between now and when the WM_OLE message is actually
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
347 * processed. If more that 10 characters enter the input buffer in that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
348 * time, the WM_OLE processing will simply fail to insert the characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350 if ((int)(STRLEN(str)) > (vim_free_in_input_buf() - 10))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
351 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
352 vim_free(str);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
353 return E_INVALIDARG;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
354 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
355
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
356 /* Pass the string to the main input loop. The memory will be freed when
1791
5e225f973b5d updated for version 7.2-089
vimboss
parents: 1569
diff changeset
357 * the message is processed. Except for an empty message, we don't need
5e225f973b5d updated for version 7.2-089
vimboss
parents: 1569
diff changeset
358 * to post it then.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
359 */
1791
5e225f973b5d updated for version 7.2-089
vimboss
parents: 1569
diff changeset
360 if (*str == NUL)
5e225f973b5d updated for version 7.2-089
vimboss
parents: 1569
diff changeset
361 vim_free(str);
5e225f973b5d updated for version 7.2-089
vimboss
parents: 1569
diff changeset
362 else
5e225f973b5d updated for version 7.2-089
vimboss
parents: 1569
diff changeset
363 PostMessage(NULL, WM_OLE, 0, (LPARAM)str);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 return S_OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
368 STDMETHODIMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369 CVim::Eval(BSTR expr, BSTR *result)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
370 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
371 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
372 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
373 char *buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374 char *str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
375 wchar_t *w_buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 /* Get a suitable buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378 len = WideCharToMultiByte(CP_ACP, 0, expr, -1, 0, 0, 0, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 if (len == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 return E_INVALIDARG;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382 buffer = (char *)alloc((unsigned)len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 if (buffer == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 return E_OUTOFMEMORY;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 /* Convert the (wide character) expression to an ASCII string */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388 len = WideCharToMultiByte(CP_ACP, 0, expr, -1, buffer, len, 0, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 if (len == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 return E_INVALIDARG;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392 /* Evaluate the expression */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
393 ++emsg_skip;
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 388
diff changeset
394 str = (char *)eval_to_string((char_u *)buffer, NULL, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 --emsg_skip;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
396 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
397 if (str == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398 return E_FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
400 /* Convert the result to wide characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 MultiByteToWideChar_alloc(CP_ACP, 0, str, -1, &w_buffer, &len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402 vim_free(str);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 if (w_buffer == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404 return E_OUTOFMEMORY;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
406 if (len == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408 vim_free(w_buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 return E_FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
411
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 /* Store the result */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413 *result = SysAllocString(w_buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
414 vim_free(w_buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
415
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 return S_OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
417 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418 return E_NOTIMPL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
420 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
421
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
422 /*****************************************************************************
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
423 3. The class factory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
424 *****************************************************************************/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
425
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
426 /* Definition
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
427 * ----------
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
428 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
429
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
430 class CVimCF : public IClassFactory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 public:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433 static CVimCF *Create();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 STDMETHOD(QueryInterface)(REFIID riid, void ** ppv);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 STDMETHOD_(unsigned long, AddRef)(void);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437 STDMETHOD_(unsigned long, Release)(void);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438 STDMETHOD(CreateInstance)(IUnknown *punkOuter, REFIID riid, void ** ppv);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439 STDMETHOD(LockServer)(BOOL lock);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
440
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441 private:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
442 // Constructor is private - create via Create()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443 CVimCF() : ref(0) {};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
444
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
445 // Reference count
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
446 unsigned long ref;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
447 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 /* Implementation
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
450 * --------------
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
452
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
453 CVimCF *CVimCF::Create()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
454 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 CVimCF *me = new CVimCF();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
456
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
457 if (me == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
458 MessageBox(0, "Cannot create class factory", "Vim Initialisation", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
459
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
460 return me;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
461 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
462
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
463 STDMETHODIMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
464 CVimCF::QueryInterface(REFIID riid, void **ppv)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
465 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
468 AddRef();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
469 *ppv = this;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
470 return S_OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
471 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
472
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
473 *ppv = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474 return E_NOINTERFACE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
475 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
476
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
477 STDMETHODIMP_(ULONG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
478 CVimCF::AddRef()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
479 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
480 return ++ref;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
482
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
483 STDMETHODIMP_(ULONG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
484 CVimCF::Release()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 // Don't delete the object when the reference count reaches zero, as there
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 // is only a single application object, and its lifetime is controlled by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 // the running instance, not by its reference count.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
489 if (ref > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
490 --ref;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491 return ref;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
492 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
493
322
a18bd33b8ea9 updated for version 7.0084
vimboss
parents: 7
diff changeset
494 /*ARGSUSED*/
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
495 STDMETHODIMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 CVimCF::CreateInstance(IUnknown *punkOuter, REFIID riid, void **ppv)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 return app->QueryInterface(riid, ppv);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
500
322
a18bd33b8ea9 updated for version 7.0084
vimboss
parents: 7
diff changeset
501 /*ARGSUSED*/
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 STDMETHODIMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503 CVimCF::LockServer(BOOL lock)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505 return S_OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
508 /*****************************************************************************
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 4. Registry manipulation code
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 *****************************************************************************/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
512 // Internal use only
380
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
513 static void SetKeyAndValue(const char *path, const char *subkey, const char *value);
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
514 static void GUIDtochar(const GUID &guid, char *GUID, int length);
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
515 static void RecursiveDeleteKey(HKEY hKeyParent, const char *child);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 static const int GUID_STRING_SIZE = 39;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518 // Register the component in the registry
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519 // When "silent" is TRUE don't give any messages.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
520
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 extern "C" void RegisterMe(int silent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 BOOL ok = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
525 // Get the application startup command
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 char module[MAX_PATH];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 ::GetModuleFileName(NULL, module, MAX_PATH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 // Unregister first (quietly)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531 UnregisterMe(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 // Convert the CLSID into a char
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
534 char clsid[GUID_STRING_SIZE];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 GUIDtochar(MYCLSID, clsid, sizeof(clsid));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 // Convert the LIBID into a char
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538 char libid[GUID_STRING_SIZE];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539 GUIDtochar(MYLIBID, libid, sizeof(libid));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
540
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
541 // Build the key CLSID\\{...}
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542 char Key[MAX_CLSID_LEN];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
543 strcpy(Key, "CLSID\\");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544 strcat(Key, clsid);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 // Add the CLSID to the registry
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 SetKeyAndValue(Key, NULL, MYNAME);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548 SetKeyAndValue(Key, "LocalServer32", module);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 SetKeyAndValue(Key, "ProgID", MYPROGID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550 SetKeyAndValue(Key, "VersionIndependentProgID", MYVIPROGID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551 SetKeyAndValue(Key, "TypeLib", libid);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 // Add the version-independent ProgID subkey under HKEY_CLASSES_ROOT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554 SetKeyAndValue(MYVIPROGID, NULL, MYNAME);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 SetKeyAndValue(MYVIPROGID, "CLSID", clsid);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 SetKeyAndValue(MYVIPROGID, "CurVer", MYPROGID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 // Add the versioned ProgID subkey under HKEY_CLASSES_ROOT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559 SetKeyAndValue(MYPROGID, NULL, MYNAME);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 SetKeyAndValue(MYPROGID, "CLSID", clsid);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
561
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
562 wchar_t w_module[MAX_PATH];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
563 MultiByteToWideChar(CP_ACP, 0, module, -1, w_module, MAX_PATH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
564
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
565 ITypeLib *typelib = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
566 if (LoadTypeLib(w_module, &typelib) != S_OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
567 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
568 if (!silent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
569 MessageBox(0, "Cannot load type library to register",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
570 "Vim Registration", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 ok = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575 if (RegisterTypeLib(typelib, w_module, NULL) != S_OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
577 if (!silent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 MessageBox(0, "Cannot register type library",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579 "Vim Registration", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
580 ok = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
581 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
582 typelib->Release();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
583 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 if (ok && !silent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586 MessageBox(0, "Registered successfully", "Vim", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
588
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
589 // Remove the component from the registry
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
590 //
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
591 // Note: There is little error checking in this code, to allow incomplete
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
592 // or failed registrations to be undone.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
593 extern "C" void UnregisterMe(int bNotifyUser)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
594 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
595 // Unregister the type library
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
596 ITypeLib *typelib;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597 if (SUCCEEDED(LoadRegTypeLib(MYLIBID, MAJORVER, MINORVER, LOCALE, &typelib)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 TLIBATTR *tla;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
600 if (SUCCEEDED(typelib->GetLibAttr(&tla)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 UnRegisterTypeLib(tla->guid, tla->wMajorVerNum, tla->wMinorVerNum,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 tla->lcid, tla->syskind);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
604 typelib->ReleaseTLibAttr(tla);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
605 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 typelib->Release();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 // Convert the CLSID into a char
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
610 char clsid[GUID_STRING_SIZE];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 GUIDtochar(MYCLSID, clsid, sizeof(clsid));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 // Build the key CLSID\\{...}
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614 char Key[MAX_CLSID_LEN];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615 strcpy(Key, "CLSID\\");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616 strcat(Key, clsid);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
617
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 // Delete the CLSID Key - CLSID\{...}
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619 RecursiveDeleteKey(HKEY_CLASSES_ROOT, Key);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621 // Delete the version-independent ProgID Key
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622 RecursiveDeleteKey(HKEY_CLASSES_ROOT, MYVIPROGID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
624 // Delete the ProgID key
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625 RecursiveDeleteKey(HKEY_CLASSES_ROOT, MYPROGID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627 if (bNotifyUser)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628 MessageBox(0, "Unregistered successfully", "Vim", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
630
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
631 /****************************************************************************/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633 // Convert a GUID to a char string
380
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
634 static void GUIDtochar(const GUID &guid, char *GUID, int length)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
636 // Get wide string version
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 LPOLESTR wGUID = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 StringFromCLSID(guid, &wGUID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
639
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
640 // Covert from wide characters to non-wide
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
641 wcstombs(GUID, wGUID, length);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643 // Free memory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644 CoTaskMemFree(wGUID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647 // Delete a key and all of its descendents
380
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
648 static void RecursiveDeleteKey(HKEY hKeyParent, const char *child)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
649 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650 // Open the child
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 HKEY hKeyChild;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 LONG result = RegOpenKeyEx(hKeyParent, child, 0, KEY_ALL_ACCESS, &hKeyChild);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 if (result != ERROR_SUCCESS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 // Enumerate all of the decendents of this child
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
657 FILETIME time;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
658 char buffer[1024];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
659 DWORD size = 1024;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661 while (RegEnumKeyEx(hKeyChild, 0, buffer, &size, NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 NULL, NULL, &time) == S_OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
663 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 // Delete the decendents of this child
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
665 RecursiveDeleteKey(hKeyChild, buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666 size = 256;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
667 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669 // Close the child
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670 RegCloseKey(hKeyChild);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 // Delete this child
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673 RegDeleteKey(hKeyParent, child);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
675
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
676 // Create a key and set its value
388
f92bb1845823 updated for version 7.0101
vimboss
parents: 380
diff changeset
677 static void SetKeyAndValue(const char *key, const char *subkey, const char *value)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
678 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
679 HKEY hKey;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680 char buffer[1024];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
681
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
682 strcpy(buffer, key);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
683
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
684 // Add subkey name to buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
685 if (subkey)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
686 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
687 strcat(buffer, "\\");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
688 strcat(buffer, subkey);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
689 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
690
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691 // Create and open key and subkey.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 long result = RegCreateKeyEx(HKEY_CLASSES_ROOT,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693 buffer,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694 0, NULL, REG_OPTION_NON_VOLATILE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 KEY_ALL_ACCESS, NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696 &hKey, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
697 if (result != ERROR_SUCCESS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
698 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
699
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
700 // Set the value
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701 if (value)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702 RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)value,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703 (DWORD)STRLEN(value)+1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
704
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705 RegCloseKey(hKey);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
707
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
708 /*****************************************************************************
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
709 5. OLE Initialisation and shutdown processing
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
710 *****************************************************************************/
380
da6e29ecd0fc updated for version 7.0099
vimboss
parents: 322
diff changeset
711 extern "C" void InitOLE(int *pbDoRestart)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 HRESULT hr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715 *pbDoRestart = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
717 // Initialize the OLE libraries
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
718 hr = OleInitialize(NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
719 if (FAILED(hr))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
720 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
721 MessageBox(0, "Cannot initialise OLE", "Vim Initialisation", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
722 goto error0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725 // Create the application object
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 app = CVim::Create(pbDoRestart);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
727 if (app == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
728 goto error1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730 // Create the class factory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
731 cf = CVimCF::Create();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
732 if (cf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
733 goto error1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
734
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735 // Register the class factory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
736 hr = CoRegisterClassObject(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
737 MYCLSID,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 cf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739 CLSCTX_LOCAL_SERVER,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740 REGCLS_MULTIPLEUSE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741 &cf_id);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
743 if (FAILED(hr))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
744 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745 MessageBox(0, "Cannot register class factory", "Vim Initialisation", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 goto error1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749 // Register the application object as active
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
750 hr = RegisterActiveObject(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
751 app,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
752 MYCLSID,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
753 NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 &app_id);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
755
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
756 if (FAILED(hr))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
757 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
758 MessageBox(0, "Cannot register application object", "Vim Initialisation", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
759 goto error1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
760 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
761
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
762 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
763
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
764 // Errors: tidy up as much as needed and return
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
765 error1:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
766 UninitOLE();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
767 error0:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
768 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
769 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
770
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
771 extern "C" void UninitOLE()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
772 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
773 // Unregister the application object
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
774 if (app_id)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
775 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
776 RevokeActiveObject(app_id, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
777 app_id = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
778 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
779
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
780 // Unregister the class factory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
781 if (cf_id)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
782 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
783 CoRevokeClassObject(cf_id);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
784 cf_id = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
785 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
786
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
787 // Shut down the OLE libraries
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
788 OleUninitialize();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
789
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
790 // Delete the application object
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
791 if (app)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
792 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
793 delete app;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
794 app = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
795 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
796
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
797 // Delete the class factory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
798 if (cf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
799 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
800 delete cf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
801 cf = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
802 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
803 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
804 #endif /* FEAT_OLE */