2 // Class for creating OLE automation controllers.
4 // CreateObject() creates an automation object
5 // Invoke() will call a property or method of the automation object.
6 // GetProperty() returns a property
7 // SetProperty() changes a property
8 // Method() invokes a method
10 // For example, the following VB code will control Microsoft Word:
12 // Private Sub Form_Load()
14 // Set wb = CreateObject("Word.Basic")
17 // wb.Insert "This is a test"
18 // wb.FileSaveAs "c:\sample.doc)"
21 // A C++ automation controller that does the same can be written as follows:
22 // the helper functions:
26 // COleAutomationControl Aut;
27 // Aut.CreateObject("Word.Basic");
28 // Aut.Method ("AppShow");
29 // Aut.Method ("FileNewDefault");
30 // Aut.Method ("Insert", "s", (LPOLESTR) OLESTR ("This is a test"));
31 // Aut.Method ("FileSaveAs", "s", OLESTR ("c:\\sample.doc"));
43 static char THIS_FILE
[] = __FILE__
;
47 static bool CountArgsInFormat (LPCTSTR Format
, UINT
* nArgs
);
48 static LPCTSTR
GetNextVarType (LPCTSTR Format
, VARTYPE
* pVarType
);
51 COleAutomationControl::COleAutomationControl ()
56 VariantInit (&m_VariantResult
);
59 COleAutomationControl::~COleAutomationControl ()
64 void COleAutomationControl::DeleteObject ()
68 m_pDispatch
->Release ();
73 // Creates an instance of the Automation object and
74 // obtains it's IDispatch interface.
77 // ProgId ProgID of Automation object
79 bool COleAutomationControl::CreateObject (char* ProgId
)
81 CLSID ClsId
; // CLSID of automation object
82 LPUNKNOWN pUnknown
= NULL
; // IUnknown of automation object
84 // Retrieve CLSID from the progID that the user specified
85 LPOLESTR OleProgId
= TO_OLE_STR (ProgId
);
86 m_hResult
= CLSIDFromProgID (OleProgId
, &ClsId
);
87 if (FAILED (m_hResult
))
90 // Create an instance of the automation object and ask for the
91 // IDispatch interface
92 m_hResult
= CoCreateInstance (ClsId
, NULL
, CLSCTX_SERVER
,
93 IID_IUnknown
, (void**) &pUnknown
);
94 if (FAILED (m_hResult
))
97 m_hResult
= pUnknown
->QueryInterface (IID_IDispatch
, (void**) &m_pDispatch
);
98 if (FAILED (m_hResult
))
101 pUnknown
->Release ();
106 pUnknown
->Release ();
108 m_pDispatch
->Release ();
112 // Return the dispatch id of a named service
113 // This id can be used in subsequent calls to GetProperty (), SetProperty () and
114 // Method (). This is the preferred method when performance is important.
116 DISPID
COleAutomationControl::GetDispatchId (char* Name
)
120 ASSERT (m_pDispatch
);
122 // Get DISPID of property/method
123 LPOLESTR OleName
= TO_OLE_STR (Name
);
124 m_hResult
= m_pDispatch
->GetIDsOfNames (IID_NULL
, &OleName
, 1,
125 LOCALE_USER_DEFAULT
, &DispatchId
);
126 if (FAILED (m_hResult
))
131 // The following functions use these parameters:
135 // Name Name of property or method.
137 // Format Format string that describes the variable list of parameters that
138 // follows. The format string can contain the following characters.
139 // & = mark the following format character as VT_BYREF
146 // s = VT_BSTR (string pointer can be passed,
147 // BSTR will be allocated by this function).
150 // v = VT_VARIANT. Use this to pass data types that are not described
151 // in the format string. (For example SafeArrays).
155 // ... Arguments of the property or method.
156 // Arguments are described by Format.
159 bool COleAutomationControl::GetProperty (char* Name
)
161 return Invoke (DISPATCH_PROPERTYGET
, Name
, NULL
, NULL
);
164 bool COleAutomationControl::GetProperty (DISPID DispatchId
)
166 return Invoke (DISPATCH_PROPERTYGET
, DispatchId
, NULL
, NULL
);
169 bool COleAutomationControl::PutProperty (char* Name
, LPCTSTR Format
, ...)
173 va_start (ArgList
, Format
);
174 bool bRet
= Invoke (DISPATCH_PROPERTYPUT
, Name
, Format
, ArgList
);
179 bool COleAutomationControl::PutProperty (DISPID DispatchId
, LPCTSTR Format
, ...)
183 va_start (ArgList
, Format
);
184 bool bRet
= Invoke (DISPATCH_PROPERTYPUT
, DispatchId
, Format
, ArgList
);
189 bool COleAutomationControl::Method (char* Name
, LPCTSTR Format
, ...)
193 va_start (ArgList
, Format
);
194 bool bRet
= Invoke (DISPATCH_METHOD
, Name
, Format
, ArgList
);
199 bool COleAutomationControl::Method (DISPID DispatchId
, LPCTSTR Format
, ...)
203 va_start (ArgList
, Format
);
204 bool bRet
= Invoke (DISPATCH_METHOD
, DispatchId
, Format
, ArgList
);
209 bool COleAutomationControl::Invoke (WORD Flags
, char* Name
,
210 LPCTSTR Format
, va_list ArgList
)
212 DISPID DispatchId
= GetDispatchId (Name
);
215 return Invoke (Flags
, DispatchId
, Format
, ArgList
);
218 bool COleAutomationControl::Invoke (WORD Flags
, DISPID DispatchId
,
219 LPCTSTR Format
, va_list ArgList
)
222 VARIANTARG
* ArgVector
= NULL
;
224 ASSERT (m_pDispatch
);
226 DISPPARAMS DispatchParams
;
227 memset (&DispatchParams
, 0, sizeof (DispatchParams
));
229 // Determine number of arguments
231 CountArgsInFormat (Format
, &ArgCount
);
233 // Property puts have a named argument that represents the value that
234 // the property is being assigned.
235 DISPID DispIdNamed
= DISPID_PROPERTYPUT
;
236 if (Flags
& DISPATCH_PROPERTYPUT
)
240 m_hResult
= ResultFromScode (E_INVALIDARG
);
243 DispatchParams
.cNamedArgs
= 1;
244 DispatchParams
.rgdispidNamedArgs
= &DispIdNamed
;
249 // Allocate memory for all VARIANTARG parameters
250 ArgVector
= (VARIANTARG
*) CoTaskMemAlloc (
251 ArgCount
* sizeof (VARIANTARG
));
254 m_hResult
= ResultFromScode (E_OUTOFMEMORY
);
257 memset (ArgVector
, 0, sizeof (VARIANTARG
) * ArgCount
);
259 // Get ready to walk vararg list
262 VARIANTARG
*p
= ArgVector
+ ArgCount
- 1; // Params go in opposite order
267 if (! (s
= GetNextVarType (s
, &p
->vt
)))
272 m_hResult
= ResultFromScode (E_INVALIDARG
);
278 V_I2 (p
) = va_arg (ArgList
, short);
281 V_I4 (p
) = va_arg (ArgList
, long);
284 V_R4 (p
) = va_arg (ArgList
, float);
288 V_R8 (p
) = va_arg (ArgList
, double);
291 V_CY (p
) = va_arg (ArgList
, CY
);
294 V_BSTR (p
) = SysAllocString (va_arg (ArgList
,
298 m_hResult
= ResultFromScode (E_OUTOFMEMORY
);
304 V_DISPATCH (p
) = va_arg (ArgList
, LPDISPATCH
);
307 V_ERROR (p
) = va_arg (ArgList
, SCODE
);
310 V_BOOL (p
) = va_arg (ArgList
, BOOL
) ? -1 : 0;
313 *p
= va_arg (ArgList
, VARIANTARG
);
316 V_UNKNOWN (p
) = va_arg (ArgList
, LPUNKNOWN
);
319 case VT_I2
| VT_BYREF
:
320 V_I2REF (p
) = va_arg (ArgList
, short*);
322 case VT_I4
| VT_BYREF
:
323 V_I4REF (p
) = va_arg (ArgList
, long*);
325 case VT_R4
| VT_BYREF
:
326 V_R4REF (p
) = va_arg (ArgList
, float*);
328 case VT_R8
| VT_BYREF
:
329 V_R8REF (p
) = va_arg (ArgList
, double*);
331 case VT_DATE
| VT_BYREF
:
332 V_DATEREF (p
) = va_arg (ArgList
, DATE
*);
334 case VT_CY
| VT_BYREF
:
335 V_CYREF (p
) = va_arg (ArgList
, CY
*);
337 case VT_BSTR
| VT_BYREF
:
338 V_BSTRREF (p
) = va_arg (ArgList
, BSTR
*);
340 case VT_DISPATCH
| VT_BYREF
:
341 V_DISPATCHREF (p
) = va_arg (ArgList
, LPDISPATCH
*);
343 case VT_ERROR
| VT_BYREF
:
344 V_ERRORREF (p
) = va_arg (ArgList
, SCODE
*);
346 case VT_BOOL
| VT_BYREF
:
348 BOOL
* pBool
= va_arg (ArgList
, BOOL
*);
351 V_BOOLREF (p
) = (VARIANT_BOOL
*) pBool
;
354 case VT_VARIANT
| VT_BYREF
:
355 V_VARIANTREF (p
) = va_arg (ArgList
, VARIANTARG
*);
357 case VT_UNKNOWN
| VT_BYREF
:
358 V_UNKNOWNREF (p
) = va_arg (ArgList
, LPUNKNOWN
*);
363 m_hResult
= ResultFromScode (E_INVALIDARG
);
369 --p
; // Get ready to fill next argument
373 DispatchParams
.cArgs
= ArgCount
;
374 DispatchParams
.rgvarg
= ArgVector
;
376 // Initialize return variant, in case caller forgot. Caller can pass
377 // NULL if return value is not expected.
378 VariantInit (&m_VariantResult
);
381 m_hResult
= m_pDispatch
->Invoke (DispatchId
, IID_NULL
, LOCALE_USER_DEFAULT
,
382 Flags
, &DispatchParams
, &m_VariantResult
,
383 &m_ExceptionInfo
, &m_nErrArg
);
386 // Cleanup any arguments that need cleanup
389 VARIANTARG
* p
= ArgVector
;
401 CoTaskMemFree (ArgVector
);
404 return FAILED (m_hResult
) ? false : true;
407 #define CASE_SCODE(sc) \
409 lstrcpy((char*)ErrName, (char*)#sc); \
412 void COleAutomationControl::ErrDiag ()
416 SCODE sc
= GetScode (m_hResult
);
419 // SCODE's defined in SCODE.H
422 CASE_SCODE (E_UNEXPECTED
)
423 CASE_SCODE (E_OUTOFMEMORY
)
424 CASE_SCODE (E_INVALIDARG
)
425 CASE_SCODE (E_NOINTERFACE
)
426 CASE_SCODE (E_POINTER
)
427 CASE_SCODE (E_HANDLE
)
430 CASE_SCODE (E_ACCESSDENIED
)
432 // SCODE's defined in OLE2.H
433 CASE_SCODE (OLE_E_OLEVERB
)
434 CASE_SCODE (OLE_E_ADVF
)
435 CASE_SCODE (OLE_E_ENUM_NOMORE
)
436 CASE_SCODE (OLE_E_ADVISENOTSUPPORTED
)
437 CASE_SCODE (OLE_E_NOCONNECTION
)
438 CASE_SCODE (OLE_E_NOTRUNNING
)
439 CASE_SCODE (OLE_E_NOCACHE
)
440 CASE_SCODE (OLE_E_BLANK
)
441 CASE_SCODE (OLE_E_CLASSDIFF
)
442 CASE_SCODE (OLE_E_CANT_GETMONIKER
)
443 CASE_SCODE (OLE_E_CANT_BINDTOSOURCE
)
444 CASE_SCODE (OLE_E_STATIC
)
445 CASE_SCODE (OLE_E_PROMPTSAVECANCELLED
)
446 CASE_SCODE (OLE_E_INVALIDRECT
)
447 CASE_SCODE (OLE_E_WRONGCOMPOBJ
)
448 CASE_SCODE (OLE_E_INVALIDHWND
)
449 CASE_SCODE (OLE_E_NOT_INPLACEACTIVE
)
450 CASE_SCODE (OLE_E_CANTCONVERT
)
451 CASE_SCODE (OLE_E_NOSTORAGE
)
453 CASE_SCODE (DV_E_FORMATETC
)
454 CASE_SCODE (DV_E_DVTARGETDEVICE
)
455 CASE_SCODE (DV_E_STGMEDIUM
)
456 CASE_SCODE (DV_E_STATDATA
)
457 CASE_SCODE (DV_E_LINDEX
)
458 CASE_SCODE (DV_E_TYMED
)
459 CASE_SCODE (DV_E_CLIPFORMAT
)
460 CASE_SCODE (DV_E_DVASPECT
)
461 CASE_SCODE (DV_E_DVTARGETDEVICE_SIZE
)
462 CASE_SCODE (DV_E_NOIVIEWOBJECT
)
464 CASE_SCODE (OLE_S_USEREG
)
465 CASE_SCODE (OLE_S_STATIC
)
466 CASE_SCODE (OLE_S_MAC_CLIPFORMAT
)
468 CASE_SCODE (CONVERT10_E_OLESTREAM_GET
)
469 CASE_SCODE (CONVERT10_E_OLESTREAM_PUT
)
470 CASE_SCODE (CONVERT10_E_OLESTREAM_FMT
)
471 CASE_SCODE (CONVERT10_E_OLESTREAM_BITMAP_TO_DIB
)
472 CASE_SCODE (CONVERT10_E_STG_FMT
)
473 CASE_SCODE (CONVERT10_E_STG_NO_STD_STREAM
)
474 CASE_SCODE (CONVERT10_E_STG_DIB_TO_BITMAP
)
475 CASE_SCODE (CONVERT10_S_NO_PRESENTATION
)
477 CASE_SCODE (CLIPBRD_E_CANT_OPEN
)
478 CASE_SCODE (CLIPBRD_E_CANT_EMPTY
)
479 CASE_SCODE (CLIPBRD_E_CANT_SET
)
480 CASE_SCODE (CLIPBRD_E_BAD_DATA
)
481 CASE_SCODE (CLIPBRD_E_CANT_CLOSE
)
483 CASE_SCODE (DRAGDROP_E_NOTREGISTERED
)
484 CASE_SCODE (DRAGDROP_E_ALREADYREGISTERED
)
485 CASE_SCODE (DRAGDROP_E_INVALIDHWND
)
486 CASE_SCODE (DRAGDROP_S_DROP
)
487 CASE_SCODE (DRAGDROP_S_CANCEL
)
488 CASE_SCODE (DRAGDROP_S_USEDEFAULTCURSORS
)
490 CASE_SCODE (OLEOBJ_E_NOVERBS
)
491 CASE_SCODE (OLEOBJ_E_INVALIDVERB
)
492 CASE_SCODE (OLEOBJ_S_INVALIDVERB
)
493 CASE_SCODE (OLEOBJ_S_CANNOT_DOVERB_NOW
)
494 CASE_SCODE (OLEOBJ_S_INVALIDHWND
)
495 CASE_SCODE (INPLACE_E_NOTUNDOABLE
)
496 CASE_SCODE (INPLACE_E_NOTOOLSPACE
)
497 CASE_SCODE (INPLACE_S_TRUNCATED
)
499 // SCODE's defined in COMPOBJ.H
500 CASE_SCODE (CO_E_NOTINITIALIZED
)
501 CASE_SCODE (CO_E_ALREADYINITIALIZED
)
502 CASE_SCODE (CO_E_CANTDETERMINECLASS
)
503 CASE_SCODE (CO_E_CLASSSTRING
)
504 CASE_SCODE (CO_E_IIDSTRING
)
505 CASE_SCODE (CO_E_APPNOTFOUND
)
506 CASE_SCODE (CO_E_APPSINGLEUSE
)
507 CASE_SCODE (CO_E_ERRORINAPP
)
508 CASE_SCODE (CO_E_DLLNOTFOUND
)
509 CASE_SCODE (CO_E_ERRORINDLL
)
510 CASE_SCODE (CO_E_WRONGOSFORAPP
)
511 CASE_SCODE (CO_E_OBJNOTREG
)
512 CASE_SCODE (CO_E_OBJISREG
)
513 CASE_SCODE (CO_E_OBJNOTCONNECTED
)
514 CASE_SCODE (CO_E_APPDIDNTREG
)
515 CASE_SCODE (CLASS_E_NOAGGREGATION
)
516 CASE_SCODE (CLASS_E_CLASSNOTAVAILABLE
)
517 CASE_SCODE (REGDB_E_READREGDB
)
518 CASE_SCODE (REGDB_E_WRITEREGDB
)
519 CASE_SCODE (REGDB_E_KEYMISSING
)
520 CASE_SCODE (REGDB_E_INVALIDVALUE
)
521 CASE_SCODE (REGDB_E_CLASSNOTREG
)
522 CASE_SCODE (REGDB_E_IIDNOTREG
)
523 CASE_SCODE (RPC_E_CALL_REJECTED
)
524 CASE_SCODE (RPC_E_CALL_CANCELED
)
525 CASE_SCODE (RPC_E_CANTPOST_INSENDCALL
)
526 CASE_SCODE (RPC_E_CANTCALLOUT_INASYNCCALL
)
527 CASE_SCODE (RPC_E_CANTCALLOUT_INEXTERNALCALL
)
528 CASE_SCODE (RPC_E_CONNECTION_TERMINATED
)
529 CASE_SCODE (RPC_E_SERVER_DIED
)
530 CASE_SCODE (RPC_E_CLIENT_DIED
)
531 CASE_SCODE (RPC_E_INVALID_DATAPACKET
)
532 CASE_SCODE (RPC_E_CANTTRANSMIT_CALL
)
533 CASE_SCODE (RPC_E_CLIENT_CANTMARSHAL_DATA
)
534 CASE_SCODE (RPC_E_CLIENT_CANTUNMARSHAL_DATA
)
535 CASE_SCODE (RPC_E_SERVER_CANTMARSHAL_DATA
)
536 CASE_SCODE (RPC_E_SERVER_CANTUNMARSHAL_DATA
)
537 CASE_SCODE (RPC_E_INVALID_DATA
)
538 CASE_SCODE (RPC_E_INVALID_PARAMETER
)
539 CASE_SCODE (RPC_E_CANTCALLOUT_AGAIN
)
540 CASE_SCODE (RPC_E_UNEXPECTED
)
542 // SCODE's defined in DVOBJ.H
543 CASE_SCODE (DATA_S_SAMEFORMATETC
)
544 CASE_SCODE (VIEW_E_DRAW
)
545 CASE_SCODE (VIEW_S_ALREADY_FROZEN
)
546 CASE_SCODE (CACHE_E_NOCACHE_UPDATED
)
547 CASE_SCODE (CACHE_S_FORMATETC_NOTSUPPORTED
)
548 CASE_SCODE (CACHE_S_SAMECACHE
)
549 CASE_SCODE (CACHE_S_SOMECACHES_NOTUPDATED
)
551 // SCODE's defined in STORAGE.H
552 CASE_SCODE (STG_E_INVALIDFUNCTION
)
553 CASE_SCODE (STG_E_FILENOTFOUND
)
554 CASE_SCODE (STG_E_PATHNOTFOUND
)
555 CASE_SCODE (STG_E_TOOMANYOPENFILES
)
556 CASE_SCODE (STG_E_ACCESSDENIED
)
557 CASE_SCODE (STG_E_INVALIDHANDLE
)
558 CASE_SCODE (STG_E_INSUFFICIENTMEMORY
)
559 CASE_SCODE (STG_E_INVALIDPOINTER
)
560 CASE_SCODE (STG_E_NOMOREFILES
)
561 CASE_SCODE (STG_E_DISKISWRITEPROTECTED
)
562 CASE_SCODE (STG_E_SEEKERROR
)
563 CASE_SCODE (STG_E_WRITEFAULT
)
564 CASE_SCODE (STG_E_READFAULT
)
565 CASE_SCODE (STG_E_SHAREVIOLATION
)
566 CASE_SCODE (STG_E_LOCKVIOLATION
)
567 CASE_SCODE (STG_E_FILEALREADYEXISTS
)
568 CASE_SCODE (STG_E_INVALIDPARAMETER
)
569 CASE_SCODE (STG_E_MEDIUMFULL
)
570 CASE_SCODE (STG_E_ABNORMALAPIEXIT
)
571 CASE_SCODE (STG_E_INVALIDHEADER
)
572 CASE_SCODE (STG_E_INVALIDNAME
)
573 CASE_SCODE (STG_E_UNKNOWN
)
574 CASE_SCODE (STG_E_UNIMPLEMENTEDFUNCTION
)
575 CASE_SCODE (STG_E_INVALIDFLAG
)
576 CASE_SCODE (STG_E_INUSE
)
577 CASE_SCODE (STG_E_NOTCURRENT
)
578 CASE_SCODE (STG_E_REVERTED
)
579 CASE_SCODE (STG_E_CANTSAVE
)
580 CASE_SCODE (STG_E_OLDFORMAT
)
581 CASE_SCODE (STG_E_OLDDLL
)
582 CASE_SCODE (STG_E_SHAREREQUIRED
)
583 CASE_SCODE (STG_E_NOTFILEBASEDSTORAGE
)
584 CASE_SCODE (STG_E_EXTANTMARSHALLINGS
)
585 CASE_SCODE (STG_S_CONVERTED
)
587 // SCODE's defined in STORAGE.H
588 CASE_SCODE (MK_E_CONNECTMANUALLY
)
589 CASE_SCODE (MK_E_EXCEEDEDDEADLINE
)
590 CASE_SCODE (MK_E_NEEDGENERIC
)
591 CASE_SCODE (MK_E_UNAVAILABLE
)
592 CASE_SCODE (MK_E_SYNTAX
)
593 CASE_SCODE (MK_E_NOOBJECT
)
594 CASE_SCODE (MK_E_INVALIDEXTENSION
)
595 CASE_SCODE (MK_E_INTERMEDIATEINTERFACENOTSUPPORTED
)
596 CASE_SCODE (MK_E_NOTBINDABLE
)
597 CASE_SCODE (MK_E_NOTBOUND
)
598 CASE_SCODE (MK_E_CANTOPENFILE
)
599 CASE_SCODE (MK_E_MUSTBOTHERUSER
)
600 CASE_SCODE (MK_E_NOINVERSE
)
601 CASE_SCODE (MK_E_NOSTORAGE
)
602 CASE_SCODE (MK_E_NOPREFIX
)
603 CASE_SCODE (MK_S_REDUCED_TO_SELF
)
605 CASE_SCODE (MK_S_HIM
)
607 CASE_SCODE (MK_S_MONIKERALREADYREGISTERED
)
609 // SCODE's defined in DISPATCH.H
610 CASE_SCODE (DISP_E_UNKNOWNINTERFACE
)
611 CASE_SCODE (DISP_E_MEMBERNOTFOUND
)
612 CASE_SCODE (DISP_E_PARAMNOTFOUND
)
613 CASE_SCODE (DISP_E_TYPEMISMATCH
)
614 CASE_SCODE (DISP_E_UNKNOWNNAME
)
615 CASE_SCODE (DISP_E_NONAMEDARGS
)
616 CASE_SCODE (DISP_E_BADVARTYPE
)
617 CASE_SCODE (DISP_E_EXCEPTION
)
618 CASE_SCODE (DISP_E_OVERFLOW
)
619 CASE_SCODE (DISP_E_BADINDEX
)
620 CASE_SCODE (DISP_E_UNKNOWNLCID
)
621 CASE_SCODE (DISP_E_ARRAYISLOCKED
)
622 CASE_SCODE (DISP_E_BADPARAMCOUNT
)
623 CASE_SCODE (DISP_E_PARAMNOTOPTIONAL
)
624 CASE_SCODE (DISP_E_BADCALLEE
)
625 CASE_SCODE (DISP_E_NOTACOLLECTION
)
627 CASE_SCODE (TYPE_E_BUFFERTOOSMALL
)
628 CASE_SCODE (TYPE_E_INVDATAREAD
)
629 CASE_SCODE (TYPE_E_UNSUPFORMAT
)
630 CASE_SCODE (TYPE_E_REGISTRYACCESS
)
631 CASE_SCODE (TYPE_E_LIBNOTREGISTERED
)
632 CASE_SCODE (TYPE_E_UNDEFINEDTYPE
)
633 CASE_SCODE (TYPE_E_QUALIFIEDNAMEDISALLOWED
)
634 CASE_SCODE (TYPE_E_INVALIDSTATE
)
635 CASE_SCODE (TYPE_E_WRONGTYPEKIND
)
636 CASE_SCODE (TYPE_E_ELEMENTNOTFOUND
)
637 CASE_SCODE (TYPE_E_AMBIGUOUSNAME
)
638 CASE_SCODE (TYPE_E_NAMECONFLICT
)
639 CASE_SCODE (TYPE_E_UNKNOWNLCID
)
640 CASE_SCODE (TYPE_E_DLLFUNCTIONNOTFOUND
)
641 CASE_SCODE (TYPE_E_BADMODULEKIND
)
642 CASE_SCODE (TYPE_E_SIZETOOBIG
)
643 CASE_SCODE (TYPE_E_DUPLICATEID
)
644 CASE_SCODE (TYPE_E_TYPEMISMATCH
)
645 CASE_SCODE (TYPE_E_OUTOFBOUNDS
)
646 CASE_SCODE (TYPE_E_IOERROR
)
647 CASE_SCODE (TYPE_E_CANTCREATETMPFILE
)
648 CASE_SCODE (TYPE_E_CANTLOADLIBRARY
)
649 CASE_SCODE (TYPE_E_INCONSISTENTPROPFUNCS
)
650 CASE_SCODE (TYPE_E_CIRCULARTYPE
)
653 lstrcpy (ErrName
, "UNKNOWN SCODE");
657 sprintf (Buf
, "An OLE error occured:\r\nCode = %s\r\nResult = %lx.",
658 (char*) ErrName
, m_hResult
);
659 MessageBox (NULL
, Buf
, "OLE Error", MB_OK
);
663 static bool CountArgsInFormat (LPCTSTR Format
, UINT
* pArgCount
)
700 static LPCTSTR
GetNextVarType (LPCTSTR Format
, VARTYPE
* pVarType
)
705 *pVarType
= VT_BYREF
;
713 *pVarType
|= VT_BOOL
;
731 *pVarType
|= VT_BSTR
;
734 *pVarType
|= VT_ERROR
;
737 *pVarType
|= VT_DATE
;
740 *pVarType
|= VT_VARIANT
;
743 *pVarType
|= VT_UNKNOWN
;
746 *pVarType
|= VT_DISPATCH
;
749 return NULL
; // End of Format string
757 char* ConvertToAnsi (OLECHAR
* sUnicode
)
759 static char BufAscii
[MAX_OLE_STR
];
760 return ConvertToAnsiBuf (sUnicode
, BufAscii
);
763 char* ConvertToAnsiBuf (OLECHAR
* sUnicode
, char* BufAscii
)
765 WideCharToMultiByte (CP_ACP
, 0, sUnicode
, -1, BufAscii
, MAX_OLE_STR
, NULL
, NULL
);
769 OLECHAR
* ConvertToUnicode (char* sAscii
)
771 static OLECHAR BufUnicode
[MAX_OLE_STR
];
772 return ConvertToUnicodeBuf (sAscii
, BufUnicode
);
775 OLECHAR
* ConvertToUnicodeBuf (char* sAscii
, OLECHAR
* BufUnicode
)
777 MultiByteToWideChar (CP_ACP
, 0, sAscii
, -1, BufUnicode
, MAX_OLE_STR
);