diff --git a/reactos/dll/win32/oleaut32/connpt.c b/reactos/dll/win32/oleaut32/connpt.c index 656aee47bbc..d16dd16dba7 100644 --- a/reactos/dll/win32/oleaut32/connpt.c +++ b/reactos/dll/win32/oleaut32/connpt.c @@ -53,9 +53,6 @@ typedef struct ConnectionPointImpl { DWORD nSinks; } ConnectionPointImpl; -static const IConnectionPointVtbl ConnectionPointImpl_VTable; - - /************************************************************************ * Implementation of IEnumConnections */ @@ -91,26 +88,6 @@ static inline EnumConnectionsImpl *impl_from_IEnumConnections(IEnumConnections * return CONTAINING_RECORD(iface, EnumConnectionsImpl, IEnumConnections_iface); } -/************************************************************************ - * ConnectionPointImpl_Construct - */ -static ConnectionPointImpl *ConnectionPointImpl_Construct(IUnknown *pUnk, - REFIID riid) -{ - ConnectionPointImpl *Obj; - - Obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*Obj)); - Obj->IConnectionPoint_iface.lpVtbl = &ConnectionPointImpl_VTable; - Obj->Obj = pUnk; - Obj->ref = 1; - Obj->iid = *riid; - Obj->maxSinks = MAXSINKS; - Obj->sinks = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(IUnknown*) * MAXSINKS); - Obj->nSinks = 0; - return Obj; -} - /************************************************************************ * ConnectionPointImpl_Destroy */ @@ -128,7 +105,6 @@ static void ConnectionPointImpl_Destroy(ConnectionPointImpl *Obj) return; } -static ULONG WINAPI ConnectionPointImpl_AddRef(IConnectionPoint* iface); /************************************************************************ * ConnectionPointImpl_QueryInterface (IUnknown) * @@ -145,7 +121,7 @@ static HRESULT WINAPI ConnectionPointImpl_QueryInterface( /* * Perform a sanity check on the parameters. */ - if ( (This==0) || (ppvObject==0) ) + if (!ppvObject) return E_INVALIDARG; /* @@ -153,28 +129,20 @@ static HRESULT WINAPI ConnectionPointImpl_QueryInterface( */ *ppvObject = 0; - /* - * Compare the riid with the interface IDs implemented by this object. - */ - if (IsEqualIID(&IID_IUnknown, riid)) - *ppvObject = This; - else if (IsEqualIID(&IID_IConnectionPoint, riid)) - *ppvObject = This; + + if (IsEqualIID(&IID_IConnectionPoint, riid) || IsEqualIID(&IID_IUnknown, riid)) + *ppvObject = iface; /* * Check that we obtained an interface. */ if ((*ppvObject)==0) { - FIXME("() : asking for un supported interface %s\n",debugstr_guid(riid)); + FIXME("() : asking for unsupported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; } - /* - * Query Interface always increases the reference count by one when it is - * successful - */ - ConnectionPointImpl_AddRef(&This->IConnectionPoint_iface); + IUnknown_AddRef((IUnknown*)*ppvObject); return S_OK; } @@ -330,9 +298,9 @@ static HRESULT WINAPI ConnectionPointImpl_EnumConnections( /* Bump the ref count of this object up by one. It gets Released in IEnumConnections_Release */ - IUnknown_AddRef((IUnknown*)This); + IConnectionPoint_AddRef(iface); - EnumObj = EnumConnectionsImpl_Construct((IUnknown*)This, This->nSinks, pCD); + EnumObj = EnumConnectionsImpl_Construct((IUnknown*)iface, This->nSinks, pCD); hr = IEnumConnections_QueryInterface(&EnumObj->IEnumConnections_iface, &IID_IEnumConnections, (void**)ppEnum); IEnumConnections_Release(&EnumObj->IEnumConnections_iface); @@ -355,7 +323,6 @@ static const IConnectionPointVtbl ConnectionPointImpl_VTable = static const IEnumConnectionsVtbl EnumConnectionsImpl_VTable; -static ULONG WINAPI EnumConnectionsImpl_AddRef(IEnumConnections* iface); /************************************************************************ * EnumConnectionsImpl_Construct @@ -412,7 +379,7 @@ static HRESULT WINAPI EnumConnectionsImpl_QueryInterface( /* * Perform a sanity check on the parameters. */ - if ( (This==0) || (ppvObject==0) ) + if (!ppvObject) return E_INVALIDARG; /* @@ -420,28 +387,19 @@ static HRESULT WINAPI EnumConnectionsImpl_QueryInterface( */ *ppvObject = 0; - /* - * Compare the riid with the interface IDs implemented by this object. - */ - if (IsEqualIID(&IID_IUnknown, riid)) - *ppvObject = This; - else if (IsEqualIID(&IID_IEnumConnections, riid)) - *ppvObject = This; + if (IsEqualIID(&IID_IEnumConnections, riid) || IsEqualIID(&IID_IUnknown, riid)) + *ppvObject = iface; /* * Check that we obtained an interface. */ if ((*ppvObject)==0) { - FIXME("() : asking for un supported interface %s\n",debugstr_guid(riid)); + FIXME("() : asking for unsupported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; } - /* - * Query Interface always increases the reference count by one when it is - * successful - */ - EnumConnectionsImpl_AddRef((IEnumConnections*)This); + IUnknown_AddRef((IUnknown*)*ppvObject); return S_OK; } @@ -568,7 +526,7 @@ static HRESULT WINAPI EnumConnectionsImpl_Clone(IEnumConnections* iface, newObj = EnumConnectionsImpl_Construct(This->pUnk, This->nConns, This->pCD); newObj->nCur = This->nCur; - *ppEnum = (LPENUMCONNECTIONS)newObj; + *ppEnum = &newObj->IEnumConnections_iface; IUnknown_AddRef(This->pUnk); return S_OK; } @@ -602,13 +560,22 @@ HRESULT CreateConnectionPoint(IUnknown *pUnk, REFIID riid, IConnectionPoint **pCP) { ConnectionPointImpl *Obj; - HRESULT hr; - Obj = ConnectionPointImpl_Construct(pUnk, riid); - if(!Obj) return E_OUTOFMEMORY; + TRACE("(%p %s %p)\n", pUnk, debugstr_guid(riid), pCP); - hr = IConnectionPoint_QueryInterface(&Obj->IConnectionPoint_iface, - &IID_IConnectionPoint, (void**)pCP); - IConnectionPoint_Release(&Obj->IConnectionPoint_iface); - return hr; + *pCP = NULL; + Obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*Obj)); + if (!Obj) + return E_OUTOFMEMORY; + + Obj->IConnectionPoint_iface.lpVtbl = &ConnectionPointImpl_VTable; + Obj->Obj = pUnk; + Obj->ref = 1; + Obj->iid = *riid; + Obj->maxSinks = MAXSINKS; + Obj->sinks = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IUnknown*) * MAXSINKS); + Obj->nSinks = 0; + + *pCP = &Obj->IConnectionPoint_iface; + return S_OK; } diff --git a/reactos/dll/win32/oleaut32/olepropframe.c b/reactos/dll/win32/oleaut32/olepropframe.c index af5e2bed35d..5cb83e40ecb 100644 --- a/reactos/dll/win32/oleaut32/olepropframe.c +++ b/reactos/dll/win32/oleaut32/olepropframe.c @@ -201,6 +201,7 @@ HRESULT WINAPI OleCreatePropertyFrameIndirect(LPOCPFIPARAMS lpParams) if(property_sheet_dialog_data) { if(property_sheet_dialog_data[1] == 0xffff) { ERR("Expected DLGTEMPLATE structure\n"); + FreeLibrary(hcomctl); return E_OUTOFMEMORY; } diff --git a/reactos/dll/win32/oleaut32/recinfo.c b/reactos/dll/win32/oleaut32/recinfo.c index 607cf6f5d85..46fa3d1e384 100644 --- a/reactos/dll/win32/oleaut32/recinfo.c +++ b/reactos/dll/win32/oleaut32/recinfo.c @@ -503,12 +503,7 @@ static BOOL WINAPI IRecordInfoImpl_IsMatchingType(IRecordInfo *iface, IRecordInf TRACE( "(%p)->(%p)\n", This, info2 ); IRecordInfo_GetGuid( info2, &guid2 ); - if (IsEqualGUID( &This->guid, &guid2 )) return TRUE; - - FIXME( "records have different guids (%s %s) but could still match\n", - debugstr_guid( &This->guid ), debugstr_guid( &guid2 ) ); - - return FALSE; + return IsEqualGUID( &This->guid, &guid2 ); } static PVOID WINAPI IRecordInfoImpl_RecordCreate(IRecordInfo *iface) @@ -642,7 +637,12 @@ HRESULT WINAPI GetRecordInfoFromTypeInfo(ITypeInfo* pTI, IRecordInfo** ppRecInfo WARN("GetRefTypeInfo failed: %08x\n", hres); return hres; } - ITypeInfo_GetTypeAttr(pTypeInfo, &typeattr); + hres = ITypeInfo_GetTypeAttr(pTypeInfo, &typeattr); + if(FAILED(hres)) { + ITypeInfo_Release(pTypeInfo); + WARN("GetTypeAttr failed for referenced type: %08x\n", hres); + return hres; + } }else { pTypeInfo = pTI; ITypeInfo_AddRef(pTypeInfo); diff --git a/reactos/dll/win32/oleaut32/tmarshal.c b/reactos/dll/win32/oleaut32/tmarshal.c index 13c3dfc8319..4e08b213cb5 100644 --- a/reactos/dll/win32/oleaut32/tmarshal.c +++ b/reactos/dll/win32/oleaut32/tmarshal.c @@ -242,18 +242,71 @@ PSFacBuf_QueryInterface(LPPSFACTORYBUFFER iface, REFIID iid, LPVOID *ppv) { static ULONG WINAPI PSFacBuf_AddRef(LPPSFACTORYBUFFER iface) { return 2; } static ULONG WINAPI PSFacBuf_Release(LPPSFACTORYBUFFER iface) { return 1; } -static HRESULT -_get_typeinfo_for_iid(REFIID riid, ITypeInfo**ti) { - HRESULT hres; +struct ifacepsredirect_data +{ + ULONG size; + DWORD mask; + GUID iid; + ULONG nummethods; + GUID tlbid; + GUID base; + ULONG name_len; + ULONG name_offset; +}; + +struct tlibredirect_data +{ + ULONG size; + DWORD res; + ULONG name_len; + ULONG name_offset; + LANGID langid; + WORD flags; + ULONG help_len; + ULONG help_offset; + WORD major_version; + WORD minor_version; +}; + +static BOOL actctx_get_typelib_module(REFIID riid, WCHAR *module, DWORD len) +{ + struct ifacepsredirect_data *iface; + struct tlibredirect_data *tlib; + ACTCTX_SECTION_KEYED_DATA data; + WCHAR *ptrW; + + data.cbSize = sizeof(data); + if (!FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION, + riid, &data)) + return FALSE; + + iface = (struct ifacepsredirect_data*)data.lpData; + if (!FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION, + &iface->tlbid, &data)) + return FALSE; + + tlib = (struct tlibredirect_data*)data.lpData; + ptrW = (WCHAR*)((BYTE*)data.lpSectionBase + tlib->name_offset); + + if (tlib->name_len/sizeof(WCHAR) >= len) { + ERR("need larger module buffer, %u\n", tlib->name_len); + return FALSE; + } + + memcpy(module, ptrW, tlib->name_len); + module[tlib->name_len/sizeof(WCHAR)] = 0; + return TRUE; +} + +static HRESULT reg_get_typelib_module(REFIID riid, WCHAR *module, DWORD len) +{ HKEY ikey; REGSAM opposite = (sizeof(void*) == 8) ? KEY_WOW64_32KEY : KEY_WOW64_64KEY; BOOL is_wow64; char tlguid[200],typelibkey[300],interfacekey[300],ver[100]; char tlfn[260]; - OLECHAR tlfnW[260]; DWORD tlguidlen, verlen, type; LONG tlfnlen, err; - ITypeLib *tl; sprintf( interfacekey, "Interface\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\Typelib", riid->Data1, riid->Data2, riid->Data3, @@ -297,19 +350,37 @@ _get_typeinfo_for_iid(REFIID riid, ITypeInfo**ti) { } #endif } - MultiByteToWideChar(CP_ACP, 0, tlfn, -1, tlfnW, sizeof(tlfnW) / sizeof(tlfnW[0])); - hres = LoadTypeLib(tlfnW,&tl); - if (hres) { + MultiByteToWideChar(CP_ACP, 0, tlfn, -1, module, len); + return S_OK; +} + +static HRESULT +_get_typeinfo_for_iid(REFIID riid, ITypeInfo **typeinfo) +{ + OLECHAR moduleW[260]; + ITypeLib *typelib; + HRESULT hres; + + *typeinfo = NULL; + + moduleW[0] = 0; + if (!actctx_get_typelib_module(riid, moduleW, sizeof(moduleW)/sizeof(moduleW[0]))) { + hres = reg_get_typelib_module(riid, moduleW, sizeof(moduleW)/sizeof(moduleW[0])); + if (FAILED(hres)) + return hres; + } + + hres = LoadTypeLib(moduleW, &typelib); + if (hres != S_OK) { ERR("Failed to load typelib for %s, but it should be there.\n",debugstr_guid(riid)); return hres; } - hres = ITypeLib_GetTypeInfoOfGuid(tl,riid,ti); - if (hres) { - ERR("typelib does not contain info for %s?\n",debugstr_guid(riid)); - ITypeLib_Release(tl); - return hres; - } - ITypeLib_Release(tl); + + hres = ITypeLib_GetTypeInfoOfGuid(typelib, riid, typeinfo); + ITypeLib_Release(typelib); + if (hres != S_OK) + ERR("typelib does not contain info for %s\n", debugstr_guid(riid)); + return hres; } @@ -1714,9 +1785,7 @@ static HRESULT init_proxy_entry_point(TMProxyImpl *proxy, unsigned int num) /* nrofargs including This */ int nrofargs = 1; ITypeInfo *tinfo2; -#ifdef __i386__ TMAsmProxy *xasm = proxy->asmstubs + num; -#endif HRESULT hres; const FUNCDESC *fdesc; diff --git a/reactos/dll/win32/oleaut32/typelib.c b/reactos/dll/win32/oleaut32/typelib.c index 9cc8e1fc3ea..79aa8b3268e 100644 --- a/reactos/dll/win32/oleaut32/typelib.c +++ b/reactos/dll/win32/oleaut32/typelib.c @@ -3393,18 +3393,27 @@ static HRESULT TLB_ReadTypeLib(LPCWSTR pszFileName, LPWSTR pszPath, UINT cchPath h = CreateFileW(pszPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(h != INVALID_HANDLE_VALUE){ - FILE_NAME_INFORMATION *info; - char data[MAX_PATH * sizeof(WCHAR) + sizeof(info->FileNameLength)]; + FILE_NAME_INFORMATION size_info; BOOL br; - info = (FILE_NAME_INFORMATION*)data; /* GetFileInformationByHandleEx returns the path of the file without * WOW64 redirection */ - br = GetFileInformationByHandleEx(h, FileNameInfo, data, sizeof(data)); - if(br){ - info->FileName[info->FileNameLength / sizeof(WCHAR)] = 0; - lstrcpynW(pszPath + 2, info->FileName, cchPath - 2); + br = GetFileInformationByHandleEx(h, FileNameInfo, &size_info, sizeof(size_info)); + if(br || GetLastError() == ERROR_MORE_DATA){ + FILE_NAME_INFORMATION *info; + DWORD size = sizeof(*info) + size_info.FileNameLength + sizeof(WCHAR); + + info = HeapAlloc(GetProcessHeap(), 0, size); + + br = GetFileInformationByHandleEx(h, FileNameInfo, info, size); + if(br){ + info->FileName[info->FileNameLength / sizeof(WCHAR)] = 0; + lstrcpynW(pszPath + 2, info->FileName, cchPath - 2); + } + + HeapFree(GetProcessHeap(), 0, info); } + CloseHandle(h); } @@ -6487,10 +6496,10 @@ __ASM_GLOBAL_FUNC( call_method, "movq 8(%rsp),%rdx\n\t" "movq 16(%rsp),%r8\n\t" "movq 24(%rsp),%r9\n\t" - "movq %rcx,%xmm0\n\t" - "movq %rdx,%xmm1\n\t" - "movq %r8,%xmm2\n\t" - "movq %r9,%xmm3\n\t" + "movq 0(%rsp),%xmm0\n\t" + "movq 8(%rsp),%xmm1\n\t" + "movq 16(%rsp),%xmm2\n\t" + "movq 24(%rsp),%xmm3\n\t" "callq *%rax\n\t" "leaq -16(%rbp),%rsp\n\t" "popq %rdi\n\t" diff --git a/reactos/dll/win32/oleaut32/usrmarshal.c b/reactos/dll/win32/oleaut32/usrmarshal.c index 48c9625120c..0bf2e3b08a3 100644 --- a/reactos/dll/win32/oleaut32/usrmarshal.c +++ b/reactos/dll/win32/oleaut32/usrmarshal.c @@ -28,6 +28,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); #define ALIGN_LENGTH(_Len, _Align) _Len = ALIGNED_LENGTH(_Len, _Align) #define ALIGN_POINTER(_Ptr, _Align) _Ptr = ALIGNED_POINTER(_Ptr, _Align) +/* ole32 exports those, not defined in public headers */ +ULONG __RPC_USER WdtpInterfacePointer_UserSize(ULONG*, ULONG, ULONG, IUnknown*, REFIID); +unsigned char * __RPC_USER WdtpInterfacePointer_UserMarshal(ULONG*, ULONG, unsigned char*, IUnknown*, REFIID); +unsigned char * __RPC_USER WdtpInterfacePointer_UserUnmarshal(ULONG*, unsigned char*, IUnknown**, REFIID); + static void dump_user_flags(const ULONG *pFlags) { if (HIWORD(*pFlags) == NDR_LOCAL_DATA_REPRESENTATION) @@ -239,21 +244,21 @@ static unsigned int get_type_alignment(ULONG *pFlags, VARTYPE vt) return 7; } -static unsigned interface_variant_size(const ULONG *pFlags, REFIID riid, IUnknown *punk) +/* WdtpInterfacePointer_UserSize takes care of 2 additional DWORDs to store marshalling buffer size */ +static unsigned interface_variant_size(ULONG *pFlags, REFIID riid, IUnknown *punk) { ULONG size = 0; - HRESULT hr; if (punk) { - hr = CoGetMarshalSizeMax(&size, riid, punk, LOWORD(*pFlags), NULL, MSHLFLAGS_NORMAL); - if (FAILED(hr)) + size = WdtpInterfacePointer_UserSize(pFlags, LOWORD(*pFlags), 0, punk, riid); + if (!size) { - ERR("interface variant buffer size calculation failed, HRESULT=0x%x\n", hr); + ERR("interface variant buffer size calculation failed\n"); return 0; } } - size += sizeof(ULONG); /* we have to store the buffersize in the stream */ + size += sizeof(ULONG); TRACE("wire-size extra of interface variant is %d\n", size); return size; } @@ -295,116 +300,48 @@ static ULONG wire_extra_user_size(ULONG *pFlags, ULONG Start, VARIANT *pvar) } } -/* helper: called for VT_DISPATCH variants to marshal the IDispatch* into the buffer. returns Buffer on failure, new position otherwise */ -static unsigned char* interface_variant_marshal(const ULONG *pFlags, unsigned char *Buffer, +/* helper: called for VT_DISPATCH variants to marshal the IDispatch* into the buffer */ +static unsigned char* interface_variant_marshal(ULONG *pFlags, unsigned char *Buffer, REFIID riid, IUnknown *punk) { - IStream *working; - HGLOBAL working_mem; - void *working_memlocked; - unsigned char *oldpos; - ULONG size; - HRESULT hr; - TRACE("pFlags=%d, Buffer=%p, pUnk=%p\n", *pFlags, Buffer, punk); + /* first DWORD is used to store pointer itself, truncated on win64 */ if(!punk) { memset(Buffer, 0, sizeof(ULONG)); return Buffer + sizeof(ULONG); } - - oldpos = Buffer; - - /* CoMarshalInterface needs a stream, whereas at this level we are operating in terms of buffers. - * We create a stream on an HGLOBAL, so we can simply do a memcpy to move it to the buffer. - * in rpcrt4/ndr_ole.c, a simple IStream implementation is wrapped around the buffer object, - * but that would be overkill here, hence this implementation. We save the size because the unmarshal - * code has no way to know how long the marshalled buffer is. */ - - size = interface_variant_size(pFlags, riid, punk); - - working_mem = GlobalAlloc(0, size); - if (!working_mem) return oldpos; - - hr = CreateStreamOnHGlobal(working_mem, TRUE, &working); - if (hr != S_OK) { - GlobalFree(working_mem); - return oldpos; - } - - hr = CoMarshalInterface(working, riid, punk, LOWORD(*pFlags), NULL, MSHLFLAGS_NORMAL); - if (hr != S_OK) { - IStream_Release(working); /* this also releases the hglobal */ - return oldpos; + else + { + *(DWORD*)Buffer = (DWORD_PTR)punk; + Buffer += sizeof(DWORD); } - working_memlocked = GlobalLock(working_mem); - memcpy(Buffer, &size, sizeof(ULONG)); /* copy the buffersize */ - memcpy(Buffer + sizeof(ULONG), working_memlocked, size - sizeof(ULONG)); - GlobalUnlock(working_mem); - - IStream_Release(working); - - /* size includes the ULONG for the size written above */ - TRACE("done, size=%d\n", size); - return Buffer + size; + return WdtpInterfacePointer_UserMarshal(pFlags, LOWORD(*pFlags), Buffer, punk, riid); } -/* helper: called for VT_DISPATCH / VT_UNKNOWN variants to unmarshal the buffer. returns Buffer on failure, new position otherwise */ -static unsigned char *interface_variant_unmarshal(const ULONG *pFlags, unsigned char *Buffer, +/* helper: called for VT_DISPATCH / VT_UNKNOWN variants to unmarshal the buffer */ +static unsigned char *interface_variant_unmarshal(ULONG *pFlags, unsigned char *Buffer, REFIID riid, IUnknown **ppunk) { - IStream *working; - HGLOBAL working_mem; - void *working_memlocked; - unsigned char *oldpos; - ULONG size; - HRESULT hr; + DWORD ptr; TRACE("pFlags=%d, Buffer=%p, ppUnk=%p\n", *pFlags, Buffer, ppunk); - oldpos = Buffer; + /* skip pointer part itself */ + ptr = *(DWORD*)Buffer; + Buffer += sizeof(DWORD); - /* get the buffersize */ - memcpy(&size, Buffer, sizeof(ULONG)); - TRACE("buffersize=%d\n", size); - - if(!size) + if(!ptr) { *ppunk = NULL; - return Buffer + sizeof(ULONG); + return Buffer; } - working_mem = GlobalAlloc(0, size); - if (!working_mem) return oldpos; - - hr = CreateStreamOnHGlobal(working_mem, TRUE, &working); - if (hr != S_OK) { - GlobalFree(working_mem); - return oldpos; - } - - working_memlocked = GlobalLock(working_mem); - - /* now we copy the contents of the marshalling buffer to working_memlocked, unlock it, and demarshal the stream */ - memcpy(working_memlocked, Buffer + sizeof(ULONG), size); - GlobalUnlock(working_mem); - - hr = CoUnmarshalInterface(working, riid, (void**)ppunk); - if (hr != S_OK) { - IStream_Release(working); - return oldpos; - } - - IStream_Release(working); /* this also frees the underlying hglobal */ - - /* size includes the ULONG for the size written above */ - TRACE("done, processed=%d bytes\n", size); - return Buffer + size; + return WdtpInterfacePointer_UserUnmarshal(pFlags, Buffer, ppunk, riid); } - ULONG WINAPI VARIANT_UserSize(ULONG *pFlags, ULONG Start, VARIANT *pvar) { int align; @@ -502,19 +439,15 @@ unsigned char * WINAPI VARIANT_UserMarshal(ULONG *pFlags, unsigned char *Buffer, Pos = VARIANT_UserMarshal(pFlags, Pos, V_VARIANTREF(pvar)); break; case VT_UNKNOWN: - /* this should probably call WdtpInterfacePointer_UserMarshal in ole32.dll */ Pos = interface_variant_marshal(pFlags, Pos, &IID_IUnknown, V_UNKNOWN(pvar)); break; case VT_UNKNOWN | VT_BYREF: - /* this should probably call WdtpInterfacePointer_UserMarshal in ole32.dll */ Pos = interface_variant_marshal(pFlags, Pos, &IID_IUnknown, *V_UNKNOWNREF(pvar)); break; case VT_DISPATCH: - /* this should probably call WdtpInterfacePointer_UserMarshal in ole32.dll */ Pos = interface_variant_marshal(pFlags, Pos, &IID_IDispatch, (IUnknown*)V_DISPATCH(pvar)); break; case VT_DISPATCH | VT_BYREF: - /* this should probably call WdtpInterfacePointer_UserMarshal in ole32.dll */ Pos = interface_variant_marshal(pFlags, Pos, &IID_IDispatch, (IUnknown*)*V_DISPATCHREF(pvar)); break; case VT_RECORD: @@ -617,19 +550,15 @@ unsigned char * WINAPI VARIANT_UserUnmarshal(ULONG *pFlags, unsigned char *Buffe Pos = VARIANT_UserUnmarshal(pFlags, Pos, V_VARIANTREF(pvar)); break; case VT_UNKNOWN: - /* this should probably call WdtpInterfacePointer_UserUnmarshal in ole32.dll */ Pos = interface_variant_unmarshal(pFlags, Pos, &IID_IUnknown, &V_UNKNOWN(pvar)); break; case VT_UNKNOWN | VT_BYREF: - /* this should probably call WdtpInterfacePointer_UserUnmarshal in ole32.dll */ Pos = interface_variant_unmarshal(pFlags, Pos, &IID_IUnknown, V_UNKNOWNREF(pvar)); break; case VT_DISPATCH: - /* this should probably call WdtpInterfacePointer_UserUnmarshal in ole32.dll */ Pos = interface_variant_unmarshal(pFlags, Pos, &IID_IDispatch, (IUnknown**)&V_DISPATCH(pvar)); break; case VT_DISPATCH | VT_BYREF: - /* this should probably call WdtpInterfacePointer_UserUnmarshal in ole32.dll */ Pos = interface_variant_unmarshal(pFlags, Pos, &IID_IDispatch, (IUnknown**)V_DISPATCHREF(pvar)); break; case VT_RECORD: @@ -2256,8 +2185,14 @@ HRESULT CALLBACK IEnumConnections_Next_Proxy( LPCONNECTDATA rgcd, ULONG *pcFetched) { - FIXME("not implemented\n"); - return E_NOTIMPL; + ULONG fetched; + + TRACE("(%u, %p %p)\n", cConnections, rgcd, pcFetched); + + if (!pcFetched) + pcFetched = &fetched; + + return IEnumConnections_RemoteNext_Proxy(This, cConnections, rgcd, pcFetched); } HRESULT __RPC_STUB IEnumConnections_Next_Stub( @@ -2266,28 +2201,50 @@ HRESULT __RPC_STUB IEnumConnections_Next_Stub( LPCONNECTDATA rgcd, ULONG *pcFetched) { - FIXME("not implemented\n"); - return E_NOTIMPL; + HRESULT hr; + + TRACE("(%u, %p, %p)\n", cConnections, rgcd, pcFetched); + + *pcFetched = 0; + hr = IEnumConnections_Next(This, cConnections, rgcd, pcFetched); + if (hr == S_OK) + *pcFetched = cConnections; + + return hr; } HRESULT CALLBACK IEnumConnectionPoints_Next_Proxy( IEnumConnectionPoints* This, ULONG cConnections, - LPCONNECTIONPOINT *ppCP, + IConnectionPoint **ppCP, ULONG *pcFetched) { - FIXME("not implemented\n"); - return E_NOTIMPL; + ULONG fetched; + + TRACE("(%u, %p %p)\n", cConnections, ppCP, pcFetched); + + if (!pcFetched) + pcFetched = &fetched; + + return IEnumConnectionPoints_RemoteNext_Proxy(This, cConnections, ppCP, pcFetched); } HRESULT __RPC_STUB IEnumConnectionPoints_Next_Stub( IEnumConnectionPoints* This, ULONG cConnections, - LPCONNECTIONPOINT *ppCP, + IConnectionPoint **ppCP, ULONG *pcFetched) { - FIXME("not implemented\n"); - return E_NOTIMPL; + HRESULT hr; + + TRACE("(%u, %p, %p)\n", cConnections, ppCP, pcFetched); + + *pcFetched = 0; + hr = IEnumConnectionPoints_Next(This, cConnections, ppCP, pcFetched); + if (hr == S_OK) + *pcFetched = cConnections; + + return hr; } HRESULT CALLBACK IPersistMemory_Load_Proxy( @@ -2295,8 +2252,12 @@ HRESULT CALLBACK IPersistMemory_Load_Proxy( LPVOID pMem, ULONG cbSize) { - FIXME("not implemented\n"); - return E_NOTIMPL; + TRACE("(%p, %u)\n", pMem, cbSize); + + if (!pMem) + return E_POINTER; + + return IPersistMemory_RemoteLoad_Proxy(This, pMem, cbSize); } HRESULT __RPC_STUB IPersistMemory_Load_Stub( @@ -2304,8 +2265,8 @@ HRESULT __RPC_STUB IPersistMemory_Load_Stub( BYTE *pMem, ULONG cbSize) { - FIXME("not implemented\n"); - return E_NOTIMPL; + TRACE("(%p, %u)\n", pMem, cbSize); + return IPersistMemory_Load(This, pMem, cbSize); } HRESULT CALLBACK IPersistMemory_Save_Proxy( @@ -2314,8 +2275,12 @@ HRESULT CALLBACK IPersistMemory_Save_Proxy( BOOL fClearDirty, ULONG cbSize) { - FIXME("not implemented\n"); - return E_NOTIMPL; + TRACE("(%p, %d, %u)\n", pMem, fClearDirty, cbSize); + + if (!pMem) + return E_POINTER; + + return IPersistMemory_RemoteSave_Proxy(This, pMem, fClearDirty, cbSize); } HRESULT __RPC_STUB IPersistMemory_Save_Stub( @@ -2324,23 +2289,25 @@ HRESULT __RPC_STUB IPersistMemory_Save_Stub( BOOL fClearDirty, ULONG cbSize) { - FIXME("not implemented\n"); - return E_NOTIMPL; + TRACE("(%p, %d, %u)\n", pMem, fClearDirty, cbSize); + return IPersistMemory_Save(This, pMem, fClearDirty, cbSize); } void CALLBACK IAdviseSinkEx_OnViewStatusChange_Proxy( IAdviseSinkEx* This, DWORD dwViewStatus) { - FIXME("not implemented\n"); + TRACE("(%p, 0x%08x)\n", This, dwViewStatus); + IAdviseSinkEx_RemoteOnViewStatusChange_Proxy(This, dwViewStatus); } HRESULT __RPC_STUB IAdviseSinkEx_OnViewStatusChange_Stub( IAdviseSinkEx* This, DWORD dwViewStatus) { - FIXME("not implemented\n"); - return E_NOTIMPL; + TRACE("(%p, 0x%08x)\n", This, dwViewStatus); + IAdviseSinkEx_OnViewStatusChange(This, dwViewStatus); + return S_OK; } HRESULT CALLBACK IEnumOleUndoUnits_Next_Proxy( @@ -2349,8 +2316,14 @@ HRESULT CALLBACK IEnumOleUndoUnits_Next_Proxy( IOleUndoUnit **rgElt, ULONG *pcEltFetched) { - FIXME("not implemented\n"); - return E_NOTIMPL; + ULONG fetched; + + TRACE("(%u, %p %p)\n", cElt, rgElt, pcEltFetched); + + if (!pcEltFetched) + pcEltFetched = &fetched; + + return IEnumOleUndoUnits_RemoteNext_Proxy(This, cElt, rgElt, pcEltFetched); } HRESULT __RPC_STUB IEnumOleUndoUnits_Next_Stub( @@ -2359,8 +2332,16 @@ HRESULT __RPC_STUB IEnumOleUndoUnits_Next_Stub( IOleUndoUnit **rgElt, ULONG *pcEltFetched) { - FIXME("not implemented\n"); - return E_NOTIMPL; + HRESULT hr; + + TRACE("(%u, %p, %p)\n", cElt, rgElt, pcEltFetched); + + *pcEltFetched = 0; + hr = IEnumOleUndoUnits_Next(This, cElt, rgElt, pcEltFetched); + if (hr == S_OK) + *pcEltFetched = cElt; + + return hr; } HRESULT CALLBACK IQuickActivate_QuickActivate_Proxy( diff --git a/reactos/dll/win32/oleaut32/varformat.c b/reactos/dll/win32/oleaut32/varformat.c index 2a04e090abc..a2f11c80286 100644 --- a/reactos/dll/win32/oleaut32/varformat.c +++ b/reactos/dll/win32/oleaut32/varformat.c @@ -270,8 +270,6 @@ typedef struct tagFMT_DATE_HEADER #define FMT_NUM_ON_OFF 0x3F /* Convert to "On" or "Off" */ #define FMT_STR_COPY_SPACE 0x40 /* Copy len chars with space if no char */ #define FMT_STR_COPY_SKIP 0x41 /* Copy len chars or skip if no char */ -/* Wine additions */ -#define FMT_WINE_HOURS_12 0x81 /* Hours using 12 hour clock */ /* Named Formats and their tokenised values */ static const WCHAR szGeneralDate[] = { 'G','e','n','e','r','a','l',' ','D','a','t','e','\0' }; diff --git a/reactos/dll/win32/oleaut32/variant.c b/reactos/dll/win32/oleaut32/variant.c index 943b08df3e2..8a03dc31e35 100644 --- a/reactos/dll/win32/oleaut32/variant.c +++ b/reactos/dll/win32/oleaut32/variant.c @@ -3931,9 +3931,6 @@ HRESULT WINAPI VarSub(LPVARIANT left, LPVARIANT right, LPVARIANT result) case VT_I2: V_I2(result) = V_I2(&lv) - V_I2(&rv); break; - case VT_I1: - V_I1(result) = V_I1(&lv) - V_I1(&rv); - break; case VT_UI1: V_UI1(result) = V_UI2(&lv) - V_UI1(&rv); break; diff --git a/reactos/dll/win32/oleaut32/variant.h b/reactos/dll/win32/oleaut32/variant.h index 79239f861f7..20d1924c11f 100644 --- a/reactos/dll/win32/oleaut32/variant.h +++ b/reactos/dll/win32/oleaut32/variant.h @@ -112,7 +112,7 @@ typedef struct tagVARIANT_NUMBER_CHARS WCHAR cCurrencyDigitSeparator; } VARIANT_NUMBER_CHARS; -unsigned int get_type_size(ULONG*, VARTYPE); +unsigned int get_type_size(ULONG*, VARTYPE) DECLSPEC_HIDDEN; BOOL VARIANT_GetLocalisedText(LANGID, DWORD, WCHAR *) DECLSPEC_HIDDEN; HRESULT VARIANT_ClearInd(VARIANTARG *) DECLSPEC_HIDDEN; BOOL get_date_format(LCID, DWORD, const SYSTEMTIME *, diff --git a/reactos/dll/win32/oleaut32/vartype.c b/reactos/dll/win32/oleaut32/vartype.c index 5a8f0d1d4b6..7ef25e2add0 100644 --- a/reactos/dll/win32/oleaut32/vartype.c +++ b/reactos/dll/win32/oleaut32/vartype.c @@ -4138,8 +4138,6 @@ HRESULT WINAPI VarDecFromI4(LONG lIn, DECIMAL* pDecOut) return S_OK; } -#define LOCALE_EN_US (MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT)) - /* internal representation of the value stored in a DECIMAL. The bytes are stored from LSB at index 0 to MSB at index 11 */ diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index d95cecd1a87..a7988b84d83 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -147,7 +147,7 @@ reactos/dll/win32/odbc32 # Synced to WineStaging-1.7.37. Depends on reactos/dll/win32/odbccp32 # Synced to WineStaging-1.7.47 reactos/dll/win32/ole32 # Synced to WineStaging-1.7.47 reactos/dll/win32/oleacc # Synced to WineStaging-1.7.47 -reactos/dll/win32/oleaut32 # Synced to WineStaging-1.7.37 +reactos/dll/win32/oleaut32 # Synced to WineStaging-1.7.47 reactos/dll/win32/olecli32 # Synced to WineStaging-1.7.37 reactos/dll/win32/oledlg # Synced to WineStaging-1.7.37 reactos/dll/win32/olepro32 # Synced to WineStaging-1.7.37