71#if defined(BI_COMP_BORLANDC)
77IID_TServedObject = {0x02A101L,0,0,{0xC0,0,0,0,0,0,0,0x46}};
92 if ((iidEvent != IID_NULL) && (
iid == iidEvent))
94 return TServedCOM::QueryObject (qid, pif);
104 SetOuter(outer ? outer
132TServedObject::GetTypeInfoCount(
unsigned int * pctinfo)
139TServedObject::GetTypeInfo(
unsigned int , LCID lcid,
142 ReqLang = LANGIDFROMLCID(lcid);
143 *pptinfo =
static_cast<ITypeInfo*
>(
this);
149TServedObject::GetIDsOfNames(
const IID & riid, OLECHAR * * names,
150 unsigned int cNames, LCID lcid, DISPID * dispIds)
152 if (riid != IID_NULL)
157 for (
int i = 0; i < (int)cNames; i++) {
177TServedObject::Invoke(DISPID dispidMember,
const IID & , LCID lcid,
178 unsigned short wFlags, DISPPARAMS * dispparams,
179 VARIANT * varResult, EXCEPINFO * exceptInfo,
180 unsigned int * retArgErr)
189 WARNX(OcfDll, !
object, 1,
_T(
"TServedObject::Invoke() Object == 0"));
195 TAutoStack stack(dispidMember, dispparams->rgvarg, lcid, dispparams->cArgs,
196 dispparams->cNamedArgs, dispparams->rgdispidNamedArgs,
201 stack.Symbol =
Class->
FindId(dispidMember,
object);
215 if (!stack.Symbol->TestFlag(wFlags)) {
216 WARNX(OcfDll,
true, 1,
_T(
"TServedObject::Invoke() type unsupported"));
225 if (wFlags & (DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF))
237 ((wFlags & (DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF)) != 0) < stack.ArgCount) &&
239 WARNX(OcfDll,
true, 1,
_T(
"TServedObject::Invoke() BadParamCount"));
256 *retArgErr = stack.CurrentArg;
262 *retArgErr = stack.CurrentArg;
267 *retArgErr = stack.CurrentArg;
276 exceptInfo->wCode = (
unsigned short)stack.ErrorCode;
277 exceptInfo->wReserved = 0;
281 exceptInfo->bstrHelpFile = 0;
282 exceptInfo->pfnDeferredFillIn = 0;
286 exceptInfo->scode = E_FAIL;
304TServedObject::GetTypeAttr(TYPEATTR * * retTypeAttr)
307 TYPEATTR* ta = (TYPEATTR*)
new uint8[
sizeof(TYPEATTR)];
308 memset(ta, 0,
sizeof(TYPEATTR));
311 ta->typekind = TKIND_DISPATCH;
322TServedObject::ReleaseTypeAttr(TYPEATTR * ptypeattr)
324 delete [] (
uint8*)ptypeattr;
328TServedObject::GetFuncDesc(
unsigned int index, FUNCDESC * * retDesc)
332 if (!sym || !retDesc)
334 int kind = (sym->GetFlags() &
asOleType);
335 bool isPropSet = kind==INVOKE_PROPERTYPUT || kind==INVOKE_PROPERTYPUTREF;
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);
342 fd->cParams = short(argCount + isPropSet);
343 fd->lprgelemdescParam = (ELEMDESC*)(fd+1);
345 fd->funckind = FUNC_DISPATCH;
346 fd->invkind = (INVOKEKIND)kind;
347 fd->callconv = CC_CDECL;
349 ELEMDESC* argDesc = &fd->elemdescFunc;
351 argDesc->tdesc.vt = VT_EMPTY;
352 argDesc = (ELEMDESC*)(fd+1);
354 for (
int argIndex = 0; argIndex <= argCount; argIndex++, sym++, ptrtd++) {
355 TAutoClass* cls = sym->GetClass();
357 argDesc->tdesc.vt = VT_USERDEFINED;
358 argDesc->tdesc.hreftype = (HREFTYPE)cls;
359 }
else if (sym->IsEnum()) {
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();
370 argDesc->tdesc.vt = sym->GetDataType();
375 argDesc = (ELEMDESC*)(fd+1);
386TServedObject::ReleaseFuncDesc(FUNCDESC * pfuncdesc)
388 delete [] (
uint8*)pfuncdesc;
392TServedObject::GetVarDesc(
unsigned int index, VARDESC * * retDesc)
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));
399 if (!sym || !retDesc)
403 vd->varkind = VAR_DISPATCH;
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;
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();
418 vd->elemdescVar.tdesc.vt = sym->GetDataType();
425TServedObject::ReleaseVarDesc(VARDESC * pvardesc)
427 delete[] (
uint8*)pvardesc;
432TServedObject::GetNames(MEMBERID memid, BSTR * rgbstrNames,
433 unsigned int cMaxNames,
unsigned int * pcNames)
440 if (nameCount > (
int)cMaxNames)
441 nameCount = cMaxNames;
442 for (
int index = 0; index < nameCount; index++, sym++)
444 *pcNames = nameCount;
449TServedObject::GetIDsOfNames(OLECHAR * * names,
uint cNames,
454 for (
int i = 0; i < (int)cNames; i++) {
470TServedObject::Invoke(
void * pvInstance, MEMBERID memid,
471 unsigned short wFlags, DISPPARAMS *dispparams,
472 VARIANT *varResult, EXCEPINFO *exceptinfo,
473 unsigned int *retArgErr)
477 Object = (
void*)pvInstance;
479 HRESULT stat = Invoke(memid, IID_NULL,
ReqLang, wFlags, dispparams,
480 varResult, exceptinfo, retArgErr);
487TServedObject::GetDocumentation(MEMBERID memid,
488 BSTR * retName, BSTR * retDoc,
489 ulong * retHelpContext,
505 *retHelpContext = sym->HelpId;
512TServedObject::GetFuncDocFromIndex(
unsigned index,
513 BSTR * retName, BSTR * retDoc,
514 ulong * retHelpContext,
521 return GetDocFromSym(sym, retName, retDoc,retHelpContext, retHelpFile);
525TServedObject::GetVarDocFromIndex(
unsigned index,
526 BSTR * retName, BSTR * retDoc,
527 ulong * retHelpContext,
534 return GetDocFromSym(sym, retName, retDoc,retHelpContext, retHelpFile);
539 BSTR * retName, BSTR * retDoc,
540 ulong * retHelpContext,
548 *retHelpContext = sym->HelpId;
555TServedObject::CreateInstance(IUnknown* ,
const IID & ,
562TServedObject::GetContainingTypeLib(ITypeLib* * retLib,
563 unsigned int * retIndex)
572TServedObject::GetRefTypeInfo(HREFTYPE hreftype,
ITypeInfo* * retInfo)
574 TAutoClass* cls = (TAutoClass*)hreftype;
584TServedObject::GetTypeComp(ITypeComp* * )
590TServedObject::GetMops(MEMBERID , BSTR *)
596TServedObject::GetImplTypeFlags(
unsigned int ,
int *)
602TServedObject::GetRefTypeOfImplType(
unsigned int ,
609TServedObject::GetDllEntry(MEMBERID , INVOKEKIND ,
617TServedObject::AddressOfMember(MEMBERID , INVOKEKIND ,
TAppDescriptor - OLE application descriptor definitions.
#define WARNX(group, condition, level, message)
bool GetClassId(TAutoClass *cls, GUID &retId)
Retrieves the GUID of the specified TAutoClass instance.
void AddServed(TServedObject &obj)
ITypeLib * GetTypeLibrary()
Returns the 'ITypeLib' interface pointer describing the objects exposed by this instance of 'TAppDesc...
void RemoveServed(TServedObject &obj)
LPCTSTR GetAppName(owl::TLangId lang)
owl::uint16 GetVersionField(owl::uint field)
Returns version as a whole number.
owl::TLangId GetAppLang()
LPCTSTR GetHelpFile(owl::TLangId lang)
ITypeInfo * CreateITypeInfo(TAutoClass &cls)
int GetClassIndex(TAutoClass *cls)
Returns the index of a 'TAutoClass' instance.
TServedObject * FindServed(const void *mostDerivedObj)
TAutoSymbol * Lookup(TCHAR *name, owl::TLangId lang, short symFlags, long &id)
TAutoSymbol * FindVariable(unsigned index, MEMBERID &retId)
TXAuto::TError Dispatch(ObjectPtr obj, TAutoCreator &creator, TUnknown &owner, int attr, TAutoStack &args, TAutoVal *retval)
TAutoSymbol * GetClassSymbol() const
IUnknown & Aggregate(ObjectPtr obj, TUnknown &inner)
short VariableCount
number of symbols exposed as typelib variables
TAutoSymbol * FindFunction(unsigned index, MEMBERID &retId)
TAutoSymbol * LookupArg(TCHAR *name, owl::TLangId lang, TAutoSymbol *cmd, long &retid)
TAutoCommandBuildDtr GetDestructor() const
TAutoSymbol * FindId(long id, ObjectPtr &objptr)
short FunctionCount
number of symbols exposed as typelib functions
short GetArgCount(TAutoSymbol &sym)
unsigned short GetTypeFlags() const
const std::type_info & GetTypeInfo() const
Automation abstract base class for command objects.
virtual TAutoCommand & Invoke()
void Detach(TServedObject &obj)
IDispatch * CreateDispatch(TObjectDescriptor objDesc, IUnknown *outer=0)
TServedObjectCreator(TAppDescriptor &appDesc)
void Attach(TServedObject &obj)
friend class TServedObject
TUnknown * CreateObject(TObjectDescriptor objDesc, IUnknown *outer=0)
TServedObject * AppObject
owl::ulong _IFUNC AddRef()
HRESULT QueryObject(const IID &iid, void **iface)
TServedObjectCreator & Creator
TObjectDescriptor::TDestruct Destruct
what to do with C++ object
void * Object
pointer to C++ object instance, 0 if deleted
const void * RootObject
pointer to object of most derived class
owl::TLangId ReqLang
language requested by caller
TAutoClass * Class
class of which object is an instance
TServedObject(TObjectDescriptor &obj, TServedObjectCreator &creator, IUnknown *outer=0)
Standard implementation of a controlling IUnknown for an object, to be inherited with other COM inter...
Automation exception object.
Include for OC, gets common headers when precompiled headers are enabled.
Object Component Framework (COM encapsulation).
const void * MostDerived(const void *obj, const std::type_info &src)
@ asOleType
method or property exposed for OLE
@ asAnyCommand
any command: method, property get/set, build
_OCFDATA(TAutoCommand::TErrorMsgHook) TAutoCommand_ErrorLookup
EXTERN_C const GUID IID_TServedObject
BSTR SysAllocString(const char *str)
DIAG_DECLARE_GROUP(OwlThread)
Definition of TOcControl class - Proxy object representing a control in.
interface _ICLASS ITypeInfo
#define HR_DISP_TYPEMISMATCH
#define HR_DISP_UNKNOWNINTERFACE
#define HR_DISP_BADPARAMCOUNT
#define HR_DISP_UNKNOWNNAME
#define HR_TYPE_INVALIDSTATE
#define HR_TYPE_WRONGTYPEKIND
#define HR_DISP_PARAMNOTOPTIONAL
#define HR_DISP_EXCEPTION
#define HR_DISP_BADVARTYPE
#define HR_DISP_PARAMNOTFOUND
#define HR_TYPE_LIBNOTREGISTERED
#define HR_DISP_MEMBERNOTFOUND
OLE Registration definitions.
#define DEFINE_QI_OLEBASE(cls, low)
#define DEFINE_COMBASES2(cls, i1, i2)
TAutoClass * GetClass() const
const void * MostDerived()
TAutoClass * Class
class descriptor, contains type info
const void * Object
< ONLY for use when storing in TAutoVal union
@ Quiet
behavior when an automation helper is freed