2 * Dispatch API functions
4 * Copyright 2000 Francois Jacques, Macadamian Technologies Inc.
8 * TODO: Type coercion is implemented in variant.c but not called yet.
22 #include "winreg.h" /* for HKEY_LOCAL_MACHINE */
23 #include "winnls.h" /* for PRIMARYLANGID */
25 #include "wine/obj_oleaut.h"
27 #include "debugtools.h"
29 DEFAULT_DEBUG_CHANNEL(ole);
30 DECLARE_DEBUG_CHANNEL(typelib);
33 /******************************************************************************
34 * DispInvoke (OLEAUT32.30)
37 * Calls method of an object through its IDispatch interface.
40 * - Defer method invocation to ITypeInfo::Invoke()
46 HRESULT WINAPI DispInvoke(
47 VOID *_this, /* [in] object instance */
48 ITypeInfo *ptinfo, /* [in] object's type info */
49 DISPID dispidMember, /* [in] member id */
50 USHORT wFlags, /* [in] kind of method call */
51 DISPPARAMS *pparams, /* [in] array of arguments */
52 VARIANT *pvarResult, /* [out] result of method call */
53 EXCEPINFO *pexcepinfo, /* [out] information about exception */
54 UINT *puArgErr) /* [out] index of bad argument(if any) */
60 * For each param, call DispGetParam to perform type coercion
62 FIXME("Coercion of arguments not implemented\n");
64 hr = ICOM_CALL7(Invoke,
69 pparams, pvarResult, pexcepinfo, puArgErr);
75 /******************************************************************************
76 * DispGetIDsOfNames (OLEAUT32.29)
78 * Convert a set of names to dispids, based on information
79 * contained in object's type library.
82 * - Defers to ITypeInfo::GetIDsOfNames()
88 HRESULT WINAPI DispGetIDsOfNames(
89 ITypeInfo *ptinfo, /* [in] */
90 OLECHAR **rgszNames, /* [in] */
91 UINT cNames, /* [in] */
92 DISPID *rgdispid) /* [out] */
96 hr = ICOM_CALL3(GetIDsOfNames,
104 /******************************************************************************
105 * DispGetParam (OLEAUT32.28)
107 * Retrive a parameter from a DISPPARAMS structures and coerce it to
108 * specified variant type
111 * Coercion is done using system (0) locale.
117 HRESULT WINAPI DispGetParam(
118 DISPPARAMS *pdispparams, /* [in] */
119 UINT position, /* [in] */
120 VARTYPE vtTarg, /* [in] */
121 VARIANT *pvarResult, /* [out] */
122 UINT *puArgErr) /* [out] */
124 /* position is counted backwards */
128 TRACE("position=%d, cArgs=%d, cNamedArgs=%d\n",
129 position, pdispparams->cArgs, pdispparams->cNamedArgs);
130 if (position < pdispparams->cArgs) {
131 /* positional arg? */
132 pos = pdispparams->cArgs - position - 1;
134 /* FIXME: is this how to handle named args? */
135 for (pos=0; pos<pdispparams->cNamedArgs; pos++)
136 if (pdispparams->rgdispidNamedArgs[pos] == position) break;
138 if (pos==pdispparams->cNamedArgs)
139 return DISP_E_PARAMNOTFOUND;
141 hr = VariantChangeType(pvarResult,
142 &pdispparams->rgvarg[pos],
144 if (hr == DISP_E_TYPEMISMATCH) *puArgErr = pos;