Sync to Wine-20050111:

Eric Pouech <pouech-eric@wanadoo.fr>
- Removed excessive statement (break after return or goto, not useful
  break, not needed vars...)
- Fixed some errors in function prototypes.
- Some missing const correctness fixes.
Francois Gouget <fgouget@free.fr>
- Assorted spelling fixes.
Robert Shearman <rob@codeweavers.com>
- Make the DECIMAL_SETZERO macro take a DECIMAL instead of a DECIMAL* as
  in the Microsoft headers and fix up the only caller.
Michael Stefaniuc <mstefani@redhat.de>
- Do not check for non NULL pointer before HeapFree'ing it. It's
  redundant.
Bill Medland <billmedland@mercuryspeed.com>
- Fully initialise the structure to prevent ill-defined behaviour.
Jon Griffiths <jon_p_griffiths@yahoo.com>
- Remove unneeded headers to reduce unneeded rebuilds.
Robert Shearman <rob@codeweavers.com>
- Implement RPC_E_DISCONNECTED in proxies.
Dmitry Timoshkov <dmitry@codeweavers.com>
- Add Russian translations.
Huw Davies <huw@codeweavers.com>
- The value of a packed VARIANT can be up to 1L << 26 - 1.
- Fix comment to reflect reality and indeed the code.
- Remove the remaining dependencies on internal structures from Invoke.
- GetTypeAttr should deep copy the typedesc.
- Fix return value of GetVarIndexOfMemId.
- Remove Invoke's dependence on the internal TLBFuncDesc structure.
- Fix memory leaks in some failure cases.
- GetFuncIndexOfMemId should respect invkind and return
  TYPE_E_ELEMENTNOTFOUND if the function cannot be found.
- Allocate the TYPEATTR rather than copying it.
- For a dual interface the dispinterface's cfuncs should include the
  inherited functions, cbSizeVft should just be the size of IDispatch's
  vtbl and we should strip TYPEFLAG_FOLEAUTOMATION.
- Fix typelib generation of CARRAYs.
Paul Vriens <Paul.Vriens@xs4all.nl>
- use Interlocked* functions in AddRef and Release.
- store the result of the Interlocked functions and use only this.
Walt Ogburn <reuben@ugcs.caltech.edu>
- In OlePictureImpl_Load, always use DIB_RGB_COLORS because no indexed
  palette has been defined.
Alexandre Julliard <julliard@winehq.org>
- Another warning fix.
- Avoid warnings.

svn path=/trunk/; revision=12987
This commit is contained in:
Gé van Geldorp 2005-01-12 19:51:40 +00:00
parent a30c1830c0
commit edc6b71a42
11 changed files with 252 additions and 198 deletions

View file

@ -33,7 +33,6 @@
#include "winerror.h"
#include "ole2disp.h"
#include "olectl.h"
#include "wine/debug.h"

View file

@ -36,12 +36,13 @@
#include "oleaut32_No.rc"
#include "oleaut32_Pl.rc"
#include "oleaut32_Pt.rc"
#include "oleaut32_Ru.rc"
#include "oleaut32_Sv.rc"
#include "oleaut32_Th.rc"
/*
* FIXME:
* Finnish, Greek, Hebrew, Japanese, Korean, Portuguese,
* Russian, Turkish, Slovenian (at least) are localised in XP Home.
* Turkish, Slovenian (at least) are localised in XP Home.
* I expect Chinese etc are localised in Asian Editions also.
*/

View file

