xref: /vim-8.2.3635/src/VisVim/OleAut.cpp (revision b49e3563)
1071d4279SBram Moolenaar //
2071d4279SBram Moolenaar // Class for creating OLE automation controllers.
3071d4279SBram Moolenaar //
4071d4279SBram Moolenaar // CreateObject() creates an automation object
5071d4279SBram Moolenaar // Invoke() will call a property or method of the automation object.
6071d4279SBram Moolenaar // GetProperty() returns a property
7071d4279SBram Moolenaar // SetProperty() changes a property
8071d4279SBram Moolenaar // Method() invokes a method
9071d4279SBram Moolenaar //
10071d4279SBram Moolenaar // For example, the following VB code will control Microsoft Word:
11071d4279SBram Moolenaar //
12071d4279SBram Moolenaar //    Private Sub Form_Load()
13071d4279SBram Moolenaar //    Dim wb As Object
14071d4279SBram Moolenaar //    Set wb = CreateObject("Word.Basic")
15071d4279SBram Moolenaar //    wb.AppShow
16071d4279SBram Moolenaar //    wb.FileNewDefault
17071d4279SBram Moolenaar //    wb.Insert "This is a test"
18071d4279SBram Moolenaar //    wb.FileSaveAs "c:\sample.doc)"
19071d4279SBram Moolenaar //    End Sub
20071d4279SBram Moolenaar //
21071d4279SBram Moolenaar // A C++ automation controller that does the same can be written as follows:
22071d4279SBram Moolenaar // the helper functions:
23071d4279SBram Moolenaar //
24071d4279SBram Moolenaar //   Void FormLoad ()
25071d4279SBram Moolenaar //   {
26071d4279SBram Moolenaar //       COleAutomationControl Aut;
27071d4279SBram Moolenaar //       Aut.CreateObject("Word.Basic");
28071d4279SBram Moolenaar //       Aut.Method ("AppShow");
29071d4279SBram Moolenaar //       Aut.Method ("FileNewDefault");
30071d4279SBram Moolenaar //       Aut.Method ("Insert", "s", (LPOLESTR) OLESTR ("This is a test"));
31071d4279SBram Moolenaar //       Aut.Method ("FileSaveAs", "s", OLESTR ("c:\\sample.doc"));
32071d4279SBram Moolenaar //   }
33071d4279SBram Moolenaar //
34071d4279SBram Moolenaar //
35071d4279SBram Moolenaar 
36071d4279SBram Moolenaar #include "stdafx.h"
37071d4279SBram Moolenaar #include <stdarg.h>
38071d4279SBram Moolenaar #include "oleaut.h"
39071d4279SBram Moolenaar 
40071d4279SBram Moolenaar #ifdef _DEBUG
41071d4279SBram Moolenaar #define new DEBUG_NEW
42071d4279SBram Moolenaar #undef THIS_FILE
43071d4279SBram Moolenaar static char THIS_FILE[] = __FILE__;
44071d4279SBram Moolenaar #endif
45071d4279SBram Moolenaar 
46071d4279SBram Moolenaar 
47071d4279SBram Moolenaar static bool CountArgsInFormat (LPCTSTR Format, UINT* nArgs);
48071d4279SBram Moolenaar static LPCTSTR GetNextVarType (LPCTSTR Format, VARTYPE* pVarType);
49071d4279SBram Moolenaar 
50071d4279SBram Moolenaar 
COleAutomationControl()51071d4279SBram Moolenaar COleAutomationControl::COleAutomationControl ()
52071d4279SBram Moolenaar {
53071d4279SBram Moolenaar 	m_pDispatch = NULL;
54071d4279SBram Moolenaar 	m_hResult = NOERROR;
55071d4279SBram Moolenaar 	m_nErrArg = 0;
56071d4279SBram Moolenaar 	VariantInit (&m_VariantResult);
57071d4279SBram Moolenaar }
58071d4279SBram Moolenaar 
~COleAutomationControl()59071d4279SBram Moolenaar COleAutomationControl::~COleAutomationControl ()
60071d4279SBram Moolenaar {
61071d4279SBram Moolenaar 	DeleteObject ();
62071d4279SBram Moolenaar }
63071d4279SBram Moolenaar 
DeleteObject()64071d4279SBram Moolenaar void COleAutomationControl::DeleteObject ()
65071d4279SBram Moolenaar {
66071d4279SBram Moolenaar 	if (m_pDispatch)
67071d4279SBram Moolenaar 	{
68071d4279SBram Moolenaar 		m_pDispatch->Release ();
69071d4279SBram Moolenaar 		m_pDispatch = NULL;
70071d4279SBram Moolenaar 	}
71071d4279SBram Moolenaar }
72071d4279SBram Moolenaar 
73071d4279SBram Moolenaar // Creates an instance of the Automation object and
74*b49e3563SBram Moolenaar // obtains its IDispatch interface.
75071d4279SBram Moolenaar //
76071d4279SBram Moolenaar // Parameters:
77071d4279SBram Moolenaar // ProgId	  ProgID of Automation object
78071d4279SBram Moolenaar //
CreateObject(char * ProgId)79071d4279SBram Moolenaar bool COleAutomationControl::CreateObject (char* ProgId)
80071d4279SBram Moolenaar {
81071d4279SBram Moolenaar 	CLSID ClsId;			// CLSID of automation object
82071d4279SBram Moolenaar 	LPUNKNOWN pUnknown = NULL;	// IUnknown of automation object
83071d4279SBram Moolenaar 
84071d4279SBram Moolenaar 	// Retrieve CLSID from the progID that the user specified
85071d4279SBram Moolenaar 	LPOLESTR OleProgId = TO_OLE_STR (ProgId);
86071d4279SBram Moolenaar 	m_hResult = CLSIDFromProgID (OleProgId, &ClsId);
87071d4279SBram Moolenaar 	if (FAILED (m_hResult))
88071d4279SBram Moolenaar 		goto error;
89071d4279SBram Moolenaar 
90071d4279SBram Moolenaar 	// Create an instance of the automation object and ask for the
91071d4279SBram Moolenaar 	// IDispatch interface
92071d4279SBram Moolenaar 	m_hResult = CoCreateInstance (ClsId, NULL, CLSCTX_SERVER,
93071d4279SBram Moolenaar 			       IID_IUnknown, (void**) &pUnknown);
94071d4279SBram Moolenaar 	if (FAILED (m_hResult))
95071d4279SBram Moolenaar 		goto error;
96071d4279SBram Moolenaar 
97071d4279SBram Moolenaar 	m_hResult = pUnknown->QueryInterface (IID_IDispatch, (void**) &m_pDispatch);
98071d4279SBram Moolenaar 	if (FAILED (m_hResult))
99071d4279SBram Moolenaar 		goto error;
100071d4279SBram Moolenaar 
101071d4279SBram Moolenaar 	pUnknown->Release ();
102071d4279SBram Moolenaar 	return true;
103071d4279SBram Moolenaar 
104071d4279SBram Moolenaar error:
105071d4279SBram Moolenaar 	if (pUnknown)
106071d4279SBram Moolenaar 		pUnknown->Release ();
107071d4279SBram Moolenaar 	if (m_pDispatch)
108071d4279SBram Moolenaar 		m_pDispatch->Release ();
109071d4279SBram Moolenaar 	return false;
110071d4279SBram Moolenaar }
111071d4279SBram Moolenaar 
112071d4279SBram Moolenaar // Return the dispatch id of a named service
113071d4279SBram Moolenaar // This id can be used in subsequent calls to GetProperty (), SetProperty () and
114933eb39dSBram Moolenaar // Method (). This is the preferred method when performance is important.
115071d4279SBram Moolenaar //
GetDispatchId(char * Name)116071d4279SBram Moolenaar DISPID COleAutomationControl::GetDispatchId (char* Name)
117071d4279SBram Moolenaar {
118071d4279SBram Moolenaar 	DISPID DispatchId;
119071d4279SBram Moolenaar 
120071d4279SBram Moolenaar 	ASSERT (m_pDispatch);
121071d4279SBram Moolenaar 
122071d4279SBram Moolenaar 	// Get DISPID of property/method
123071d4279SBram Moolenaar 	LPOLESTR OleName = TO_OLE_STR (Name);
124071d4279SBram Moolenaar 	m_hResult = m_pDispatch->GetIDsOfNames (IID_NULL, &OleName, 1,
125071d4279SBram Moolenaar 						LOCALE_USER_DEFAULT, &DispatchId);
126071d4279SBram Moolenaar 	if (FAILED (m_hResult))
127071d4279SBram Moolenaar 		return NULL;
128071d4279SBram Moolenaar 	return DispatchId;
129071d4279SBram Moolenaar }
130071d4279SBram Moolenaar 
131071d4279SBram Moolenaar //  The following functions use these parameters:
132071d4279SBram Moolenaar //
133071d4279SBram Moolenaar // Parameters:
134071d4279SBram Moolenaar //
135071d4279SBram Moolenaar //  Name      Name of property or method.
136071d4279SBram Moolenaar //
137071d4279SBram Moolenaar //  Format    Format string that describes the variable list of parameters that
138933eb39dSBram Moolenaar //	      follows. The format string can contain the following characters.
139071d4279SBram Moolenaar //	      & = mark the following format character as VT_BYREF
140071d4279SBram Moolenaar //	      B = VT_BOOL
141071d4279SBram Moolenaar //	      i = VT_I2
142071d4279SBram Moolenaar //	      I = VT_I4
143071d4279SBram Moolenaar //	      r = VT_R2
144071d4279SBram Moolenaar //	      R = VT_R4
145071d4279SBram Moolenaar //	      c = VT_CY
146071d4279SBram Moolenaar //	      s = VT_BSTR (string pointer can be passed,
147071d4279SBram Moolenaar //			BSTR will be allocated by this function).
148071d4279SBram Moolenaar //	      e = VT_ERROR
149071d4279SBram Moolenaar //	      d = VT_DATE
150071d4279SBram Moolenaar //	      v = VT_VARIANT. Use this to pass data types that are not described
151071d4279SBram Moolenaar //			in the format string. (For example SafeArrays).
152071d4279SBram Moolenaar //	      D = VT_DISPATCH
153071d4279SBram Moolenaar //	      U = VT_UNKNOWN
154071d4279SBram Moolenaar //
155071d4279SBram Moolenaar //  ...       Arguments of the property or method.
156071d4279SBram Moolenaar //	      Arguments are described by Format.
157071d4279SBram Moolenaar //
158071d4279SBram Moolenaar 
GetProperty(char * Name)159071d4279SBram Moolenaar bool COleAutomationControl::GetProperty (char* Name)
160071d4279SBram Moolenaar {
161071d4279SBram Moolenaar 	return Invoke (DISPATCH_PROPERTYGET, Name, NULL, NULL);
162071d4279SBram Moolenaar }
163071d4279SBram Moolenaar 
GetProperty(DISPID DispatchId)164071d4279SBram Moolenaar bool COleAutomationControl::GetProperty (DISPID DispatchId)
165071d4279SBram Moolenaar {
166071d4279SBram Moolenaar 	return Invoke (DISPATCH_PROPERTYGET, DispatchId, NULL, NULL);
167071d4279SBram Moolenaar }
168071d4279SBram Moolenaar 
PutProperty(char * Name,LPCTSTR Format,...)169071d4279SBram Moolenaar bool COleAutomationControl::PutProperty (char* Name, LPCTSTR Format, ...)
170071d4279SBram Moolenaar {
171071d4279SBram Moolenaar 	va_list ArgList;
172071d4279SBram Moolenaar 
173071d4279SBram Moolenaar 	va_start (ArgList, Format);
174071d4279SBram Moolenaar 	bool bRet = Invoke (DISPATCH_PROPERTYPUT, Name, Format, ArgList);
175071d4279SBram Moolenaar 	va_end (ArgList);
176071d4279SBram Moolenaar 	return bRet;
177071d4279SBram Moolenaar }
178071d4279SBram Moolenaar 
PutProperty(DISPID DispatchId,LPCTSTR Format,...)179071d4279SBram Moolenaar bool COleAutomationControl::PutProperty (DISPID DispatchId, LPCTSTR Format, ...)
180071d4279SBram Moolenaar {
181071d4279SBram Moolenaar 	va_list ArgList;
182071d4279SBram Moolenaar 
183071d4279SBram Moolenaar 	va_start (ArgList, Format);
184071d4279SBram Moolenaar 	bool bRet = Invoke (DISPATCH_PROPERTYPUT, DispatchId, Format, ArgList);
185071d4279SBram Moolenaar 	va_end (ArgList);
186071d4279SBram Moolenaar 	return bRet;
187071d4279SBram Moolenaar }
188071d4279SBram Moolenaar 
Method(char * Name,LPCTSTR Format,...)189071d4279SBram Moolenaar bool COleAutomationControl::Method (char* Name, LPCTSTR Format, ...)
190071d4279SBram Moolenaar {
191071d4279SBram Moolenaar 	va_list ArgList;
192071d4279SBram Moolenaar 
193071d4279SBram Moolenaar 	va_start (ArgList, Format);
194071d4279SBram Moolenaar 	bool bRet = Invoke (DISPATCH_METHOD, Name, Format, ArgList);
195071d4279SBram Moolenaar 	va_end (ArgList);
196071d4279SBram Moolenaar 	return bRet;
197071d4279SBram Moolenaar }
198071d4279SBram Moolenaar 
Method(DISPID DispatchId,LPCTSTR Format,...)199071d4279SBram Moolenaar bool COleAutomationControl::Method (DISPID DispatchId, LPCTSTR Format, ...)
200071d4279SBram Moolenaar {
201071d4279SBram Moolenaar 	va_list ArgList;
202071d4279SBram Moolenaar 
203071d4279SBram Moolenaar 	va_start (ArgList, Format);
204071d4279SBram Moolenaar 	bool bRet = Invoke (DISPATCH_METHOD, DispatchId, Format, ArgList);
205071d4279SBram Moolenaar 	va_end (ArgList);
206071d4279SBram Moolenaar 	return bRet;
207071d4279SBram Moolenaar }
208071d4279SBram Moolenaar 
Invoke(WORD Flags,char * Name,LPCTSTR Format,va_list ArgList)209071d4279SBram Moolenaar bool COleAutomationControl::Invoke (WORD Flags, char* Name,
210071d4279SBram Moolenaar 				    LPCTSTR Format, va_list ArgList)
211071d4279SBram Moolenaar {
212071d4279SBram Moolenaar 	DISPID DispatchId = GetDispatchId (Name);
213071d4279SBram Moolenaar 	if (! DispatchId)
214071d4279SBram Moolenaar 		return false;
215071d4279SBram Moolenaar 	return Invoke (Flags, DispatchId, Format, ArgList);
216071d4279SBram Moolenaar }
217071d4279SBram Moolenaar 
Invoke(WORD Flags,DISPID DispatchId,LPCTSTR Format,va_list ArgList)218071d4279SBram Moolenaar bool COleAutomationControl::Invoke (WORD Flags, DISPID DispatchId,
219071d4279SBram Moolenaar 				    LPCTSTR Format, va_list ArgList)
220071d4279SBram Moolenaar {
221071d4279SBram Moolenaar 	UINT ArgCount = 0;
222071d4279SBram Moolenaar 	VARIANTARG* ArgVector = NULL;
223071d4279SBram Moolenaar 
224071d4279SBram Moolenaar 	ASSERT (m_pDispatch);
225071d4279SBram Moolenaar 
226071d4279SBram Moolenaar 	DISPPARAMS DispatchParams;
227071d4279SBram Moolenaar 	memset (&DispatchParams, 0, sizeof (DispatchParams));
228071d4279SBram Moolenaar 
229071d4279SBram Moolenaar 	// Determine number of arguments
230071d4279SBram Moolenaar 	if (Format)
231071d4279SBram Moolenaar 		CountArgsInFormat (Format, &ArgCount);
232071d4279SBram Moolenaar 
233071d4279SBram Moolenaar 	// Property puts have a named argument that represents the value that
234071d4279SBram Moolenaar 	// the property is being assigned.
235071d4279SBram Moolenaar 	DISPID DispIdNamed = DISPID_PROPERTYPUT;
236071d4279SBram Moolenaar 	if (Flags & DISPATCH_PROPERTYPUT)
237071d4279SBram Moolenaar 	{
238071d4279SBram Moolenaar 		if (ArgCount == 0)
239071d4279SBram Moolenaar 		{
240071d4279SBram Moolenaar 			m_hResult = ResultFromScode (E_INVALIDARG);
241071d4279SBram Moolenaar 			return false;
242071d4279SBram Moolenaar 		}
243071d4279SBram Moolenaar 		DispatchParams.cNamedArgs = 1;
244071d4279SBram Moolenaar 		DispatchParams.rgdispidNamedArgs = &DispIdNamed;
245071d4279SBram Moolenaar 	}
246071d4279SBram Moolenaar 
247071d4279SBram Moolenaar 	if (ArgCount)
248071d4279SBram Moolenaar 	{
249071d4279SBram Moolenaar 		// Allocate memory for all VARIANTARG parameters
250071d4279SBram Moolenaar 		ArgVector = (VARIANTARG*) CoTaskMemAlloc (
251071d4279SBram Moolenaar 				ArgCount * sizeof (VARIANTARG));
252071d4279SBram Moolenaar 		if (! ArgVector)
253071d4279SBram Moolenaar 		{
254071d4279SBram Moolenaar 			m_hResult = ResultFromScode (E_OUTOFMEMORY);
255071d4279SBram Moolenaar 			return false;
256071d4279SBram Moolenaar 		}
257071d4279SBram Moolenaar 		memset (ArgVector, 0, sizeof (VARIANTARG) * ArgCount);
258071d4279SBram Moolenaar 
259071d4279SBram Moolenaar 		// Get ready to walk vararg list
260071d4279SBram Moolenaar 		LPCTSTR s = Format;
261071d4279SBram Moolenaar 
262071d4279SBram Moolenaar 		VARIANTARG *p = ArgVector + ArgCount - 1;  // Params go in opposite order
263071d4279SBram Moolenaar 
264071d4279SBram Moolenaar 		for (;;)
265071d4279SBram Moolenaar 		{
266071d4279SBram Moolenaar 			VariantInit (p);
267071d4279SBram Moolenaar 			if (! (s = GetNextVarType (s, &p->vt)))
268071d4279SBram Moolenaar 				break;
269071d4279SBram Moolenaar 
270071d4279SBram Moolenaar 			if (p < ArgVector)
271071d4279SBram Moolenaar 			{
272071d4279SBram Moolenaar 				m_hResult = ResultFromScode (E_INVALIDARG);
273071d4279SBram Moolenaar 				goto Cleanup;
274071d4279SBram Moolenaar 			}
275071d4279SBram Moolenaar 			switch (p->vt)
276071d4279SBram Moolenaar 			{
277071d4279SBram Moolenaar 			    case VT_I2:
278071d4279SBram Moolenaar 				V_I2 (p) = va_arg (ArgList, short);
279071d4279SBram Moolenaar 				break;
280071d4279SBram Moolenaar 			    case VT_I4:
281071d4279SBram Moolenaar 				V_I4 (p) = va_arg (ArgList, long);
282071d4279SBram Moolenaar 				break;
283071d4279SBram Moolenaar 			    case VT_R4:
284071d4279SBram Moolenaar 				V_R4 (p) = va_arg (ArgList, float);
285071d4279SBram Moolenaar 				break;
286071d4279SBram Moolenaar 			    case VT_DATE:
287071d4279SBram Moolenaar 			    case VT_R8:
288071d4279SBram Moolenaar 				V_R8 (p) = va_arg (ArgList, double);
289071d4279SBram Moolenaar 				break;
290071d4279SBram Moolenaar 			    case VT_CY:
291071d4279SBram Moolenaar 				V_CY (p) = va_arg (ArgList, CY);
292071d4279SBram Moolenaar 				break;
293071d4279SBram Moolenaar 			    case VT_BSTR:
294071d4279SBram Moolenaar 				V_BSTR (p) = SysAllocString (va_arg (ArgList,
295071d4279SBram Moolenaar 								     OLECHAR*));
296071d4279SBram Moolenaar 				if (! p->bstrVal)
297071d4279SBram Moolenaar 				{
298071d4279SBram Moolenaar 					m_hResult = ResultFromScode (E_OUTOFMEMORY);
299071d4279SBram Moolenaar 					p->vt = VT_EMPTY;
300071d4279SBram Moolenaar 					goto Cleanup;
301071d4279SBram Moolenaar 				}
302071d4279SBram Moolenaar 				break;
303071d4279SBram Moolenaar 			    case VT_DISPATCH:
304071d4279SBram Moolenaar 				V_DISPATCH (p) = va_arg (ArgList, LPDISPATCH);
305071d4279SBram Moolenaar 				break;
306071d4279SBram Moolenaar 			    case VT_ERROR:
307071d4279SBram Moolenaar 				V_ERROR (p) = va_arg (ArgList, SCODE);
308071d4279SBram Moolenaar 				break;
309071d4279SBram Moolenaar 			    case VT_BOOL:
310071d4279SBram Moolenaar 				V_BOOL (p) = va_arg (ArgList, BOOL) ? -1 : 0;
311071d4279SBram Moolenaar 				break;
312071d4279SBram Moolenaar 			    case VT_VARIANT:
313071d4279SBram Moolenaar 				*p = va_arg (ArgList, VARIANTARG);
314071d4279SBram Moolenaar 				break;
315071d4279SBram Moolenaar 			    case VT_UNKNOWN:
316071d4279SBram Moolenaar 				V_UNKNOWN (p) = va_arg (ArgList, LPUNKNOWN);
317071d4279SBram Moolenaar 				break;
318071d4279SBram Moolenaar 
319071d4279SBram Moolenaar 			    case VT_I2 | VT_BYREF:
320071d4279SBram Moolenaar 				V_I2REF (p) = va_arg (ArgList, short*);
321071d4279SBram Moolenaar 				break;
322071d4279SBram Moolenaar 			    case VT_I4 | VT_BYREF:
323071d4279SBram Moolenaar 				V_I4REF (p) = va_arg (ArgList, long*);
324071d4279SBram Moolenaar 				break;
325071d4279SBram Moolenaar 			    case VT_R4 | VT_BYREF:
326071d4279SBram Moolenaar 				V_R4REF (p) = va_arg (ArgList, float*);
327071d4279SBram Moolenaar 				break;
328071d4279SBram Moolenaar 			    case VT_R8 | VT_BYREF:
329071d4279SBram Moolenaar 				V_R8REF (p) = va_arg (ArgList, double*);
330071d4279SBram Moolenaar 				break;
331071d4279SBram Moolenaar 			    case VT_DATE | VT_BYREF:
332071d4279SBram Moolenaar 				V_DATEREF (p) = va_arg (ArgList, DATE*);
333071d4279SBram Moolenaar 				break;
334071d4279SBram Moolenaar 			    case VT_CY | VT_BYREF:
335071d4279SBram Moolenaar 				V_CYREF (p) = va_arg (ArgList, CY*);
336071d4279SBram Moolenaar 				break;
337071d4279SBram Moolenaar 			    case VT_BSTR | VT_BYREF:
338071d4279SBram Moolenaar 				V_BSTRREF (p) = va_arg (ArgList, BSTR*);
339071d4279SBram Moolenaar 				break;
340071d4279SBram Moolenaar 			    case VT_DISPATCH | VT_BYREF:
341071d4279SBram Moolenaar 				V_DISPATCHREF (p) = va_arg (ArgList, LPDISPATCH*);
342071d4279SBram Moolenaar 				break;
343071d4279SBram Moolenaar 			    case VT_ERROR | VT_BYREF:
344071d4279SBram Moolenaar 				V_ERRORREF (p) = va_arg (ArgList, SCODE*);
345071d4279SBram Moolenaar 				break;
346071d4279SBram Moolenaar 			    case VT_BOOL | VT_BYREF:
347071d4279SBram Moolenaar 				{
348071d4279SBram Moolenaar 					BOOL* pBool = va_arg (ArgList, BOOL*);
349071d4279SBram Moolenaar 
350071d4279SBram Moolenaar 					*pBool = 0;
351071d4279SBram Moolenaar 					V_BOOLREF (p) = (VARIANT_BOOL*) pBool;
352071d4279SBram Moolenaar 				}
353071d4279SBram Moolenaar 				break;
354071d4279SBram Moolenaar 			    case VT_VARIANT | VT_BYREF:
355071d4279SBram Moolenaar 				V_VARIANTREF (p) = va_arg (ArgList, VARIANTARG*);
356071d4279SBram Moolenaar 				break;
357071d4279SBram Moolenaar 			    case VT_UNKNOWN | VT_BYREF:
358071d4279SBram Moolenaar 				V_UNKNOWNREF (p) = va_arg (ArgList, LPUNKNOWN*);
359071d4279SBram Moolenaar 				break;
360071d4279SBram Moolenaar 
361071d4279SBram Moolenaar 			    default:
362071d4279SBram Moolenaar 				{
363071d4279SBram Moolenaar 					m_hResult = ResultFromScode (E_INVALIDARG);
364071d4279SBram Moolenaar 					goto Cleanup;
365071d4279SBram Moolenaar 				}
366071d4279SBram Moolenaar 				break;
367071d4279SBram Moolenaar 			}
368071d4279SBram Moolenaar 
369071d4279SBram Moolenaar 			--p;	// Get ready to fill next argument
370071d4279SBram Moolenaar 		}
371071d4279SBram Moolenaar 	}
372071d4279SBram Moolenaar 
373071d4279SBram Moolenaar 	DispatchParams.cArgs = ArgCount;
374071d4279SBram Moolenaar 	DispatchParams.rgvarg = ArgVector;
375071d4279SBram Moolenaar 
376071d4279SBram Moolenaar 	// Initialize return variant, in case caller forgot. Caller can pass
377071d4279SBram Moolenaar 	// NULL if return value is not expected.
378071d4279SBram Moolenaar 	VariantInit (&m_VariantResult);
379071d4279SBram Moolenaar 
380071d4279SBram Moolenaar 	// Make the call
381071d4279SBram Moolenaar 	m_hResult = m_pDispatch->Invoke (DispatchId, IID_NULL, LOCALE_USER_DEFAULT,
382071d4279SBram Moolenaar 					 Flags, &DispatchParams, &m_VariantResult,
383071d4279SBram Moolenaar 					 &m_ExceptionInfo, &m_nErrArg);
384071d4279SBram Moolenaar 
385071d4279SBram Moolenaar     Cleanup:
386071d4279SBram Moolenaar 	// Cleanup any arguments that need cleanup
387071d4279SBram Moolenaar 	if (ArgCount)
388071d4279SBram Moolenaar 	{
389071d4279SBram Moolenaar 		VARIANTARG* p = ArgVector;
390071d4279SBram Moolenaar 
391071d4279SBram Moolenaar 		while (ArgCount--)
392071d4279SBram Moolenaar 		{
393071d4279SBram Moolenaar 			switch (p->vt)
394071d4279SBram Moolenaar 			{
395071d4279SBram Moolenaar 			    case VT_BSTR:
396071d4279SBram Moolenaar 				VariantClear (p);
397071d4279SBram Moolenaar 				break;
398071d4279SBram Moolenaar 			}
399071d4279SBram Moolenaar 			++p;
400071d4279SBram Moolenaar 		}
401071d4279SBram Moolenaar 		CoTaskMemFree (ArgVector);
402071d4279SBram Moolenaar 	}
403071d4279SBram Moolenaar 
404071d4279SBram Moolenaar 	return FAILED (m_hResult) ? false : true;
405071d4279SBram Moolenaar }
406071d4279SBram Moolenaar 
407071d4279SBram Moolenaar #define CASE_SCODE(sc)  \
408071d4279SBram Moolenaar 	case sc: \
409071d4279SBram Moolenaar 	lstrcpy((char*)ErrName, (char*)#sc); \
410071d4279SBram Moolenaar 	break;
411071d4279SBram Moolenaar 
ErrDiag()412071d4279SBram Moolenaar void COleAutomationControl::ErrDiag ()
413071d4279SBram Moolenaar {
414071d4279SBram Moolenaar 	char ErrName[200];
415071d4279SBram Moolenaar 
416071d4279SBram Moolenaar 	SCODE sc = GetScode (m_hResult);
417071d4279SBram Moolenaar 	switch (sc)
418071d4279SBram Moolenaar 	{
419071d4279SBram Moolenaar 	    // SCODE's defined in SCODE.H
420071d4279SBram Moolenaar 	    CASE_SCODE (S_OK)
421071d4279SBram Moolenaar 	    CASE_SCODE (S_FALSE)
422071d4279SBram Moolenaar 	    CASE_SCODE (E_UNEXPECTED)
423071d4279SBram Moolenaar 	    CASE_SCODE (E_OUTOFMEMORY)
424071d4279SBram Moolenaar 	    CASE_SCODE (E_INVALIDARG)
425071d4279SBram Moolenaar 	    CASE_SCODE (E_NOINTERFACE)
426071d4279SBram Moolenaar 	    CASE_SCODE (E_POINTER)
427071d4279SBram Moolenaar 	    CASE_SCODE (E_HANDLE)
428071d4279SBram Moolenaar 	    CASE_SCODE (E_ABORT)
429071d4279SBram Moolenaar 	    CASE_SCODE (E_FAIL)
430071d4279SBram Moolenaar 	    CASE_SCODE (E_ACCESSDENIED)
431071d4279SBram Moolenaar 
432071d4279SBram Moolenaar 	    // SCODE's defined in OLE2.H
433071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_OLEVERB)
434071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_ADVF)
435071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_ENUM_NOMORE)
436071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_ADVISENOTSUPPORTED)
437071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_NOCONNECTION)
438071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_NOTRUNNING)
439071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_NOCACHE)
440071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_BLANK)
441071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_CLASSDIFF)
442071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_CANT_GETMONIKER)
443071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_CANT_BINDTOSOURCE)
444071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_STATIC)
445071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_PROMPTSAVECANCELLED)
446071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_INVALIDRECT)
447071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_WRONGCOMPOBJ)
448071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_INVALIDHWND)
449071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_NOT_INPLACEACTIVE)
450071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_CANTCONVERT)
451071d4279SBram Moolenaar 	    CASE_SCODE (OLE_E_NOSTORAGE)
452071d4279SBram Moolenaar 
453071d4279SBram Moolenaar 	    CASE_SCODE (DV_E_FORMATETC)
454071d4279SBram Moolenaar 	    CASE_SCODE (DV_E_DVTARGETDEVICE)
455071d4279SBram Moolenaar 	    CASE_SCODE (DV_E_STGMEDIUM)
456071d4279SBram Moolenaar 	    CASE_SCODE (DV_E_STATDATA)
457071d4279SBram Moolenaar 	    CASE_SCODE (DV_E_LINDEX)
458071d4279SBram Moolenaar 	    CASE_SCODE (DV_E_TYMED)
459071d4279SBram Moolenaar 	    CASE_SCODE (DV_E_CLIPFORMAT)
460071d4279SBram Moolenaar 	    CASE_SCODE (DV_E_DVASPECT)
461071d4279SBram Moolenaar 	    CASE_SCODE (DV_E_DVTARGETDEVICE_SIZE)
462071d4279SBram Moolenaar 	    CASE_SCODE (DV_E_NOIVIEWOBJECT)
463071d4279SBram Moolenaar 
464071d4279SBram Moolenaar 	    CASE_SCODE (OLE_S_USEREG)
465071d4279SBram Moolenaar 	    CASE_SCODE (OLE_S_STATIC)
466071d4279SBram Moolenaar 	    CASE_SCODE (OLE_S_MAC_CLIPFORMAT)
467071d4279SBram Moolenaar 
468071d4279SBram Moolenaar 	    CASE_SCODE (CONVERT10_E_OLESTREAM_GET)
469071d4279SBram Moolenaar 	    CASE_SCODE (CONVERT10_E_OLESTREAM_PUT)
470071d4279SBram Moolenaar 	    CASE_SCODE (CONVERT10_E_OLESTREAM_FMT)
471071d4279SBram Moolenaar 	    CASE_SCODE (CONVERT10_E_OLESTREAM_BITMAP_TO_DIB)
472071d4279SBram Moolenaar 	    CASE_SCODE (CONVERT10_E_STG_FMT)
473071d4279SBram Moolenaar 	    CASE_SCODE (CONVERT10_E_STG_NO_STD_STREAM)
474071d4279SBram Moolenaar 	    CASE_SCODE (CONVERT10_E_STG_DIB_TO_BITMAP)
475071d4279SBram Moolenaar 	    CASE_SCODE (CONVERT10_S_NO_PRESENTATION)
476071d4279SBram Moolenaar 
477071d4279SBram Moolenaar 	    CASE_SCODE (CLIPBRD_E_CANT_OPEN)
478071d4279SBram Moolenaar 	    CASE_SCODE (CLIPBRD_E_CANT_EMPTY)
479071d4279SBram Moolenaar 	    CASE_SCODE (CLIPBRD_E_CANT_SET)
480071d4279SBram Moolenaar 	    CASE_SCODE (CLIPBRD_E_BAD_DATA)
481071d4279SBram Moolenaar 	    CASE_SCODE (CLIPBRD_E_CANT_CLOSE)
482071d4279SBram Moolenaar 
483071d4279SBram Moolenaar 	    CASE_SCODE (DRAGDROP_E_NOTREGISTERED)
484071d4279SBram Moolenaar 	    CASE_SCODE (DRAGDROP_E_ALREADYREGISTERED)
485071d4279SBram Moolenaar 	    CASE_SCODE (DRAGDROP_E_INVALIDHWND)
486071d4279SBram Moolenaar 	    CASE_SCODE (DRAGDROP_S_DROP)
487071d4279SBram Moolenaar 	    CASE_SCODE (DRAGDROP_S_CANCEL)
488071d4279SBram Moolenaar 	    CASE_SCODE (DRAGDROP_S_USEDEFAULTCURSORS)
489071d4279SBram Moolenaar 
490071d4279SBram Moolenaar 	    CASE_SCODE (OLEOBJ_E_NOVERBS)
491071d4279SBram Moolenaar 	    CASE_SCODE (OLEOBJ_E_INVALIDVERB)
492071d4279SBram Moolenaar 	    CASE_SCODE (OLEOBJ_S_INVALIDVERB)
493071d4279SBram Moolenaar 	    CASE_SCODE (OLEOBJ_S_CANNOT_DOVERB_NOW)
494071d4279SBram Moolenaar 	    CASE_SCODE (OLEOBJ_S_INVALIDHWND)
495071d4279SBram Moolenaar 	    CASE_SCODE (INPLACE_E_NOTUNDOABLE)
496071d4279SBram Moolenaar 	    CASE_SCODE (INPLACE_E_NOTOOLSPACE)
497071d4279SBram Moolenaar 	    CASE_SCODE (INPLACE_S_TRUNCATED)
498071d4279SBram Moolenaar 
499071d4279SBram Moolenaar 	    // SCODE's defined in COMPOBJ.H
500071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_NOTINITIALIZED)
501071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_ALREADYINITIALIZED)
502071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_CANTDETERMINECLASS)
503071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_CLASSSTRING)
504071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_IIDSTRING)
505071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_APPNOTFOUND)
506071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_APPSINGLEUSE)
507071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_ERRORINAPP)
508071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_DLLNOTFOUND)
509071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_ERRORINDLL)
510071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_WRONGOSFORAPP)
511071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_OBJNOTREG)
512071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_OBJISREG)
513071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_OBJNOTCONNECTED)
514071d4279SBram Moolenaar 	    CASE_SCODE (CO_E_APPDIDNTREG)
515071d4279SBram Moolenaar 	    CASE_SCODE (CLASS_E_NOAGGREGATION)
516071d4279SBram Moolenaar 	    CASE_SCODE (CLASS_E_CLASSNOTAVAILABLE)
517071d4279SBram Moolenaar 	    CASE_SCODE (REGDB_E_READREGDB)
518071d4279SBram Moolenaar 	    CASE_SCODE (REGDB_E_WRITEREGDB)
519071d4279SBram Moolenaar 	    CASE_SCODE (REGDB_E_KEYMISSING)
520071d4279SBram Moolenaar 	    CASE_SCODE (REGDB_E_INVALIDVALUE)
521071d4279SBram Moolenaar 	    CASE_SCODE (REGDB_E_CLASSNOTREG)
522071d4279SBram Moolenaar 	    CASE_SCODE (REGDB_E_IIDNOTREG)
523071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_CALL_REJECTED)
524071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_CALL_CANCELED)
525071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_CANTPOST_INSENDCALL)
526071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_CANTCALLOUT_INASYNCCALL)
527071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_CANTCALLOUT_INEXTERNALCALL)
528071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_CONNECTION_TERMINATED)
529071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_SERVER_DIED)
530071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_CLIENT_DIED)
531071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_INVALID_DATAPACKET)
532071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_CANTTRANSMIT_CALL)
533071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_CLIENT_CANTMARSHAL_DATA)
534071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_CLIENT_CANTUNMARSHAL_DATA)
535071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_SERVER_CANTMARSHAL_DATA)
536071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_SERVER_CANTUNMARSHAL_DATA)
537071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_INVALID_DATA)
538071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_INVALID_PARAMETER)
539071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_CANTCALLOUT_AGAIN)
540071d4279SBram Moolenaar 	    CASE_SCODE (RPC_E_UNEXPECTED)
541071d4279SBram Moolenaar 
542071d4279SBram Moolenaar 	    // SCODE's defined in DVOBJ.H
543071d4279SBram Moolenaar 	    CASE_SCODE (DATA_S_SAMEFORMATETC)
544071d4279SBram Moolenaar 	    CASE_SCODE (VIEW_E_DRAW)
545071d4279SBram Moolenaar 	    CASE_SCODE (VIEW_S_ALREADY_FROZEN)
546071d4279SBram Moolenaar 	    CASE_SCODE (CACHE_E_NOCACHE_UPDATED)
547071d4279SBram Moolenaar 	    CASE_SCODE (CACHE_S_FORMATETC_NOTSUPPORTED)
548071d4279SBram Moolenaar 	    CASE_SCODE (CACHE_S_SAMECACHE)
549071d4279SBram Moolenaar 	    CASE_SCODE (CACHE_S_SOMECACHES_NOTUPDATED)
550071d4279SBram Moolenaar 
551071d4279SBram Moolenaar 	    // SCODE's defined in STORAGE.H
552071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_INVALIDFUNCTION)
553071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_FILENOTFOUND)
554071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_PATHNOTFOUND)
555071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_TOOMANYOPENFILES)
556071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_ACCESSDENIED)
557071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_INVALIDHANDLE)
558071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_INSUFFICIENTMEMORY)
559071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_INVALIDPOINTER)
560071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_NOMOREFILES)
561071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_DISKISWRITEPROTECTED)
562071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_SEEKERROR)
563071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_WRITEFAULT)
564071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_READFAULT)
565071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_SHAREVIOLATION)
566071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_LOCKVIOLATION)
567071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_FILEALREADYEXISTS)
568071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_INVALIDPARAMETER)
569071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_MEDIUMFULL)
570071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_ABNORMALAPIEXIT)
571071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_INVALIDHEADER)
572071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_INVALIDNAME)
573071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_UNKNOWN)
574071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_UNIMPLEMENTEDFUNCTION)
575071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_INVALIDFLAG)
576071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_INUSE)
577071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_NOTCURRENT)
578071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_REVERTED)
579071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_CANTSAVE)
580071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_OLDFORMAT)
581071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_OLDDLL)
582071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_SHAREREQUIRED)
583071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_NOTFILEBASEDSTORAGE)
584071d4279SBram Moolenaar 	    CASE_SCODE (STG_E_EXTANTMARSHALLINGS)
585071d4279SBram Moolenaar 	    CASE_SCODE (STG_S_CONVERTED)
586071d4279SBram Moolenaar 
587071d4279SBram Moolenaar 	    // SCODE's defined in STORAGE.H
588071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_CONNECTMANUALLY)
589071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_EXCEEDEDDEADLINE)
590071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_NEEDGENERIC)
591071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_UNAVAILABLE)
592071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_SYNTAX)
593071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_NOOBJECT)
594071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_INVALIDEXTENSION)
595071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_INTERMEDIATEINTERFACENOTSUPPORTED)
596071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_NOTBINDABLE)
597071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_NOTBOUND)
598071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_CANTOPENFILE)
599071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_MUSTBOTHERUSER)
600071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_NOINVERSE)
601071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_NOSTORAGE)
602071d4279SBram Moolenaar 	    CASE_SCODE (MK_E_NOPREFIX)
603071d4279SBram Moolenaar 	    CASE_SCODE (MK_S_REDUCED_TO_SELF)
604071d4279SBram Moolenaar 	    CASE_SCODE (MK_S_ME)
605071d4279SBram Moolenaar 	    CASE_SCODE (MK_S_HIM)
606071d4279SBram Moolenaar 	    CASE_SCODE (MK_S_US)
607071d4279SBram Moolenaar 	    CASE_SCODE (MK_S_MONIKERALREADYREGISTERED)
608071d4279SBram Moolenaar 
609071d4279SBram Moolenaar 	    // SCODE's defined in DISPATCH.H
610071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_UNKNOWNINTERFACE)
611071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_MEMBERNOTFOUND)
612071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_PARAMNOTFOUND)
613071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_TYPEMISMATCH)
614071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_UNKNOWNNAME)
615071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_NONAMEDARGS)
616071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_BADVARTYPE)
617071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_EXCEPTION)
618071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_OVERFLOW)
619071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_BADINDEX)
620071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_UNKNOWNLCID)
621071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_ARRAYISLOCKED)
622071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_BADPARAMCOUNT)
623071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_PARAMNOTOPTIONAL)
624071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_BADCALLEE)
625071d4279SBram Moolenaar 	    CASE_SCODE (DISP_E_NOTACOLLECTION)
626071d4279SBram Moolenaar 
627071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_BUFFERTOOSMALL)
628071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_INVDATAREAD)
629071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_UNSUPFORMAT)
630071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_REGISTRYACCESS)
631071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_LIBNOTREGISTERED)
632071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_UNDEFINEDTYPE)
633071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_QUALIFIEDNAMEDISALLOWED)
634071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_INVALIDSTATE)
635071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_WRONGTYPEKIND)
636071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_ELEMENTNOTFOUND)
637071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_AMBIGUOUSNAME)
638071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_NAMECONFLICT)
639071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_UNKNOWNLCID)
640071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_DLLFUNCTIONNOTFOUND)
641071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_BADMODULEKIND)
642071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_SIZETOOBIG)
643071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_DUPLICATEID)
644071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_TYPEMISMATCH)
645071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_OUTOFBOUNDS)
646071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_IOERROR)
647071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_CANTCREATETMPFILE)
648071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_CANTLOADLIBRARY)
649071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_INCONSISTENTPROPFUNCS)
650071d4279SBram Moolenaar 	    CASE_SCODE (TYPE_E_CIRCULARTYPE)
651071d4279SBram Moolenaar 
652071d4279SBram Moolenaar 	    default:
653071d4279SBram Moolenaar 		lstrcpy (ErrName, "UNKNOWN SCODE");
654071d4279SBram Moolenaar 	}
655071d4279SBram Moolenaar 
656071d4279SBram Moolenaar 	char Buf[256];
65784a05accSBram Moolenaar 	sprintf (Buf, "An OLE error occurred:\r\nCode = %s\r\nResult = %lx.",
658071d4279SBram Moolenaar 		 (char*) ErrName, m_hResult);
659071d4279SBram Moolenaar 	MessageBox (NULL, Buf, "OLE Error", MB_OK);
660071d4279SBram Moolenaar }
661071d4279SBram Moolenaar 
662071d4279SBram Moolenaar 
CountArgsInFormat(LPCTSTR Format,UINT * pArgCount)663071d4279SBram Moolenaar static bool CountArgsInFormat (LPCTSTR Format, UINT* pArgCount)
664071d4279SBram Moolenaar {
665071d4279SBram Moolenaar 	*pArgCount = 0;
666071d4279SBram Moolenaar 
667071d4279SBram Moolenaar 	if (! Format)
668071d4279SBram Moolenaar 		return true;
669071d4279SBram Moolenaar 
670071d4279SBram Moolenaar 	while (*Format)
671071d4279SBram Moolenaar 	{
672071d4279SBram Moolenaar 		if (*Format == '&')
673071d4279SBram Moolenaar 			Format++;
674071d4279SBram Moolenaar 
675071d4279SBram Moolenaar 		switch (*Format)
676071d4279SBram Moolenaar 		{
677071d4279SBram Moolenaar 		    case 'b':
678071d4279SBram Moolenaar 		    case 'i':
679071d4279SBram Moolenaar 		    case 'I':
680071d4279SBram Moolenaar 		    case 'r':
681071d4279SBram Moolenaar 		    case 'R':
682071d4279SBram Moolenaar 		    case 'c':
683071d4279SBram Moolenaar 		    case 's':
684071d4279SBram Moolenaar 		    case 'e':
685071d4279SBram Moolenaar 		    case 'd':
686071d4279SBram Moolenaar 		    case 'v':
687071d4279SBram Moolenaar 		    case 'D':
688071d4279SBram Moolenaar 		    case 'U':
689071d4279SBram Moolenaar 			++ (*pArgCount);
690071d4279SBram Moolenaar 			Format++;
691071d4279SBram Moolenaar 			break;
692071d4279SBram Moolenaar 		    case '\0':
693071d4279SBram Moolenaar 		    default:
694071d4279SBram Moolenaar 			return false;
695071d4279SBram Moolenaar 		}
696071d4279SBram Moolenaar 	}
697071d4279SBram Moolenaar 	return true;
698071d4279SBram Moolenaar }
699071d4279SBram Moolenaar 
GetNextVarType(LPCTSTR Format,VARTYPE * pVarType)700071d4279SBram Moolenaar static LPCTSTR GetNextVarType (LPCTSTR Format, VARTYPE* pVarType)
701071d4279SBram Moolenaar {
702071d4279SBram Moolenaar 	*pVarType = 0;
703071d4279SBram Moolenaar 	if (*Format == '&')
704071d4279SBram Moolenaar 	{
705071d4279SBram Moolenaar 		*pVarType = VT_BYREF;
706071d4279SBram Moolenaar 		Format++;
707071d4279SBram Moolenaar 		if (!*Format)
708071d4279SBram Moolenaar 			return NULL;
709071d4279SBram Moolenaar 	}
710071d4279SBram Moolenaar 	switch (*Format)
711071d4279SBram Moolenaar 	{
712071d4279SBram Moolenaar 	    case 'b':
713071d4279SBram Moolenaar 		*pVarType |= VT_BOOL;
714071d4279SBram Moolenaar 		break;
715071d4279SBram Moolenaar 	    case 'i':
716071d4279SBram Moolenaar 		*pVarType |= VT_I2;
717071d4279SBram Moolenaar 		break;
718071d4279SBram Moolenaar 	    case 'I':
719071d4279SBram Moolenaar 		*pVarType |= VT_I4;
720071d4279SBram Moolenaar 		break;
721071d4279SBram Moolenaar 	    case 'r':
722071d4279SBram Moolenaar 		*pVarType |= VT_R4;
723071d4279SBram Moolenaar 		break;
724071d4279SBram Moolenaar 	    case 'R':
725071d4279SBram Moolenaar 		*pVarType |= VT_R8;
726071d4279SBram Moolenaar 		break;
727071d4279SBram Moolenaar 	    case 'c':
728071d4279SBram Moolenaar 		*pVarType |= VT_CY;
729071d4279SBram Moolenaar 		break;
730071d4279SBram Moolenaar 	    case 's':
731071d4279SBram Moolenaar 		*pVarType |= VT_BSTR;
732071d4279SBram Moolenaar 		break;
733071d4279SBram Moolenaar 	    case 'e':
734071d4279SBram Moolenaar 		*pVarType |= VT_ERROR;
735071d4279SBram Moolenaar 		break;
736071d4279SBram Moolenaar 	    case 'd':
737071d4279SBram Moolenaar 		*pVarType |= VT_DATE;
738071d4279SBram Moolenaar 		break;
739071d4279SBram Moolenaar 	    case 'v':
740071d4279SBram Moolenaar 		*pVarType |= VT_VARIANT;
741071d4279SBram Moolenaar 		break;
742071d4279SBram Moolenaar 	    case 'U':
743071d4279SBram Moolenaar 		*pVarType |= VT_UNKNOWN;
744071d4279SBram Moolenaar 		break;
745071d4279SBram Moolenaar 	    case 'D':
746071d4279SBram Moolenaar 		*pVarType |= VT_DISPATCH;
747071d4279SBram Moolenaar 		break;
748071d4279SBram Moolenaar 	    case '\0':
749071d4279SBram Moolenaar 		return NULL;	// End of Format string
750071d4279SBram Moolenaar 	    default:
751071d4279SBram Moolenaar 		return NULL;
752071d4279SBram Moolenaar 	}
753071d4279SBram Moolenaar 	return ++Format;
754071d4279SBram Moolenaar }
755071d4279SBram Moolenaar 
756071d4279SBram Moolenaar #ifndef UNICODE
ConvertToAnsi(OLECHAR * sUnicode)757071d4279SBram Moolenaar char* ConvertToAnsi (OLECHAR* sUnicode)
758071d4279SBram Moolenaar {
759071d4279SBram Moolenaar 	static char BufAscii[MAX_OLE_STR];
760071d4279SBram Moolenaar 	return ConvertToAnsiBuf (sUnicode, BufAscii);
761071d4279SBram Moolenaar }
762071d4279SBram Moolenaar 
ConvertToAnsiBuf(OLECHAR * sUnicode,char * BufAscii)763071d4279SBram Moolenaar char* ConvertToAnsiBuf (OLECHAR* sUnicode, char* BufAscii)
764071d4279SBram Moolenaar {
765071d4279SBram Moolenaar 	WideCharToMultiByte (CP_ACP, 0, sUnicode, -1, BufAscii, MAX_OLE_STR, NULL, NULL);
766071d4279SBram Moolenaar 	return BufAscii;
767071d4279SBram Moolenaar }
768071d4279SBram Moolenaar 
ConvertToUnicode(char * sAscii)769071d4279SBram Moolenaar OLECHAR* ConvertToUnicode (char* sAscii)
770071d4279SBram Moolenaar {
771071d4279SBram Moolenaar 	static OLECHAR BufUnicode[MAX_OLE_STR];
772071d4279SBram Moolenaar 	return ConvertToUnicodeBuf (sAscii, BufUnicode);
773071d4279SBram Moolenaar }
774071d4279SBram Moolenaar 
ConvertToUnicodeBuf(char * sAscii,OLECHAR * BufUnicode)775071d4279SBram Moolenaar OLECHAR* ConvertToUnicodeBuf (char* sAscii, OLECHAR* BufUnicode)
776071d4279SBram Moolenaar {
777071d4279SBram Moolenaar 	MultiByteToWideChar (CP_ACP, 0, sAscii, -1, BufUnicode, MAX_OLE_STR);
778071d4279SBram Moolenaar 	return BufUnicode;
779071d4279SBram Moolenaar }
780071d4279SBram Moolenaar #endif
781071d4279SBram Moolenaar 
782