OWLNext    7.0
Borland's Object Windows Library for the modern age
Loading...
Searching...
No Matches
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