@ -454,8 +454,7 @@ static void OLEFontImpl_Destroy(OLEFontImpl* fontDesc)
{
TRACE("(%p)\n", fontDesc);
if (fontDesc->description.lpstrName!=0)
HeapFree(GetProcessHeap(), 0, fontDesc->description.lpstrName);
HeapFree(GetProcessHeap(), 0, fontDesc->description.lpstrName);
if (fontDesc->gdiFont!=0)
DeleteObject(fontDesc->gdiFont);
@ -1594,8 +1593,7 @@ static HRESULT WINAPI OLEFontImpl_Load(
if (cbRead!=bStringSize)
return E_FAIL;
if (this->description.lpstrName!=0)
HeapFree(GetProcessHeap(), 0, this->description.lpstrName);
HeapFree(GetProcessHeap(), 0, this->description.lpstrName);
len = MultiByteToWideChar( CP_ACP, 0, readBuffer, bStringSize, NULL, 0 );
this->description.lpstrName = HeapAlloc( GetProcessHeap(), 0, (len+1) * sizeof(WCHAR) );

View file

@ -301,7 +301,7 @@ static void OLEPictureImpl_Destroy(OLEPictureImpl* Obj)
break;
}
}
if (Obj->data) HeapFree(GetProcessHeap(), 0, Obj->data);
HeapFree(GetProcessHeap(), 0, Obj->data);
HeapFree(GetProcessHeap(), 0, Obj);
}
@ -1172,7 +1172,6 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) {
FIXME("Trying to load GIF, but no support for libgif/libungif compiled in.\n");
return E_FAIL;
#endif
break;
}
case 0xd8ff: { /* JPEG */
#ifdef HAVE_JPEGLIB_H

View file

@ -154,7 +154,7 @@ static inline DWORD SAFEARRAY_GetHiddenDWORD(SAFEARRAY* psa)
/* Get the number of cells in a SafeArray */
static ULONG SAFEARRAY_GetCellCount(const SAFEARRAY *psa)
{
SAFEARRAYBOUND* psab = psa->rgsabound;
const SAFEARRAYBOUND* psab = psa->rgsabound;
USHORT cCount = psa->cDims;
ULONG ulNumCells = 1;

View file

@ -42,11 +42,8 @@
#include "winuser.h"
#include "ole2.h"
#include "wine/unicode.h"
#include "ole2disp.h"
#include "typelib.h"
#include "wine/debug.h"
#include "winternl.h"
static const WCHAR riidW[5] = {'r','i','i','d',0};
static const WCHAR pdispparamsW[] = {'p','d','i','s','p','p','a','r','a','m','s',0};
@ -1159,7 +1156,6 @@ _get_funcdesc(
}
i++;
}
return E_FAIL;
}
static DWORD
@ -1185,6 +1181,13 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */)
return E_FAIL;
}
if (!tpinfo->chanbuf)
{
WARN("Tried to use disconnected proxy\n");
LeaveCriticalSection(&tpinfo->crit);
return RPC_E_DISCONNECTED;
}
if (relaydeb) {
TRACE_(olerelay)("->");
if (iname)
@ -1471,6 +1474,7 @@ PSFacBuf_CreateProxy(
proxy->ref = 2;
proxy->tinfo = tinfo;
memcpy(&proxy->iid,riid,sizeof(*riid));
proxy->chanbuf = 0;
*ppv = (LPVOID)proxy;
*ppProxy = (IRpcProxyBuffer *)&(proxy->lpvtbl2);
return S_OK;

View file

@ -74,7 +74,6 @@
#include "wine/unicode.h"
#include "objbase.h"
#include "ole2disp.h"
#include "typelib.h"
#include "wine/debug.h"
#include "variant.h"
@ -848,7 +847,7 @@ typedef struct tagITypeLibImpl
{
ITypeLib2Vtbl *lpVtbl;
ITypeCompVtbl *lpVtblTypeComp;
UINT ref;
ULONG ref;
TLIBATTR LibAttr; /* guid,lcid,syskind,version,flags */
/* strings can be stored in tlb as multibyte strings BUT they are *always*
@ -959,7 +958,7 @@ typedef struct tagITypeInfoImpl
{
ITypeInfo2Vtbl *lpVtbl;
ITypeCompVtbl *lpVtblTypeComp;
UINT ref;
ULONG ref;
TYPEATTR TypeAttr ; /* _lots_ of type information. */
ITypeLibImpl * pTypeLib; /* back pointer to typelib */
int index; /* index in this typelib; */
@ -989,7 +988,7 @@ typedef struct tagITypeInfoImpl
static struct ITypeInfo2Vtbl tinfvt;
static struct ITypeCompVtbl tcompvt;
static ITypeInfo2 * WINAPI ITypeInfo_Constructor();
static ITypeInfo2 * WINAPI ITypeInfo_Constructor(void);
typedef struct tagTLBContext
{
@ -1277,7 +1276,7 @@ static void dump_DispParms(DISPPARAMS * pdp)
static void dump_TypeInfo(ITypeInfoImpl * pty)
{
TRACE("%p ref=%u\n", pty, pty->ref);
TRACE("%p ref=%lu\n", pty, pty->ref);
TRACE("attr:%s\n", debugstr_guid(&(pty->TypeAttr.guid)));
TRACE("kind:%s\n", typekind_desc[pty->TypeAttr.typekind]);
TRACE("fct:%u var:%u impl:%u\n",
@ -1331,6 +1330,50 @@ static void TLB_Free(void * ptr)
HeapFree(GetProcessHeap(), 0, ptr);
}
/* deep copy a typedesc */
static void copy_typedesc(TYPEDESC *out, const TYPEDESC *in)
{
out->vt = in->vt;
switch(in->vt) {
case VT_PTR:
out->u.lptdesc = HeapAlloc(GetProcessHeap(), 0, sizeof(TYPEDESC));
copy_typedesc(out->u.lptdesc, in->u.lptdesc);
break;
case VT_USERDEFINED:
out->u.hreftype = in->u.hreftype;
break;
case VT_CARRAY:
out->u.lpadesc = HeapAlloc(GetProcessHeap(), 0, sizeof(ARRAYDESC) +
(in->u.lpadesc->cDims - 1) * sizeof(SAFEARRAYBOUND));
copy_typedesc(&out->u.lpadesc->tdescElem, &in->u.lpadesc->tdescElem);
out->u.lpadesc->cDims = in->u.lpadesc->cDims;
memcpy(out->u.lpadesc->rgbounds, in->u.lpadesc->rgbounds, in->u.lpadesc->cDims * sizeof(SAFEARRAYBOUND));
break;
default:
break;
}
}
/* free()s any allocated memory pointed to by the tdesc. NB does not
free the tdesc itself - this is because the tdesc is typically part
of a larger structure */
static void free_deep_typedesc(TYPEDESC *tdesc)
{
switch(tdesc->vt) {
case VT_PTR:
free_deep_typedesc(tdesc->u.lptdesc);
HeapFree(GetProcessHeap(), 0, tdesc->u.lptdesc);
tdesc->u.lptdesc = NULL;
break;
case VT_CARRAY:
free_deep_typedesc(&tdesc->u.lpadesc->tdescElem);
HeapFree(GetProcessHeap(), 0, tdesc->u.lpadesc);
tdesc->u.lpadesc = NULL;
break;
default:
break;
}
}
/**********************************************************************
*
@ -1473,7 +1516,7 @@ static void MSFT_ReadValue( VARIANT * pVar, int offset, TLBContext *pcx )
if(offset <0) { /* data are packed in here */
V_VT(pVar) = (offset & 0x7c000000 )>> 26;
V_UNION(pVar, iVal) = offset & 0xffff;
V_UNION(pVar, iVal) = offset & 0x3ffffff;
return;
}
MSFT_ReadLEWords(&(V_VT(pVar)), sizeof(VARTYPE), pcx,
@ -1604,7 +1647,7 @@ MSFT_DoFuncs(TLBContext* pcx,
* of this (first) part excluding this field. Then follow the records,
* for each member there is one record.
*
* First entry is always the length of the record (excluding this
* First entry is always the length of the record (including this
* length word).
* Rest of the record depends on the type of the member. If there is
* a field indicating the member type (function variable intereface etc)
@ -3391,10 +3434,11 @@ static HRESULT WINAPI ITypeLib2_fnQueryInterface(
static ULONG WINAPI ITypeLib2_fnAddRef( ITypeLib2 *iface)
{
ITypeLibImpl *This = (ITypeLibImpl *)iface;
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->ref was %u\n",This, This->ref);
TRACE("(%p)->ref was %lu\n",This, ref - 1);
return ++(This->ref);
return ref;
}
/* ITypeLib::Release
@ -3402,12 +3446,11 @@ static ULONG WINAPI ITypeLib2_fnAddRef( ITypeLib2 *iface)
static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface)
{
ITypeLibImpl *This = (ITypeLibImpl *)iface;
ULONG ref = InterlockedDecrement(&This->ref);
--(This->ref);
TRACE("(%p)->(%lu)\n",This, ref);
TRACE("(%p)->(%u)\n",This, This->ref);
if (!This->ref)
if (!ref)
{
/* remove cache entry */
TRACE("removing from cache list\n");
@ -3450,7 +3493,7 @@ static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface)
return 0;
}
return This->ref;
return ref;
}
/* ITypeLib::GetTypeInfoCount
@ -4067,12 +4110,12 @@ static HRESULT WINAPI ITypeInfo_fnQueryInterface(
static ULONG WINAPI ITypeInfo_fnAddRef( ITypeInfo2 *iface)
{
ITypeInfoImpl *This = (ITypeInfoImpl *)iface;
ULONG ref = InterlockedIncrement(&This->ref);
++(This->ref);
ITypeLib2_AddRef((ITypeLib2*)This->pTypeLib);
TRACE("(%p)->ref is %u\n",This, This->ref);
return This->ref;
TRACE("(%p)->ref is %lu\n",This, ref);
return ref;
}
/* ITypeInfo::Release
@ -4080,12 +4123,11 @@ static ULONG WINAPI ITypeInfo_fnAddRef( ITypeInfo2 *iface)
static ULONG WINAPI ITypeInfo_fnRelease(ITypeInfo2 *iface)
{
ITypeInfoImpl *This = (ITypeInfoImpl *)iface;
ULONG ref = InterlockedDecrement(&This->ref);
--(This->ref);
TRACE("(%p)->(%lu)\n",This, ref);
TRACE("(%p)->(%u)\n",This, This->ref);
if (This->ref) {
if (ref) {
/* We don't release ITypeLib when ref=0 becouse
it means that funtion is called by ITypeLi2_Release */
ITypeLib2_Release((ITypeLib2*)This->pTypeLib);
@ -4113,7 +4155,7 @@ static ULONG WINAPI ITypeInfo_fnRelease(ITypeInfo2 *iface)
HeapFree(GetProcessHeap(),0,This);
return 0;
}
return This->ref;
return ref;
}
/* ITypeInfo::GetTypeAttr
@ -4127,8 +4169,18 @@ static HRESULT WINAPI ITypeInfo_fnGetTypeAttr( ITypeInfo2 *iface,
{
ITypeInfoImpl *This = (ITypeInfoImpl *)iface;
TRACE("(%p)\n",This);
/* FIXME: must do a copy here */
*ppTypeAttr=&This->TypeAttr;
*ppTypeAttr = HeapAlloc(GetProcessHeap(), 0, sizeof(**ppTypeAttr));
memcpy(*ppTypeAttr, &This->TypeAttr, sizeof(**ppTypeAttr));
if(This->TypeAttr.typekind == TKIND_ALIAS) /* need to deep copy typedesc */
copy_typedesc(&(*ppTypeAttr)->tdescAlias, &This->TypeAttr.tdescAlias);
if((*ppTypeAttr)->typekind == TKIND_DISPATCH && (*ppTypeAttr)->wTypeFlags & TYPEFLAG_FDUAL) {
(*ppTypeAttr)->cFuncs = (*ppTypeAttr)->cbSizeVft / 4; /* This should include all the inherited
funcs */
(*ppTypeAttr)->cbSizeVft = 28; /* This is always the size of IDispatch's vtbl */
(*ppTypeAttr)->wTypeFlags &= ~TYPEFLAG_FOLEAUTOMATION;
}
return S_OK;
}
@ -4683,9 +4735,9 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
UINT *pArgErr)
{
ITypeInfoImpl *This = (ITypeInfoImpl *)iface;
TLBFuncDesc * pFDesc;
TLBVarDesc * pVDesc;
int i;
unsigned int func_index, var_index;
TYPEKIND type_kind;
HRESULT hres;
TRACE("(%p)(%p,id=%ld,flags=0x%08x,%p,%p,%p,%p) partial stub!\n",
@ -4693,31 +4745,30 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
);
dump_DispParms(pDispParams);
for(pFDesc=This->funclist; pFDesc; pFDesc=pFDesc->next)
if (pFDesc->funcdesc.memid == memid) {
if (pFDesc->funcdesc.invkind & dwFlags)
break;
}
if (pFDesc) {
if (TRACE_ON(typelib)) dump_TLBFuncDescOne(pFDesc);
/* dump_FUNCDESC(&pFDesc->funcdesc);*/
switch (pFDesc->funcdesc.funckind) {
hres = ITypeInfo2_GetFuncIndexOfMemId(iface, memid, dwFlags, &func_index);
if (SUCCEEDED(hres)) {
FUNCDESC *func_desc;
hres = ITypeInfo2_GetFuncDesc(iface, func_index, &func_desc);
if(FAILED(hres)) return hres;
switch (func_desc->funckind) {
case FUNC_PUREVIRTUAL:
case FUNC_VIRTUAL: {
DWORD res;
int numargs, numargs2, argspos, args2pos;
DWORD *args , *args2;
VARIANT *rgvarg = HeapAlloc(GetProcessHeap(),0,sizeof(VARIANT)*pFDesc->funcdesc.cParams);
VARIANT *rgvarg = HeapAlloc(GetProcessHeap(), 0, sizeof(VARIANT) * func_desc->cParams);
memcpy(rgvarg,pDispParams->rgvarg,sizeof(VARIANT)*pDispParams->cArgs);
hres = S_OK;
numargs = 1; numargs2 = 0;
for (i=0;i<pFDesc->funcdesc.cParams;i++) {
for (i = 0; i < func_desc->cParams; i++) {
if (i<pDispParams->cArgs)
numargs += _argsize(pFDesc->funcdesc.lprgelemdescParam[i].tdesc.vt);
numargs += _argsize(func_desc->lprgelemdescParam[i].tdesc.vt);
else {
numargs += 1; /* sizeof(lpvoid) */
numargs2 += _argsize(pFDesc->funcdesc.lprgelemdescParam[i].tdesc.vt);
numargs2 += _argsize(func_desc->lprgelemdescParam[i].tdesc.vt);
}
}
@ -4726,14 +4777,14 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
args[0] = (DWORD)pIUnk;
argspos = 1; args2pos = 0;
for (i=0;i<pFDesc->funcdesc.cParams;i++) {
int arglen = _argsize(pFDesc->funcdesc.lprgelemdescParam[i].tdesc.vt);
for (i = 0; i < func_desc->cParams; i++) {
int arglen = _argsize(func_desc->lprgelemdescParam[i].tdesc.vt);
if (i<pDispParams->cArgs) {
VARIANT *arg = &rgvarg[pDispParams->cArgs-i-1];
TYPEDESC *tdesc = &pFDesc->funcdesc.lprgelemdescParam[i].tdesc;
USHORT paramFlags = pFDesc->funcdesc.lprgelemdescParam[i].u.paramdesc.wParamFlags;
TYPEDESC *tdesc = &func_desc->lprgelemdescParam[i].tdesc;
USHORT paramFlags = func_desc->lprgelemdescParam[i].u.paramdesc.wParamFlags;
if (paramFlags & PARAMFLAG_FOPT) {
if(i < pFDesc->funcdesc.cParams-pFDesc->funcdesc.cParamsOpt)
if(i < func_desc->cParams - func_desc->cParamsOpt)
ERR("Parameter has PARAMFLAG_FOPT flag but is not one of last cParamOpt parameters\n");
if(V_VT(arg) == VT_EMPTY
|| ((V_VT(arg) & VT_BYREF) && !V_BYREF(arg))) {
@ -4748,23 +4799,23 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
}
}
hres = _copy_arg(iface, tdesc, &args[argspos], arg, tdesc->vt);
if (FAILED(hres)) return hres;
if (FAILED(hres)) goto func_fail;
argspos += arglen;
} else if(pFDesc->funcdesc.lprgelemdescParam[i].u.paramdesc.wParamFlags & PARAMFLAG_FOPT) {
} else if(func_desc->lprgelemdescParam[i].u.paramdesc.wParamFlags & PARAMFLAG_FOPT) {
VARIANT *arg = &rgvarg[i];
TYPEDESC *tdesc = &pFDesc->funcdesc.lprgelemdescParam[i].tdesc;
if(i < pFDesc->funcdesc.cParams-pFDesc->funcdesc.cParamsOpt)
TYPEDESC *tdesc = &func_desc->lprgelemdescParam[i].tdesc;
if(i < func_desc->cParams - func_desc->cParamsOpt)
ERR("Parameter has PARAMFLAG_FOPT flag but is not one of last cParamOpt parameters\n");
if(pFDesc->funcdesc.lprgelemdescParam[i].u.paramdesc.wParamFlags & PARAMFLAG_FHASDEFAULT)
if(func_desc->lprgelemdescParam[i].u.paramdesc.wParamFlags & PARAMFLAG_FHASDEFAULT)
FIXME("PARAMFLAG_FHASDEFAULT flag not supported\n");
V_VT(arg) = VT_ERROR;
V_ERROR(arg) = DISP_E_PARAMNOTFOUND;
arglen = _argsize(VT_ERROR);
hres = _copy_arg(iface, tdesc, &args[argspos], arg, tdesc->vt);
if (FAILED(hres)) return hres;
if (FAILED(hres)) goto func_fail;
argspos += arglen;
} else {
TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i].tdesc);
TYPEDESC *tdesc = &(func_desc->lprgelemdescParam[i].tdesc);
if (tdesc->vt != VT_PTR)
FIXME("set %d to pointer for get (type is %d)\n",i,tdesc->vt);
/*FIXME: give pointers for the rest, so propertyget works*/
@ -4774,32 +4825,28 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
if ((tdesc->vt == VT_PTR) &&
(tdesc->u.lptdesc->vt == VT_VARIANT) &&
pVarResult
)
args[argspos]= (DWORD)pVarResult;
)
args[argspos]= (DWORD)pVarResult;
argspos += 1;
args2pos += arglen;
}
}
if (pFDesc->funcdesc.cParamsOpt < 0)
FIXME("Does not support optional parameters (%d)\n",
pFDesc->funcdesc.cParamsOpt
);
if (func_desc->cParamsOpt < 0)
FIXME("Does not support optional parameters (%d)\n", func_desc->cParamsOpt);
res = _invoke((*(FARPROC**)pIUnk)[pFDesc->funcdesc.oVft/4],
pFDesc->funcdesc.callconv,
res = _invoke((*(FARPROC**)pIUnk)[func_desc->oVft/4],
func_desc->callconv,
numargs,
args
);
HeapFree(GetProcessHeap(), 0, rgvarg);
if (pVarResult && (dwFlags & (DISPATCH_PROPERTYGET))) {
args2pos = 0;
for (i=0;i<pFDesc->funcdesc.cParams-pDispParams->cArgs;i++) {
int arglen = _argsize(pFDesc->funcdesc.lprgelemdescParam[i].tdesc.vt);
TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i+pDispParams->cArgs].tdesc);
TYPEDESC i4_tdesc;
i4_tdesc.vt = VT_I4;
for (i = 0; i < func_desc->cParams - pDispParams->cArgs; i++) {
int arglen = _argsize(func_desc->lprgelemdescParam[i].tdesc.vt);
TYPEDESC *tdesc = &(func_desc->lprgelemdescParam[i + pDispParams->cArgs].tdesc);
TYPEDESC i4_tdesc;
i4_tdesc.vt = VT_I4;
/* If we are a pointer to a variant, we are done already */
if ((tdesc->vt==VT_PTR)&&(tdesc->u.lptdesc->vt==VT_VARIANT))
@ -4815,16 +4862,16 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
TYPEATTR *tattr;
hres = ITypeInfo_GetRefTypeInfo(iface,tdesc->u.hreftype,&tinfo2);
if (hres) {
if (FAILED(hres)) {
FIXME("Could not get typeinfo of hreftype %lx for VT_USERDEFINED, while coercing. Copying 4 byte.\n",tdesc->u.hreftype);
return E_FAIL;
goto func_fail;
}
ITypeInfo_GetTypeAttr(tinfo2,&tattr);
switch (tattr->typekind) {
case TKIND_ENUM:
/* force the return type to be VT_I4 */
tdesc = &i4_tdesc;
break;
/* force the return type to be VT_I4 */
tdesc = &i4_tdesc;
break;
case TKIND_ALIAS:
TRACE("TKIND_ALIAS to vt 0x%x\n",tattr->tdescAlias.vt);
tdesc = &(tattr->tdescAlias);
@ -4859,57 +4906,67 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
args2pos += arglen;
}
}
func_fail:
HeapFree(GetProcessHeap(), 0, rgvarg);
HeapFree(GetProcessHeap(),0,args2);
HeapFree(GetProcessHeap(),0,args);
return S_OK;
break;
}
case FUNC_DISPATCH: {
IDispatch *disp;
HRESULT hr;
hr = IUnknown_QueryInterface((LPUNKNOWN)pIUnk,&IID_IDispatch,(LPVOID*)&disp);
if (hr) {
hres = IUnknown_QueryInterface((LPUNKNOWN)pIUnk,&IID_IDispatch,(LPVOID*)&disp);
if (SUCCEEDED(hres)) {
FIXME("Calling Invoke in IDispatch iface. untested!\n");
hres = IDispatch_Invoke(
disp,memid,&IID_NULL,LOCALE_USER_DEFAULT,dwFlags,pDispParams,
pVarResult,pExcepInfo,pArgErr
);
if (FAILED(hres))
FIXME("IDispatch::Invoke failed with %08lx. (Could be not a real error?)\n", hres);
IDispatch_Release(disp);
} else
FIXME("FUNC_DISPATCH used on object without IDispatch iface?\n");
return hr;
}
FIXME("Calling Invoke in IDispatch iface. untested!\n");
hr = IDispatch_Invoke(
disp,memid,&IID_NULL,LOCALE_USER_DEFAULT,dwFlags,pDispParams,
pVarResult,pExcepInfo,pArgErr
);
if (hr)
FIXME("IDispatch::Invoke failed with %08lx. (Could be not a real error?)\n",hr);
IDispatch_Release(disp);
return hr;
break;
}
default:
FIXME("Unknown function invocation type %d\n",pFDesc->funcdesc.funckind);
return E_FAIL;
}
} else {
for(pVDesc=This->varlist; pVDesc; pVDesc=pVDesc->next) {
if (pVDesc->vardesc.memid == memid) {
FIXME("varseek: Found memid name %s, but variable-based invoking not supported\n",debugstr_w(((LPWSTR)pVDesc->Name)));
dump_TLBVarDesc(pVDesc);
break;
}
}
}
/* not found, look for it in inherited interfaces */
if (This->TypeAttr.cImplTypes &&
(This->TypeAttr.typekind==TKIND_INTERFACE || This->TypeAttr.typekind==TKIND_DISPATCH)) {
/* recursive search */
ITypeInfo *pTInfo;
HRESULT hr;
hr=ITypeInfo_GetRefTypeInfo(iface, This->impltypelist->hRef, &pTInfo);
if(SUCCEEDED(hr)){
hr=ITypeInfo_Invoke(pTInfo,pIUnk,memid,dwFlags,pDispParams,pVarResult,pExcepInfo,pArgErr);
ITypeInfo_Release(pTInfo);
return hr;
FIXME("Unknown function invocation type %d\n", func_desc->funckind);
hres = E_FAIL;
break;
}
WARN("Could not search inherited interface!\n");
ITypeInfo2_ReleaseFuncDesc(iface, func_desc);
return hres;
} else if(SUCCEEDED(hres = ITypeInfo2_GetVarIndexOfMemId(iface, memid, &var_index))) {
VARDESC *var_desc;
hres = ITypeInfo2_GetVarDesc(iface, var_index, &var_desc);
if(FAILED(hres)) return hres;
FIXME("varseek: Found memid, but variable-based invoking not supported\n");
dump_VARDESC(var_desc);
ITypeInfo2_ReleaseVarDesc(iface, var_desc);
return E_NOTIMPL;
}
ERR("did not find member id %d, flags %d!\n", (int)memid, dwFlags);
/* not found, look for it in inherited interfaces */
ITypeInfo2_GetTypeKind(iface, &type_kind);
if(type_kind == TKIND_INTERFACE || type_kind == TKIND_DISPATCH) {
HREFTYPE ref_type;
if(SUCCEEDED(ITypeInfo2_GetRefTypeOfImplType(iface, 0, &ref_type))) {
/* recursive search */
ITypeInfo *pTInfo;
hres = ITypeInfo_GetRefTypeInfo(iface, ref_type, &pTInfo);
if(SUCCEEDED(hres)){
hres = ITypeInfo_Invoke(pTInfo,pIUnk,memid,dwFlags,pDispParams,pVarResult,pExcepInfo,pArgErr);
ITypeInfo_Release(pTInfo);
return hres;
}
WARN("Could not search inherited interface!\n");
}
}
ERR("did not find member id %08lx, flags %d!\n", memid, dwFlags);
return DISP_E_MEMBERNOTFOUND;
}
@ -5176,6 +5233,9 @@ static void WINAPI ITypeInfo_fnReleaseTypeAttr( ITypeInfo2 *iface,
{
ITypeInfoImpl *This = (ITypeInfoImpl *)iface;
TRACE("(%p)->(%p)\n", This, pTypeAttr);
if(This->TypeAttr.typekind == TKIND_ALIAS)
free_deep_typedesc(&pTypeAttr->tdescAlias);
HeapFree(GetProcessHeap(), 0, pTypeAttr);
}
/* ITypeInfo::ReleaseFuncDesc
@ -5242,18 +5302,18 @@ static HRESULT WINAPI ITypeInfo2_fnGetFuncIndexOfMemId( ITypeInfo2 * iface,
TLBFuncDesc *pFuncInfo;
int i;
HRESULT result;
/* FIXME: should check for invKind??? */
for(i=0, pFuncInfo=This->funclist;pFuncInfo &&
memid != pFuncInfo->funcdesc.memid; i++, pFuncInfo=pFuncInfo->next);
if(pFuncInfo){
*pFuncIndex=i;
result= S_OK;
}else{
*pFuncIndex=0;
result=E_INVALIDARG;
}
for(i = 0, pFuncInfo = This->funclist; pFuncInfo; i++, pFuncInfo=pFuncInfo->next)
if(memid == pFuncInfo->funcdesc.memid && (invKind & pFuncInfo->funcdesc.invkind))
break;
if(pFuncInfo) {
*pFuncIndex = i;
result = S_OK;
} else
result = TYPE_E_ELEMENTNOTFOUND;
TRACE("(%p) memid 0x%08lx invKind 0x%04x -> %s\n", This,
memid, invKind, SUCCEEDED(result)? "SUCCES":"FAILED");
memid, invKind, SUCCEEDED(result) ? "SUCCESS" : "FAILED");
return result;
}
@ -5273,15 +5333,14 @@ static HRESULT WINAPI ITypeInfo2_fnGetVarIndexOfMemId( ITypeInfo2 * iface,
for(i=0, pVarInfo=This->varlist; pVarInfo &&
memid != pVarInfo->vardesc.memid; i++, pVarInfo=pVarInfo->next)
;
if(pVarInfo){
*pVarIndex=i;
result= S_OK;
}else{
*pVarIndex=0;
result=E_INVALIDARG;
}
if(pVarInfo) {
*pVarIndex = i;
result = S_OK;
} else
result = TYPE_E_ELEMENTNOTFOUND;
TRACE("(%p) memid 0x%08lx -> %s\n", This,
memid, SUCCEEDED(result)? "SUCCES":"FAILED");
memid, SUCCEEDED(result) ? "SUCCESS" : "FAILED");
return result;
}

View file

@ -39,7 +39,6 @@
#include "objbase.h"
#include "ole2disp.h"
#include "typelib.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(ole);

View file

@ -48,10 +48,8 @@
#include "wine/unicode.h"
#include "objbase.h"
#include "ole2disp.h"
#include "typelib.h"
#include "wine/debug.h"
#include "variant.h"
WINE_DEFAULT_DEBUG_CHANNEL(typelib2);
/* WINE_DEFAULT_DEBUG_CHANNEL(ole); */
@ -150,7 +148,7 @@ typedef struct tagICreateTypeLib2Impl
ICreateTypeLib2Vtbl *lpVtbl;
ITypeLib2Vtbl *lpVtblTypeLib2;
UINT ref;
ULONG ref;
WCHAR *filename;
@ -176,7 +174,7 @@ typedef struct tagICreateTypeInfo2Impl
ICreateTypeInfo2Vtbl *lpVtbl;
ITypeInfo2Vtbl *lpVtblTypeInfo2;
UINT ref;
ULONG ref;
ICreateTypeLib2Impl *typelib;
MSFT_TypeInfoBase *typeinfo;
@ -979,18 +977,25 @@ static int ctl2_encode_typedesc(
break;
case VT_CARRAY:
{
/* FIXME: Make with the error checking. */
FIXME("Array vartype, hacking badly.\n");
int num_dims = tdesc->u.lpadesc->cDims, elements = 1, dim;
ctl2_encode_typedesc(This, &tdesc->u.lpadesc->tdescElem, &target_type, width, alignment, NULL);
arrayoffset = ctl2_alloc_segment(This, MSFT_SEG_ARRAYDESC, 16, 0);
arrayoffset = ctl2_alloc_segment(This, MSFT_SEG_ARRAYDESC, (2 + 2 * num_dims) * sizeof(int), 0);
arraydata = (void *)&This->typelib_segment_data[MSFT_SEG_ARRAYDESC][arrayoffset];
arraydata[0] = target_type;
arraydata[1] = 0x00080001;
arraydata[2] = 0x8;
arraydata[3] = 0;
arraydata[1] = num_dims;
arraydata[1] |= ((num_dims * 2 * sizeof(int)) << 16);
arraydata += 2;
for(dim = 0; dim < num_dims; dim++) {
arraydata[0] = tdesc->u.lpadesc->rgbounds[dim].cElements;
arraydata[1] = tdesc->u.lpadesc->rgbounds[dim].lLbound;
elements *= tdesc->u.lpadesc->rgbounds[dim].cElements;
arraydata += 2;
}
typeoffset = ctl2_alloc_segment(This, MSFT_SEG_TYPEDESC, 8, 0);
typedata = (void *)&This->typelib_segment_data[MSFT_SEG_TYPEDESC][typeoffset];
@ -998,12 +1003,11 @@ static int ctl2_encode_typedesc(
typedata[1] = arrayoffset;
*encoded_tdesc = typeoffset;
*width = 8;
*alignment = 1;
*decoded_size = sizeof(ARRAYDESC);
*width = *width * elements;
*decoded_size = sizeof(ARRAYDESC) + (num_dims - 1) * sizeof(SAFEARRAYBOUND);
break;
}
case VT_USERDEFINED:
TRACE("USERDEFINED.\n");
for (typeoffset = 0; typeoffset < This->typelib_segdir[MSFT_SEG_TYPEDESC].length; typeoffset += 8) {
@ -1138,10 +1142,11 @@ static HRESULT WINAPI ICreateTypeInfo2_fnQueryInterface(
static ULONG WINAPI ICreateTypeInfo2_fnAddRef(ICreateTypeInfo2 *iface)
{
ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->ref was %u\n",This, This->ref);
TRACE("(%p)->ref was %lu\n",This, ref - 1);
return ++(This->ref);
return ref;
}
/******************************************************************************
@ -1152,12 +1157,11 @@ static ULONG WINAPI ICreateTypeInfo2_fnAddRef(ICreateTypeInfo2 *iface)
static ULONG WINAPI ICreateTypeInfo2_fnRelease(ICreateTypeInfo2 *iface)
{
ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
ULONG ref = InterlockedDecrement(&This->ref);
--(This->ref);
TRACE("(%p)->(%lu)\n",This, ref);
TRACE("(%p)->(%u)\n",This, This->ref);
if (!This->ref) {
if (!ref) {
if (This->typelib) {
ICreateTypeLib2_fnRelease((ICreateTypeLib2 *)This->typelib);
This->typelib = NULL;
@ -1168,7 +1172,7 @@ static ULONG WINAPI ICreateTypeInfo2_fnRelease(ICreateTypeInfo2 *iface)
return 0;
}
return This->ref;
return ref;
}
@ -3005,10 +3009,11 @@ static HRESULT WINAPI ICreateTypeLib2_fnQueryInterface(
static ULONG WINAPI ICreateTypeLib2_fnAddRef(ICreateTypeLib2 *iface)
{
ICreateTypeLib2Impl *This = (ICreateTypeLib2Impl *)iface;
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->ref was %u\n",This, This->ref);
TRACE("(%p)->ref was %lu\n",This, ref - 1);
return ++(This->ref);
return ref;
}
/******************************************************************************
@ -3019,30 +3024,25 @@ static ULONG WINAPI ICreateTypeLib2_fnAddRef(ICreateTypeLib2 *iface)
static ULONG WINAPI ICreateTypeLib2_fnRelease(ICreateTypeLib2 *iface)
{
ICreateTypeLib2Impl *This = (ICreateTypeLib2Impl *)iface;
ULONG ref = InterlockedDecrement(&This->ref);
--(This->ref);
TRACE("(%p)->(%lu)\n",This, ref);
TRACE("(%p)->(%u)\n",This, This->ref);
if (!This->ref) {
if (!ref) {
int i;
for (i = 0; i < MSFT_SEG_MAX; i++) {
if (This->typelib_segment_data[i]) {
HeapFree(GetProcessHeap(), 0, This->typelib_segment_data[i]);
This->typelib_segment_data[i] = NULL;
}
HeapFree(GetProcessHeap(), 0, This->typelib_segment_data[i]);
This->typelib_segment_data[i] = NULL;
}
if (This->filename) {
HeapFree(GetProcessHeap(), 0, This->filename);
This->filename = NULL;
}
HeapFree(GetProcessHeap(), 0, This->filename);
This->filename = NULL;
while (This->typeinfos) {
ICreateTypeInfo2Impl *typeinfo = This->typeinfos;
This->typeinfos = typeinfo->next_typeinfo;
if (typeinfo->typedata) HeapFree(GetProcessHeap(), 0, typeinfo->typedata);
HeapFree(GetProcessHeap(), 0, typeinfo->typedata);
HeapFree(GetProcessHeap(), 0, typeinfo);
}
@ -3050,7 +3050,7 @@ static ULONG WINAPI ICreateTypeLib2_fnRelease(ICreateTypeLib2 *iface)
return 0;
}
return This->ref;
return ref;
}

View file

@ -1310,12 +1310,10 @@ static HRESULT VARIANT_FormatNumber(LPVARIANT pVarIn, LPOLESTR lpszFormat,
case FMT_NUM_YES_NO:
boolFlag = VAR_BOOLYESNO;
goto VARIANT_FormatNumber_Bool;
break;
case FMT_NUM_ON_OFF:
boolFlag = VAR_BOOLONOFF;
goto VARIANT_FormatNumber_Bool;
break;
case FMT_NUM_TRUE_FALSE:
boolFlag = VAR_LOCALBOOL;
@ -1452,7 +1450,6 @@ VARIANT_FormatNumber_Bool:
ERR("Unknown token 0x%02x!\n", *pToken);
hRes = E_INVALIDARG;
goto VARIANT_FormatNumber_Exit;
break;
}
if (localeValue)
{
@ -1762,7 +1759,6 @@ static HRESULT VARIANT_FormatDate(LPVARIANT pVarIn, LPOLESTR lpszFormat,
ERR("Unknown token 0x%02x!\n", *pToken);
hRes = E_INVALIDARG;
goto VARIANT_FormatDate_Exit;
break;
}
if (localeValue)
{
@ -1916,7 +1912,6 @@ static HRESULT VARIANT_FormatString(LPVARIANT pVarIn, LPOLESTR lpszFormat,
ERR("Unknown token 0x%02x!\n", *pToken);
hRes = E_INVALIDARG;
goto VARIANT_FormatString_Exit;
break;
}
pToken++;
}

View file

@ -764,24 +764,24 @@ static inline size_t VARIANT_DataSize(const VARIANT* pv)
switch (V_TYPE(pv))
{
case VT_I1:
case VT_UI1: return sizeof(BYTE); break;
case VT_UI1: return sizeof(BYTE);
case VT_I2:
case VT_UI2: return sizeof(SHORT); break;
case VT_UI2: return sizeof(SHORT);
case VT_INT:
case VT_UINT:
case VT_I4:
case VT_UI4: return sizeof(LONG); break;
case VT_UI4: return sizeof(LONG);
case VT_I8:
case VT_UI8: return sizeof(LONGLONG); break;
case VT_R4: return sizeof(float); break;
case VT_R8: return sizeof(double); break;
case VT_DATE: return sizeof(DATE); break;
case VT_BOOL: return sizeof(VARIANT_BOOL); break;
case VT_UI8: return sizeof(LONGLONG);
case VT_R4: return sizeof(float);
case VT_R8: return sizeof(double);
case VT_DATE: return sizeof(DATE);
case VT_BOOL: return sizeof(VARIANT_BOOL);
case VT_DISPATCH:
case VT_UNKNOWN:
case VT_BSTR: return sizeof(void*); break;
case VT_CY: return sizeof(CY); break;
case VT_ERROR: return sizeof(SCODE); break;
case VT_BSTR: return sizeof(void*);
case VT_CY: return sizeof(CY);
case VT_ERROR: return sizeof(SCODE);
}
TRACE("Shouldn't be called for vt %s%s!\n", debugstr_VT(pv), debugstr_VF(pv));
return 0;
@ -3925,7 +3925,7 @@ HRESULT WINAPI VarNeg(LPVARIANT pVarIn, LPVARIANT pVarOut)
* Failure: An HRESULT error code indicating the error.
*
* NOTES
* - Strictly speaking, this function performs a bitwise ones compliment
* - Strictly speaking, this function performs a bitwise ones complement
* on the variants value (after possibly converting to VT_I4, see below).
* This only behaves like a boolean not operation if the value in
* pVarIn is either VARIANT_TRUE or VARIANT_FALSE and the type is signed.