OWLNext    7.0
Borland's Object Windows Library for the modern age
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
autosrv.cpp
Go to the documentation of this file.
1//----------------------------------------------------------------------------
2// ObjectComponents
3// Copyright (c) 1994, 1996 by Borland International, All Rights Reserved
4//
5/// \file
6/// OLE Automation Server Implementation: TServedObject
7//----------------------------------------------------------------------------
8#include <ocf/pch.h>
9#include <ocf/appdesc.h>
10#include <ocf/ocreg.h>
11#include <ocf/occtrl.h>
12
13namespace ocf {
14
15using namespace owl;
16
18
19//----------------------------------------------------------------------------
20// TServedObject implementation
21//
22
24:
25 AppDesc(appDesc),
26 AppObject(0),
27 ObjCount(0)
28{
29}
30
42
53
54void
60
61void
63{
65 if (--ObjCount == 0)
66 {
68 //delete this;
69 }
70}
71#if defined(BI_COMP_BORLANDC)
73#else
74//EXTERN_C _OCFDATA(const GUID)
75EXTERN_C const GUID
76#endif
77IID_TServedObject = {0x02A101L,0,0,{0xC0,0,0,0,0,0,0,0x46}};
78
80DEFINE_QI_OLEBASE(ITypeInfo, 0x20401L)
81
82DEFINE_COMBASES2(TServedCOM, IDispatch, ITypeInfo)
83
84HRESULT TServedObject::QueryObject(const GUID & iid, void * * pif)
85{
86 GUID qid = iid;
87
88 if (iid == IID_TServedObject) {
89 *pif = this; // return actual pointer to this object
90 return HR_NOERROR; // non-interface returned, no AddRef(), do not Release
91 }
92 if ((iidEvent != IID_NULL) && (iid == iidEvent))
94 return TServedCOM::QueryObject (qid, pif); // query inherited bases
95}
96
99 IUnknown* outer)
100:
101 Object(const_cast<void*>(objDesc.Object)), Destruct(objDesc.Destruct),
102 Creator(creator), Class(objDesc.Class), iidEvent(IID_NULL)
103{
104 SetOuter(outer ? outer
105 : &objDesc.Class->Aggregate(const_cast<void*>(objDesc.Object), *this));
106 ReqLang = creator.AppDesc.GetAppLang(); // do we really need to initialize here?
107 creator.Attach(*this);
108 RootObject = objDesc.MostDerived();
109} // note: RefCnt = 0 on creation, will ++ in TAutoVal operator(IDispatch*)
110
112{
115 try {
117 cmdobj->Invoke();
118 }
119 catch(TXAuto&) {
120 // we can't indicate any error here
121 }
122 delete cmdobj;
123 }
124 Creator.Detach(*this);
125}
126
127//
128// IDispatch implementation
129//
130
132TServedObject::GetTypeInfoCount(unsigned int * pctinfo)
133{
134 *pctinfo = 1;
135 return HR_NOERROR;
136}
137
139TServedObject::GetTypeInfo(unsigned int /*itinfo*/, LCID lcid,
140 ITypeInfo* * pptinfo)
141{
143 *pptinfo = static_cast<ITypeInfo*>(this);
144 AddRef();
145 return HR_NOERROR;
146}
147
149TServedObject::GetIDsOfNames(const IID & riid, OLECHAR * * names,
150 unsigned int cNames, LCID lcid, DISPID * dispIds)
151{
152 if (riid != IID_NULL)
154
156 TAutoSymbol* symbol;
157 for (int i = 0; i < (int)cNames; i++) {
158 dispIds[i] = -1;
159 if (i == 0) {
162 if (!symbol)
164 }
165 else if (symbol) {
168 }
169 }
170 return retval;
171}
172
173//
174//
175//
177TServedObject::Invoke(DISPID dispidMember, const IID & /*riid*/, LCID lcid,
178 unsigned short wFlags, DISPPARAMS * dispparams,
180 unsigned int * retArgErr)
181{
182 // Make a copy of the object in case there's this pointer adjustment
183 //
184 ObjectPtr object = Object;
185
186 // Make sure our object is still valid
187 //
188 if (!object) {
189 WARNX(OcfDll, !object, 1, _T("TServedObject::Invoke() Object == 0"));
191 }
192
193 // Build an object representing the data passed in
194 //
195 TAutoStack stack(dispidMember, dispparams->rgvarg, lcid, dispparams->cArgs,
196 dispparams->cNamedArgs, dispparams->rgdispidNamedArgs,
197 this);
198
199 // Find the symbol we're asked to dispatch to
200 //
201 stack.Symbol = Class->FindId(dispidMember, object);
202
203 if (!stack.Symbol) {
204 // NOTE: This is a 'hack' that allows TServedObject to expose a generic method
205 // that's used for cases when the object does not provide a method
206 // that matches the dispId invoked.
207 // It is used by our container support for sinking non-standard events.
208 //
209 if ((stack.Symbol = Class->FindId(DISPID_CATCH_ALL, object)) == nullptr)
211 }
212
213 // Check the attribute bits to ensure we support the type
214 //
215 if (!stack.Symbol->TestFlag(wFlags)) {
216 WARNX(OcfDll, true, 1, _T("TServedObject::Invoke() type unsupported"));
218 }
219
220 // Check if we need return result
221 // NOTE: Some servers [such as Word.Basic] seem to be very picky about
222 // the distinction between a function and procedure. They are not
223 // as flexible as we are here..
224 //
226 varResult = 0;
227
228
229 // Check that the number of arguments sent matches what we're expecting
230 //
231
232 // Again here we'll have to relax a little on the param count check since in the
233 // case of the DISPID_CATCH_ALL, the handler is a generic one that can handle
234 // any number of parameters.
235 //
236 if (((stack.ArgSymbolCount = Class->GetArgCount(*stack.Symbol)) +
237 ((wFlags & (DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF)) != 0) < stack.ArgCount) &&
238 (stack.Symbol->DispId != DISPID_CATCH_ALL)){
239 WARNX(OcfDll, true, 1, _T("TServedObject::Invoke() BadParamCount"));
241 }
242
243
244 // Dispatch via the command object and hope we're OK
245 //
246 switch(Class->Dispatch(object, Creator, *this, wFlags, stack, (TAutoVal*)varResult)) {
247 case TXAuto::xNoError:
248 return HR_NOERROR;
249
252 return HR_DISP_BADVARTYPE;
253
255 if (retArgErr)
256 *retArgErr = stack.CurrentArg;
257 return HR_DISP_OVERFLOW;
258
261 if (retArgErr)
262 *retArgErr = stack.CurrentArg;
264
266 if (retArgErr)
267 *retArgErr = stack.CurrentArg;
269
273
275 if (exceptInfo) {
276 exceptInfo->wCode = (unsigned short)stack.ErrorCode;
277 exceptInfo->wReserved = 0;
280 exceptInfo->bstrDescription = TOleAuto::SysAllocString((const OLECHAR *)stack.ErrorMsg);
281 exceptInfo->bstrHelpFile = 0;
282 exceptInfo->pfnDeferredFillIn = 0;
283
284 // INVESTIGATE: Is there a method to relay better SCODEs ?
285 //
286 exceptInfo->scode = E_FAIL;
287 }
288 return HR_DISP_EXCEPTION;
289
291 default:
292 // INVESTIGATE: Is there a better error code here ?
293 //
294 return HR_DISP_OVERFLOW;
295 }
296}
297
298
299//----------------------------------------------------------------------------
300// ITypeInfo implementation
301//
302
304TServedObject::GetTypeAttr(TYPEATTR * * retTypeAttr)
305{
306 Class->CountCommands(); // force update of symbol counts;
307 TYPEATTR* ta = (TYPEATTR*)new uint8[sizeof(TYPEATTR)];
308 memset(ta, 0, sizeof(TYPEATTR));
310 ta->lcid = ReqLang;
311 ta->typekind = TKIND_DISPATCH;
312 ta->wTypeFlags = Class->GetTypeFlags();
313 ta->cFuncs = Class->FunctionCount;
314 ta->cVars = Class->VariableCount;
315 ta->wMajorVerNum = Creator.AppDesc.GetVersionField(0);
316 ta->wMinorVerNum = Creator.AppDesc.GetVersionField(1);
317 *retTypeAttr = ta;
318 return HR_NOERROR;
319}
320
321void _IFUNC
322TServedObject::ReleaseTypeAttr(TYPEATTR * ptypeattr)
323{
324 delete [] (uint8*)ptypeattr;
325}
326
328TServedObject::GetFuncDesc(unsigned int index, FUNCDESC * * retDesc)
329{
330 MEMBERID cmdId = 0; // must initialize, FindFunction recursively adjusts it
331 TAutoSymbol* sym = Class->FindFunction(index, cmdId);
332 if (!sym || !retDesc)
333 return HR_INVALIDARG;
334 int kind = (sym->GetFlags() & asOleType);
336 int argCount = Class->GetArgCount(*sym);
337 int asize = sizeof(ELEMDESC) * (argCount+isPropSet) + sizeof(FUNCDESC);
338 int size = (argCount+1) * sizeof(TYPEDESC) + asize;
339 FUNCDESC* fd = (FUNCDESC*)new uint8[size];
340 TYPEDESC* ptrtd = (TYPEDESC*)((uint8*)fd + asize); // for indirected types
341 memset(fd, 0, size);
342 fd->cParams = short(argCount + isPropSet);
343 fd->lprgelemdescParam = (ELEMDESC*)(fd+1);
344 fd->memid = cmdId;
345 fd->funckind = FUNC_DISPATCH;
346 fd->invkind = (INVOKEKIND)kind;
347 fd->callconv = CC_CDECL; // need to set to prevent typelib.dll asserts
348 fd->cScodes = -1;
349 ELEMDESC* argDesc = &fd->elemdescFunc;
350 if (isPropSet){
351 argDesc->tdesc.vt = VT_EMPTY;
352 argDesc = (ELEMDESC*)(fd+1);
353 }
354 for (int argIndex = 0; argIndex <= argCount; argIndex++, sym++, ptrtd++) {
355 TAutoClass* cls = sym->GetClass();
356 if (cls) {
357 argDesc->tdesc.vt = VT_USERDEFINED;
358 argDesc->tdesc.hreftype = (HREFTYPE)cls;
359 } else if (sym->IsEnum()) {
360 argDesc->tdesc.vt = atString; // expose enumerated type as string
361 } else if (sym->IsArray()) {
362 argDesc->tdesc.vt = VT_SAFEARRAY;
363 argDesc->tdesc.lptdesc = ptrtd;
364 ptrtd->vt = sym->GetDataType();
365 } else if (sym->IsByRef()) {
366 argDesc->tdesc.vt = VT_PTR;
367 argDesc->tdesc.lptdesc = ptrtd;
368 ptrtd->vt = sym->GetDataType();
369 } else {
370 argDesc->tdesc.vt = sym->GetDataType();
371 }
372 argDesc++;
373 if (argIndex == 0) {
374 if (!isPropSet)
375 argDesc = (ELEMDESC*)(fd+1);
376 } else {
377 if (sym->Doc) // argument optional if has default string
378 fd->cParamsOpt++;
379 }
380 }
381 *retDesc = fd;
382 return HR_NOERROR;
383}
384
385void _IFUNC
386TServedObject::ReleaseFuncDesc(FUNCDESC * pfuncdesc)
387{
388 delete [] (uint8*)pfuncdesc;
389}
390
392TServedObject::GetVarDesc(unsigned int index, VARDESC * * retDesc)
393{
394 VARDESC* vd = (VARDESC*)new uint8[sizeof(VARDESC) + sizeof(TYPEDESC)];
395 TYPEDESC* ptrtd = (TYPEDESC*)((uint8*)vd + sizeof(VARDESC));
396 memset(vd, 0, sizeof(VARDESC)+sizeof(TYPEDESC));
397 MEMBERID cmdId = 0; // must initialize, FindVariable recursively adjusts it
398 TAutoSymbol* sym = Class->FindVariable(index, cmdId);
399 if (!sym || !retDesc)
400 return HR_INVALIDARG;
401 TAutoClass* cls = sym->GetClass();
402 vd->memid = cmdId;
403 vd->varkind = VAR_DISPATCH;
404 if (cls) {
405 vd->elemdescVar.tdesc.vt = VT_USERDEFINED;
406 vd->elemdescVar.tdesc.hreftype = (HREFTYPE)cls;
407 } else if (sym->IsEnum()) {
408 vd->elemdescVar.tdesc.vt = atString; // expose enumerated type as string
409 } else if (sym->IsArray()) {
410 vd->elemdescVar.tdesc.vt = VT_SAFEARRAY;
411 vd->elemdescVar.tdesc.lptdesc = ptrtd;
412 ptrtd->vt = sym->GetDataType();
413 } else if (sym->IsByRef()) {
414 vd->elemdescVar.tdesc.vt = VT_PTR;
415 vd->elemdescVar.tdesc.lptdesc = ptrtd;
416 ptrtd->vt = sym->GetDataType();
417 } else {
418 vd->elemdescVar.tdesc.vt = sym->GetDataType();
419 }
420 *retDesc = vd;
421 return HR_NOERROR;
422}
423
424void _IFUNC
425TServedObject::ReleaseVarDesc(VARDESC * pvardesc)
426{
427 delete[] (uint8*)pvardesc;
428 return;
429}
430
432TServedObject::GetNames(MEMBERID memid, BSTR * rgbstrNames,
433 unsigned int cMaxNames, unsigned int * pcNames)
434{
435 ObjectPtr noObj = 0;
436 TAutoSymbol* sym = Class->FindId(memid, noObj);
437 if (!sym)
439 int nameCount = Class->GetArgCount(*sym) + 1;
440 if (nameCount > (int)cMaxNames)
442 for (int index = 0; index < nameCount; index++, sym++)
443 rgbstrNames[index] = TOleAuto::SysAllocString((const OLECHAR *)sym->Name.Translate(ReqLang));
445 return HR_NOERROR;
446}
447
449TServedObject::GetIDsOfNames(OLECHAR * * names, uint cNames,
451{
453 TAutoSymbol* symbol;
454 for (int i = 0; i < (int)cNames; i++) {
455 retIds[i] = -1;
456 if (i == 0) {
458 if (!symbol)
460 }
461 else if (symbol) {
464 }
465 }
466 return retval;
467}
468
470TServedObject::Invoke(void * pvInstance, MEMBERID memid,
471 unsigned short wFlags, DISPPARAMS *dispparams,
473 unsigned int *retArgErr)
474{
475 if (Object) // cannot invoke if active object obtained from IDispatch ifc
477 Object = (void*)pvInstance; // going on faith that caller has valid instance
479 HRESULT stat = Invoke(memid, IID_NULL, ReqLang, wFlags, dispparams,
481 Object = 0;
482 RootObject = 0;
483 return stat;
484}
485
487TServedObject::GetDocumentation(MEMBERID memid,
488 BSTR * retName, BSTR * retDoc,
491{
492 TAutoSymbol* sym;
493 if (memid == -1) { // request info on type library itself
495 } else {
496 ObjectPtr noObj = 0;
497 if ((sym = Class->FindId(memid, noObj)) == 0)
499 }
500 if (retName)
501 *retName = TOleAuto::SysAllocString((const OLECHAR *)sym->Name.Translate(ReqLang));
502 if (retDoc)
503 *retDoc = TOleAuto::SysAllocString((const OLECHAR *)sym->Doc.Translate(ReqLang));
504 if (retHelpContext)
505 *retHelpContext = sym->HelpId;
506 if (retHelpFile)
508 return HR_NOERROR;
509}
510
512TServedObject::GetFuncDocFromIndex(unsigned index,
513 BSTR * retName, BSTR * retDoc,
516{
517 MEMBERID cmdId = 0;
518 TAutoSymbol* sym = Class->FindFunction(index, cmdId);
519 if (!sym)
520 return HR_INVALIDARG;
521 return GetDocFromSym(sym, retName, retDoc,retHelpContext, retHelpFile);
522}
523
525TServedObject::GetVarDocFromIndex(unsigned index,
526 BSTR * retName, BSTR * retDoc,
529{
530 MEMBERID cmdId = 0;
531 TAutoSymbol* sym = Class->FindVariable(index, cmdId);
532 if (!sym)
533 return HR_INVALIDARG;
534 return GetDocFromSym(sym, retName, retDoc,retHelpContext, retHelpFile);
535}
536
538TServedObject::GetDocFromSym(TAutoSymbol* sym,
539 BSTR * retName, BSTR * retDoc,
542{
543 if (retName)
544 *retName = TOleAuto::SysAllocString((const OLECHAR *)sym->Name.Translate(ReqLang));
545 if (retDoc)
546 *retDoc = TOleAuto::SysAllocString((const OLECHAR *)sym->Doc.Translate(ReqLang));
547 if (retHelpContext)
548 *retHelpContext = sym->HelpId;
549 if (retHelpFile)
551 return HR_NOERROR;
552}
553
555TServedObject::CreateInstance(IUnknown* /*punkOuter*/, const IID & /*riid*/,
556 void * * /*ppvObj*/)
557{
559}
560
562TServedObject::GetContainingTypeLib(ITypeLib* * retLib,
563 unsigned int * retIndex)
564{
566 if (retIndex)
568 return HR_NOERROR; // is it really possible to fail?
569}
570
572TServedObject::GetRefTypeInfo(HREFTYPE hreftype, ITypeInfo* * retInfo)
573{
574 TAutoClass* cls = (TAutoClass*)hreftype;
575 if (Creator.AppDesc.GetClassIndex(cls) == -1) // validate pointer to avoid crash
578 return HR_NOERROR;
579}
580
581// The following methods of ITypeInfo are not relevant for Dispatch interfaces
582
584TServedObject::GetTypeComp(ITypeComp* * /*pptcomp*/)
585{
587}
588
590TServedObject::GetMops(MEMBERID /*memid*/, BSTR *)
591{
593}
594
596TServedObject::GetImplTypeFlags(unsigned int /*index*/, int *)
597{
599}
600
602TServedObject::GetRefTypeOfImplType(unsigned int /*index*/,
603 HREFTYPE * /*phreftype*/)
604{
606}
607
609TServedObject::GetDllEntry(MEMBERID /*memid*/, INVOKEKIND /*invkind*/,
610 BSTR * /*pbstrDllName*/, BSTR * /*pbstrName*/,
611 unsigned short * /*pwOrdinal*/)
612{
614}
615
617TServedObject::AddressOfMember(MEMBERID /*memid*/, INVOKEKIND /*invkind*/,
618 void * * /*ppv*/)
619{
621}
622
623} // OCF namespace
624
625//==============================================================================
626
TAppDescriptor - OLE application descriptor definitions.
#define DISPID_CATCH_ALL
Definition automacr.h:1045
#define WARNX(group, condition, level, message)
Definition checks.h:277
#define DIAG_DECLARE_GROUP(group)
Definition checks.h:404
bool GetClassId(TAutoClass *cls, GUID &retId)
Retrieves the GUID of the specified TAutoClass instance.
Definition appdesc.cpp:489
void AddServed(TServedObject &obj)
Definition appdesc.cpp:620
ITypeLib * GetTypeLibrary()
Returns the 'ITypeLib' interface pointer describing the objects exposed by this instance of 'TAppDesc...
Definition appdesc.cpp:574
void RemoveServed(TServedObject &obj)
Definition appdesc.cpp:633
LPCTSTR GetAppName(owl::TLangId lang)
Definition appdesc.h:110
owl::uint16 GetVersionField(owl::uint field)
Returns version as a whole number.
Definition appdesc.cpp:379
LPCTSTR GetHelpFile(owl::TLangId lang)
Definition appdesc.h:112
ITypeInfo * CreateITypeInfo(TAutoClass &cls)
Definition appdesc.cpp:696
int GetClassIndex(TAutoClass *cls)
Returns the index of a 'TAutoClass' instance.
Definition appdesc.cpp:473
TServedObject * FindServed(const void *mostDerivedObj)
Definition appdesc.cpp:593
TAutoSymbol * Lookup(TCHAR *name, owl::TLangId lang, short symFlags, long &id)
Definition autosym.cpp:216
TAutoSymbol * FindVariable(unsigned index, MEMBERID &retId)
Definition autosym.cpp:177
TXAuto::TError Dispatch(ObjectPtr obj, TAutoCreator &creator, TUnknown &owner, int attr, TAutoStack &args, TAutoVal *retval)
Definition autosym.cpp:256
TAutoSymbol * GetClassSymbol() const
Definition autodefs.h:1463
short CountCommands()
Definition autosym.cpp:76
short VariableCount
number of symbols exposed as typelib variables
Definition autodefs.h:181
TAutoSymbol * FindFunction(unsigned index, MEMBERID &retId)
Definition autosym.cpp:147
TAutoSymbol * LookupArg(TCHAR *name, owl::TLangId lang, TAutoSymbol *cmd, long &retid)
Definition autosym.cpp:243
TAutoCommandBuildDtr GetDestructor() const
Definition autodefs.h:1466
TAutoSymbol * FindId(long id, ObjectPtr &objptr)
Definition autosym.cpp:103
short FunctionCount
number of symbols exposed as typelib functions
Definition autodefs.h:180
short GetArgCount(TAutoSymbol &sym)
Definition autosym.cpp:207
unsigned short GetTypeFlags() const
Definition autodefs.h:1481
const std::type_info & GetTypeInfo() const
Definition autodefs.h:1469
Automation abstract base class for command objects.
Definition autodefs.h:846
void Detach(TServedObject &obj)
Definition autosrv.cpp:62
IDispatch * CreateDispatch(TObjectDescriptor objDesc, IUnknown *outer=0)
Definition autosrv.cpp:44
TServedObjectCreator(TAppDescriptor &appDesc)
Definition autosrv.cpp:23
void Attach(TServedObject &obj)
Definition autosrv.cpp:55
TAppDescriptor & AppDesc
Definition autodefs.h:947
friend class TServedObject
Definition autodefs.h:953
TUnknown * CreateObject(TObjectDescriptor objDesc, IUnknown *outer=0)
Definition autosrv.cpp:32
TServedObject * AppObject
Definition autodefs.h:948
OLE object exposed for automated access of internal object.
Definition autodefs.h:972
owl::ulong _IFUNC AddRef()
Definition autodefs.h:993
TServedObjectCreator & Creator
Definition autodefs.h:985
TObjectDescriptor::TDestruct Destruct
what to do with C++ object
Definition autodefs.h:988
void * Object
pointer to C++ object instance, 0 if deleted
Definition autodefs.h:982
const void * RootObject
pointer to object of most derived class
Definition autodefs.h:983
owl::TLangId ReqLang
language requested by caller
Definition autodefs.h:986
TAutoClass * Class
class of which object is an instance
Definition autodefs.h:984
TServedObject(TObjectDescriptor &obj, TServedObjectCreator &creator, IUnknown *outer=0)
Definition autosrv.cpp:97
Standard implementation of a controlling IUnknown for an object, to be inherited with other COM inter...
Definition oleutil.h:264
Automation exception object.
Definition autodefs.h:115
@ xParameterMissing
Definition autodefs.h:124
@ xConversionFailure
Definition autodefs.h:119
@ xExecutionFailure
Definition autodefs.h:127
@ xForeignIDispatch
Definition autodefs.h:121
@ xValidateFailure
Definition autodefs.h:126
@ xNoDefaultValue
Definition autodefs.h:125
static BSTR SysAllocString(const OLECHAR *)
Definition module.cpp:1256
#define _T(x)
Definition cygwin.h:51
Include for OC, gets common headers when precompiled headers are enabled.
Object Component Framework (COM encapsulation)
Definition appdesc.h:22
void * ObjectPtr
Definition autodefs.h:84
const void * MostDerived(const void *obj, const std::type_info &src)
Definition autosym.cpp:416
@ asOleType
method or property exposed for OLE
Definition autodefs.h:299
@ asAnyCommand
any command: method, property get/set, build
Definition autodefs.h:298
EXTERN_C const GUID IID_TServedObject
Definition autodefs.h:107
const GUID & iid
Definition appdesc.h:328
@ atString
Definition autodefs.h:331
Object Windows Library (OWLNext Core)
Definition animctrl.h:22
unsigned long ulong
Definition number.h:26
unsigned char uint8
Definition number.h:32
unsigned int uint
Definition number.h:25
Definition of TOcControl class - Proxy object representing a control in.
#define HR_DISP_TYPEMISMATCH
Definition defs.h:92
#define HR_DISP_UNKNOWNINTERFACE
Definition defs.h:97
#define HR_DISP_BADPARAMCOUNT
Definition defs.h:89
#define HR_INVALIDARG
Definition defs.h:78
#define HR_DISP_UNKNOWNNAME
Definition defs.h:98
#define HR_TYPE_INVALIDSTATE
Definition defs.h:100
#define HR_TYPE_WRONGTYPEKIND
Definition defs.h:101
#define HR_DISP_PARAMNOTOPTIONAL
Definition defs.h:94
#define HR_DISP_EXCEPTION
Definition defs.h:95
#define _OCFDATA(p)
Definition defs.h:46
#define HR_DISP_OVERFLOW
Definition defs.h:91
#define HR_DISP_BADVARTYPE
Definition defs.h:90
#define HR_DISP_PARAMNOTFOUND
Definition defs.h:93
#define HR_TYPE_LIBNOTREGISTERED
Definition defs.h:102
#define HR_NOERROR
Definition defs.h:73
#define HR_DISP_MEMBERNOTFOUND
Definition defs.h:88
OLE Registration definitions.
#define _IFUNC
Definition oleutil.h:28
#define DEFINE_QI_OLEBASE(cls, low)
Definition oleutil.h:443
#define DEFINE_COMBASES2(cls, i1, i2)
Definition oleutil.h:430
#define OleStr(s)
Definition string.h:128
@ Quiet
behavior when an automation helper is freed
Definition autodefs.h:472