- Sync ole32 and oleaut32 with Wine 1.1.20

svn path=/trunk/; revision=40795
This commit is contained in:
Dmitry Chapyshev 2009-05-05 15:31:02 +00:00
parent 64d2ce31a9
commit 57e86f2709
22 changed files with 1850 additions and 1625 deletions

File diff suppressed because it is too large Load diff

View file

@ -2922,7 +2922,10 @@ HRESULT WINAPI CoGetTreatAsClass(REFCLSID clsidOld, LPCLSID clsidNew)
res = COM_OpenKeyForCLSID(clsidOld, wszTreatAs, KEY_READ, &hkey);
if (FAILED(res))
{
res = S_FALSE;
goto done;
}
if (RegQueryValueW(hkey, NULL, szClsidNew, &len))
{
res = S_FALSE;

View file

@ -319,4 +319,16 @@ extern HRESULT WINAPI OLE32_DllUnregisterServer(void) DECLSPEC_HIDDEN;
HRESULT DataAdviseHolder_OnConnect(IDataAdviseHolder *iface, IDataObject *pDelegate);
void DataAdviseHolder_OnDisconnect(IDataAdviseHolder *iface);
extern UINT ownerlink_clipboard_format;
extern UINT filename_clipboard_format;
extern UINT filenameW_clipboard_format;
extern UINT dataobject_clipboard_format;
extern UINT embedded_object_clipboard_format;
extern UINT embed_source_clipboard_format;
extern UINT custom_link_source_clipboard_format;
extern UINT link_source_clipboard_format;
extern UINT object_descriptor_clipboard_format;
extern UINT link_source_descriptor_clipboard_format;
extern UINT ole_private_data_clipboard_format;
#endif /* __WINE_OLE_COMPOBJ_H */

View file

@ -431,7 +431,7 @@ static HRESULT WINAPI Proxy_MarshalInterface(
if (SUCCEEDED(hr))
{
TRACE("writing stdobjref:\n\tflags = %04lx\n\tcPublicRefs = %ld\n\toxid = %s\n\toid = %s\n\tipid = %s\n",
TRACE("writing stdobjref:\n\tflags = %04x\n\tcPublicRefs = %d\n\toxid = %s\n\toid = %s\n\tipid = %s\n",
stdobjref.flags, stdobjref.cPublicRefs,
wine_dbgstr_longlong(stdobjref.oxid),
wine_dbgstr_longlong(stdobjref.oid),
@ -925,7 +925,7 @@ static HRESULT proxy_manager_create_ifproxy(
LeaveCriticalSection(&This->cs);
*iif_out = ifproxy;
TRACE("ifproxy %p created for IPID %s, interface %s with %lu public refs\n",
TRACE("ifproxy %p created for IPID %s, interface %s with %u public refs\n",
ifproxy, debugstr_guid(&stdobjref->ipid), debugstr_guid(riid), stdobjref->cPublicRefs);
}
else
@ -1239,7 +1239,7 @@ static HRESULT unmarshal_object(const STDOBJREF *stdobjref, APARTMENT *apt,
assert(apt);
TRACE("stdobjref:\n\tflags = %04lx\n\tcPublicRefs = %ld\n\toxid = %s\n\toid = %s\n\tipid = %s\n",
TRACE("stdobjref:\n\tflags = %04x\n\tcPublicRefs = %d\n\toxid = %s\n\toid = %s\n\tipid = %s\n",
stdobjref->flags, stdobjref->cPublicRefs,
wine_dbgstr_longlong(stdobjref->oxid),
wine_dbgstr_longlong(stdobjref->oid),
@ -1546,7 +1546,7 @@ static HRESULT get_unmarshaler_from_stream(IStream *stream, IMarshal **marshal,
/* sanity check on header */
if (objref.signature != OBJREF_SIGNATURE)
{
ERR("Bad OBJREF signature 0x%08lx\n", objref.signature);
ERR("Bad OBJREF signature 0x%08x\n", objref.signature);
return RPC_E_INVALID_OBJREF;
}
@ -1578,7 +1578,7 @@ static HRESULT get_unmarshaler_from_stream(IStream *stream, IMarshal **marshal,
}
else
{
FIXME("Invalid or unimplemented marshaling type specified: %lx\n",
FIXME("Invalid or unimplemented marshaling type specified: %x\n",
objref.flags);
return RPC_E_INVALID_OBJREF;
}

View file

@ -340,7 +340,7 @@ RunningObjectTableImpl_AddRef(IRunningObjectTable* iface)
}
/***********************************************************************
* RunningObjectTable_Initialize
* RunningObjectTable_Destroy
*/
static HRESULT
RunningObjectTableImpl_Destroy(void)
@ -414,7 +414,7 @@ RunningObjectTableImpl_Release(IRunningObjectTable* iface)
* grfFlags [in] Registration options
* punkObject [in] the object being registered
* pmkObjectName [in] the moniker of the object being registered
* pdwRegister [in] the value identifying the registration
* pdwRegister [out] the value identifying the registration
*/
static HRESULT WINAPI
RunningObjectTableImpl_Register(IRunningObjectTable* iface, DWORD grfFlags,

View file

@ -32,6 +32,7 @@
#include "wine/debug.h"
#include "ole2.h"
#include "olestd.h"
#include "compobj_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(ole);
@ -40,7 +41,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole);
/******************************************************************************
* OleQueryCreateFromData [OLE32.@]
*
* Author : Abey George
* Checks whether an object can become an embedded object.
* the clipboard or OLE drag and drop.
* Returns : S_OK - Format that supports Embedded object creation are present.
@ -48,41 +48,58 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole);
* S_FALSE - No acceptable format is available.
*/
HRESULT WINAPI OleQueryCreateFromData(LPDATAOBJECT pSrcDataObject)
HRESULT WINAPI OleQueryCreateFromData(IDataObject *data)
{
IEnumFORMATETC *pfmt;
FORMATETC fmt;
CHAR szFmtName[MAX_CLIPFORMAT_NAME];
BOOL bFoundStatic = FALSE;
IEnumFORMATETC *enum_fmt;
FORMATETC fmt;
BOOL found_static = FALSE;
HRESULT hr;
HRESULT hr = IDataObject_EnumFormatEtc(pSrcDataObject, DATADIR_GET, &pfmt);
hr = IDataObject_EnumFormatEtc(data, DATADIR_GET, &enum_fmt);
if (hr == S_OK)
hr = IEnumFORMATETC_Next(pfmt, 1, &fmt, NULL);
if(FAILED(hr)) return hr;
while (hr == S_OK)
{
GetClipboardFormatNameA(fmt.cfFormat, szFmtName, MAX_CLIPFORMAT_NAME-1);
do
{
hr = IEnumFORMATETC_Next(enum_fmt, 1, &fmt, NULL);
if(hr == S_OK)
{
if(fmt.cfFormat == embedded_object_clipboard_format ||
fmt.cfFormat == embed_source_clipboard_format ||
fmt.cfFormat == filename_clipboard_format)
{
IEnumFORMATETC_Release(enum_fmt);
return S_OK;
}
/* first, Check for Embedded Object, Embed Source or Filename */
if(fmt.cfFormat == CF_METAFILEPICT ||
fmt.cfFormat == CF_BITMAP ||
fmt.cfFormat == CF_DIB)
found_static = TRUE;
}
} while (hr == S_OK);
if (!strcmp(szFmtName, CF_EMBEDDEDOBJECT) || !strcmp(szFmtName, CF_EMBEDSOURCE) || !strcmp(szFmtName, CF_FILENAME))
return S_OK;
IEnumFORMATETC_Release(enum_fmt);
/* Check for Metafile, Bitmap or DIB */
return found_static ? OLE_S_STATIC : S_FALSE;
}
if (fmt.cfFormat == CF_METAFILEPICT || fmt.cfFormat == CF_BITMAP || fmt.cfFormat == CF_DIB)
bFoundStatic = TRUE;
/******************************************************************************
* OleCreateFromDataEx [OLE32.@]
*
* Creates an embedded object from data transfer object retrieved from
* the clipboard or OLE drag and drop.
*/
HRESULT WINAPI OleCreateFromDataEx(IDataObject *data, REFIID iid, DWORD flags,
DWORD renderopt, ULONG num_fmts, DWORD *adv_flags, FORMATETC *fmts,
IAdviseSink *sink, DWORD *conns,
IOleClientSite *client_site, IStorage *stg, void **obj)
{
FIXME("(%p, %s, %08x, %08x, %d, %p, %p, %p, %p, %p, %p, %p): stub\n",
data, debugstr_guid(iid), flags, renderopt, num_fmts, adv_flags, fmts,
sink, conns, client_site, stg, obj);
hr = IEnumFORMATETC_Next(pfmt, 1, &fmt, NULL);
}
/* Found a static format, but no embed format */
if (bFoundStatic)
return OLE_S_STATIC;
return S_FALSE;
return E_NOTIMPL;
}
/******************************************************************************

View file

@ -183,7 +183,7 @@
@ stub OleCreateEmbeddingHelper
@ stub OleCreateEx
@ stdcall OleCreateFromData(ptr ptr long ptr ptr ptr ptr)
@ stub OleCreateFromDataEx
@ stdcall OleCreateFromDataEx(ptr ptr long long long ptr ptr ptr ptr ptr ptr ptr)
@ stdcall OleCreateFromFile(ptr ptr ptr long ptr ptr ptr ptr)
@ stub OleCreateFromFileEx
@ stdcall OleCreateLink(ptr ptr long ptr ptr ptr ptr)

View file

@ -1175,7 +1175,7 @@ static HRESULT unmarshal_ORPC_EXTENT_ARRAY(RPC_MESSAGE *msg, const char *end,
/* arbitrary limit for security (don't know what native does) */
if (extensions->size > 256)
{
ERR("too many extensions: %ld\n", extensions->size);
ERR("too many extensions: %d\n", extensions->size);
return RPC_S_INVALID_BOUND;
}
@ -1242,7 +1242,7 @@ static HRESULT unmarshal_ORPCTHIS(RPC_MESSAGE *msg, ORPCTHIS *orpcthis,
if (orpcthis->flags & ~(ORPCF_LOCAL|ORPCF_RESERVED1|ORPCF_RESERVED2|ORPCF_RESERVED3|ORPCF_RESERVED4))
{
ERR("invalid flags 0x%lx\n", orpcthis->flags & ~(ORPCF_LOCAL|ORPCF_RESERVED1|ORPCF_RESERVED2|ORPCF_RESERVED3|ORPCF_RESERVED4));
ERR("invalid flags 0x%x\n", orpcthis->flags & ~(ORPCF_LOCAL|ORPCF_RESERVED1|ORPCF_RESERVED2|ORPCF_RESERVED3|ORPCF_RESERVED4));
return RPC_E_INVALID_HEADER;
}
@ -1285,7 +1285,7 @@ static HRESULT unmarshal_ORPCTHAT(RPC_MESSAGE *msg, ORPCTHAT *orpcthat,
if (orpcthat->flags & ~(ORPCF_LOCAL|ORPCF_RESERVED1|ORPCF_RESERVED2|ORPCF_RESERVED3|ORPCF_RESERVED4))
{
ERR("invalid flags 0x%lx\n", orpcthat->flags & ~(ORPCF_LOCAL|ORPCF_RESERVED1|ORPCF_RESERVED2|ORPCF_RESERVED3|ORPCF_RESERVED4));
ERR("invalid flags 0x%x\n", orpcthat->flags & ~(ORPCF_LOCAL|ORPCF_RESERVED1|ORPCF_RESERVED2|ORPCF_RESERVED3|ORPCF_RESERVED4));
return RPC_E_INVALID_HEADER;
}

View file

@ -967,7 +967,7 @@ static void PropertyStorage_PropertyDestroy(void *k, void *d, void *extra)
#ifdef WORDS_BIGENDIAN
/* Swaps each character in str to or from little endian; assumes the conversion
* is symmetric, that is, that le16toh is equivalent to htole16.
* is symmetric, that is, that lendian16toh is equivalent to htole16.
*/
static void PropertyStorage_ByteSwapString(LPWSTR str, size_t len)
{
@ -1063,7 +1063,7 @@ static HRESULT PropertyStorage_ReadProperty(PropertyStorage_impl *This,
case VT_INT:
case VT_I4:
StorageUtl_ReadDWord(data, 0, (DWORD*)&prop->u.lVal);
TRACE("Read long %ld\n", prop->u.lVal);
TRACE("Read long %d\n", prop->u.lVal);
break;
case VT_UINT:
case VT_UI4:

View file

@ -912,7 +912,7 @@ static HRESULT WINAPI StorageBaseImpl_RenameElement(
* Invoke Destroy to get rid of the ole property and automatically redo
* the linking of its previous and next members...
*/
IStorage_DestroyElement((IStorage*)This->ancestorStorage, pwcsOldName);
IStorage_DestroyElement(iface, pwcsOldName);
}
else
@ -3472,7 +3472,7 @@ static BOOL StorageImpl_ReadDWordFromBigBlock(
ulOffset.u.LowPart += offset;
StorageImpl_ReadAt(This, ulOffset, &tmp, sizeof(DWORD), &read);
*value = le32toh(tmp);
*value = lendian32toh(tmp);
return (read == sizeof(DWORD));
}
@ -4250,7 +4250,7 @@ void StorageUtl_ReadWord(const BYTE* buffer, ULONG offset, WORD* value)
WORD tmp;
memcpy(&tmp, buffer+offset, sizeof(WORD));
*value = le16toh(tmp);
*value = lendian16toh(tmp);
}
void StorageUtl_WriteWord(BYTE* buffer, ULONG offset, WORD value)
@ -4264,7 +4264,7 @@ void StorageUtl_ReadDWord(const BYTE* buffer, ULONG offset, DWORD* value)
DWORD tmp;
memcpy(&tmp, buffer+offset, sizeof(DWORD));
*value = le32toh(tmp);
*value = lendian32toh(tmp);
}
void StorageUtl_WriteDWord(BYTE* buffer, ULONG offset, DWORD value)

View file

@ -376,15 +376,15 @@ StgStreamImpl* StgStreamImpl_Construct(
#define htole32(x) RtlUlongByteSwap(x)
#define htole16(x) RtlUshortByteSwap(x)
#define le32toh(x) RtlUlongByteSwap(x)
#define le16toh(x) RtlUshortByteSwap(x)
#define lendian32toh(x) RtlUlongByteSwap(x)
#define lendian16toh(x) RtlUshortByteSwap(x)
#else
#define htole32(x) (x)
#define htole16(x) (x)
#define le32toh(x) (x)
#define le16toh(x) (x)
#define lendian32toh(x) (x)
#define lendian16toh(x) (x)
#endif

View file

@ -702,7 +702,7 @@ static HRESULT WINAPI RemUnknown_RemAddRef(IRemUnknown *iface,
stub_manager_ext_addref(stubmgr, InterfaceRefs[i].cPublicRefs, FALSE);
if (InterfaceRefs[i].cPrivateRefs)
FIXME("Adding %ld refs securely not implemented\n", InterfaceRefs[i].cPrivateRefs);
FIXME("Adding %d refs securely not implemented\n", InterfaceRefs[i].cPrivateRefs);
stub_manager_int_release(stubmgr);
apartment_release(apt);
@ -735,7 +735,7 @@ static HRESULT WINAPI RemUnknown_RemRelease(IRemUnknown *iface,
stub_manager_ext_release(stubmgr, InterfaceRefs[i].cPublicRefs, FALSE, TRUE);
if (InterfaceRefs[i].cPrivateRefs)
FIXME("Releasing %ld refs securely not implemented\n", InterfaceRefs[i].cPrivateRefs);
FIXME("Releasing %d refs securely not implemented\n", InterfaceRefs[i].cPrivateRefs);
stub_manager_int_release(stubmgr);
apartment_release(apt);

View file

@ -2414,7 +2414,7 @@ HRESULT CALLBACK IStorage_OpenStream_Proxy(
HRESULT __RPC_STUB IStorage_OpenStream_Stub(
IStorage* This,
LPCOLESTR pwcsName,
unsigned long cbReserved1,
ULONG cbReserved1,
byte *reserved1,
DWORD grfMode,
DWORD reserved2,
@ -2438,7 +2438,7 @@ HRESULT CALLBACK IStorage_EnumElements_Proxy(
HRESULT __RPC_STUB IStorage_EnumElements_Stub(
IStorage* This,
DWORD reserved1,
unsigned long cbReserved2,
ULONG cbReserved2,
byte *reserved2,
DWORD reserved3,
IEnumSTATSTG **ppenum)

View file

@ -1,24 +0,0 @@
/*
* Copyright 2007 Stefan Leichter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define WINE_FILEVERSION 2,10,3050,1
#define WINE_FILEVERSION_STR "2.10.3050.1"
#define WINE_FILEDESCRIPTION_STR "Wine OLE dll"
#define WINE_FILENAME_STR "OLE2NLS.DLL"
#include "wine/wine_common_ver.rc"

View file

@ -81,8 +81,7 @@
#include "urlmon.h"
#include "wine/debug.h"
#include "wine/unicode.h"
#include "wine/wingdi16.h"
#include "wine/library.h"
#include "ungif.h"

View file

@ -66,7 +66,6 @@
#include "winuser.h"
#include "lzexpand.h"
#include "wine/winbase16.h"
#include "wine/unicode.h"
#include "objbase.h"
#include "typelib.h"
@ -77,6 +76,26 @@
WINE_DEFAULT_DEBUG_CHANNEL(ole);
WINE_DECLARE_DEBUG_CHANNEL(typelib);
typedef struct
{
WORD offset;
WORD length;
WORD flags;
WORD id;
WORD handle;
WORD usage;
} NE_NAMEINFO;
typedef struct
{
WORD type_id; /* Type identifier */
WORD count; /* Number of resources of this type */
DWORD resloader; /* SetResourceHandler() */
/*
* Name info array.
*/
} NE_TYPEINFO;
static HRESULT typedescvt_to_variantvt(ITypeInfo *tinfo, const TYPEDESC *tdesc, VARTYPE *vt);
static HRESULT TLB_AllocAndInitVarDesc(const VARDESC *src, VARDESC **dest_ptr);
@ -149,13 +168,13 @@ static void FromLEDWords(void *p_Val, int p_iSize)
/*
* Find a typelib key which matches a requested maj.min version.
*/
static BOOL find_typelib_key( REFGUID guid, WORD wMaj, WORD *wMin )
static BOOL find_typelib_key( REFGUID guid, WORD *wMaj, WORD *wMin )
{
static const WCHAR typelibW[] = {'T','y','p','e','l','i','b','\\',0};
WCHAR buffer[60];
char key_name[16];
DWORD len, i;
INT best_min = -1;
INT best_maj = -1, best_min = -1;
HKEY hkey;
memcpy( buffer, typelibW, sizeof(typelibW) );
@ -174,20 +193,40 @@ static BOOL find_typelib_key( REFGUID guid, WORD wMaj, WORD *wMin )
{
TRACE("found %s: %x.%x\n", debugstr_w(buffer), v_maj, v_min);
if (wMaj == v_maj)
if (*wMaj == 0xffff && *wMin == 0xffff)
{
if (v_maj > best_maj) best_maj = v_maj;
if (v_min > best_min) best_min = v_min;
}
else if (*wMaj == v_maj)
{
best_maj = v_maj;
if (*wMin == v_min)
{
best_min = v_min;
break; /* exact match */
}
if (v_min > best_min) best_min = v_min;
if (*wMin != 0xffff && v_min > best_min) best_min = v_min;
}
}
len = sizeof(key_name);
}
RegCloseKey( hkey );
if (best_min >= 0)
TRACE("found best_maj %d, best_min %d\n", best_maj, best_min);
if (*wMaj == 0xffff && *wMin == 0xffff)
{
if (best_maj >= 0 && best_min >= 0)
{
*wMaj = best_maj;
*wMin = best_min;
return TRUE;
}
}
if (*wMaj == best_maj && best_min >= 0)
{
*wMin = best_min;
return TRUE;
@ -276,7 +315,7 @@ HRESULT WINAPI QueryPathOfRegTypeLib(
TRACE_(typelib)("(%s, %x.%x, 0x%x, %p)\n", debugstr_guid(guid), wMaj, wMin, lcid, path);
if (!find_typelib_key( guid, wMaj, &wMin )) return TYPE_E_LIBNOTREGISTERED;
if (!find_typelib_key( guid, &wMaj, &wMin )) return TYPE_E_LIBNOTREGISTERED;
get_typelib_key( guid, wMaj, wMin, buffer );
res = RegOpenKeyExW( HKEY_CLASSES_ROOT, buffer, 0, KEY_READ, &hkey );

View file

@ -26,7 +26,6 @@
#include "windef.h"
#include "winbase.h"
#include "oleauto.h"
#include "wine/windef16.h"
#define HELPDLLFLAG (0x0100)
#define DO_NOT_SEEK (-1)

View file

@ -755,7 +755,7 @@ ULONG WINAPI LPSAFEARRAY_UserSize(ULONG *pFlags, ULONG StartingSize, LPSAFEARRAY
TRACE("("); dump_user_flags(pFlags); TRACE(", %d, %p\n", StartingSize, *ppsa);
ALIGN_LENGTH(size, 3);
size += sizeof(ULONG_PTR);
size += sizeof(ULONG);
if (*ppsa)
{
SAFEARRAY *psa = *ppsa;
@ -770,7 +770,7 @@ ULONG WINAPI LPSAFEARRAY_UserSize(ULONG *pFlags, ULONG StartingSize, LPSAFEARRAY
size += sizeof(ULONG);
size += sizeof(ULONG);
size += sizeof(ULONG_PTR);
size += sizeof(ULONG);
if (sftype == SF_HAVEIID)
size += sizeof(IID);
@ -843,8 +843,8 @@ unsigned char * WINAPI LPSAFEARRAY_UserMarshal(ULONG *pFlags, unsigned char *Buf
TRACE("("); dump_user_flags(pFlags); TRACE(", %p, &%p\n", Buffer, *ppsa);
ALIGN_POINTER(Buffer, 3);
*(ULONG_PTR *)Buffer = *ppsa ? TRUE : FALSE;
Buffer += sizeof(ULONG_PTR);
*(ULONG *)Buffer = *ppsa ? 0x1 : 0x0;
Buffer += sizeof(ULONG);
if (*ppsa)
{
VARTYPE vt;
@ -874,8 +874,8 @@ unsigned char * WINAPI LPSAFEARRAY_UserMarshal(ULONG *pFlags, unsigned char *Buf
*(ULONG *)Buffer = ulCellCount;
Buffer += sizeof(ULONG);
*(ULONG_PTR *)Buffer = (ULONG_PTR)psa->pvData;
Buffer += sizeof(ULONG_PTR);
*(ULONG *)Buffer = psa->pvData ? 0x2 : 0x0;
Buffer += sizeof(ULONG);
if (sftype == SF_HAVEIID)
{
SafeArrayGetIID(psa, &guid);
@ -958,7 +958,7 @@ unsigned char * WINAPI LPSAFEARRAY_UserMarshal(ULONG *pFlags, unsigned char *Buf
unsigned char * WINAPI LPSAFEARRAY_UserUnmarshal(ULONG *pFlags, unsigned char *Buffer, LPSAFEARRAY *ppsa)
{
ULONG_PTR ptr;
ULONG ptr;
wireSAFEARRAY wiresa;
ULONG cDims;
HRESULT hr;
@ -971,8 +971,8 @@ unsigned char * WINAPI LPSAFEARRAY_UserUnmarshal(ULONG *pFlags, unsigned char *B
TRACE("("); dump_user_flags(pFlags); TRACE(", %p, %p\n", Buffer, ppsa);
ALIGN_POINTER(Buffer, 3);
ptr = *(ULONG_PTR *)Buffer;
Buffer += sizeof(ULONG_PTR);
ptr = *(ULONG *)Buffer;
Buffer += sizeof(ULONG);
if (!ptr)
{
@ -1001,8 +1001,8 @@ unsigned char * WINAPI LPSAFEARRAY_UserUnmarshal(ULONG *pFlags, unsigned char *B
cell_count = *(ULONG *)Buffer;
Buffer += sizeof(ULONG);
ptr = *(ULONG_PTR *)Buffer;
Buffer += sizeof(ULONG_PTR);
ptr = *(ULONG *)Buffer;
Buffer += sizeof(ULONG);
if (sftype == SF_HAVEIID)
{
memcpy(&guid, Buffer, sizeof(guid));
@ -2041,7 +2041,8 @@ HRESULT CALLBACK IPropertyBag_Read_Proxy(
FIXME("Safearray support not yet implemented.\n");
return E_NOTIMPL;
default:
break;
FIXME("Unknown V_VT %d - support not yet implemented.\n", V_VT(pVar));
return E_NOTIMPL;
}
return IPropertyBag_RemoteRead_Proxy(This, pszPropName, pVar, pErrorLog,

View file

@ -40,6 +40,7 @@
#include "wine/unicode.h"
#include "winerror.h"
#include "variant.h"
#include "resource.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(variant);
@ -2467,8 +2468,8 @@ HRESULT WINAPI VarCat(LPVARIANT left, LPVARIANT right, LPVARIANT out)
{
VARTYPE leftvt,rightvt,resultvt;
HRESULT hres;
static const WCHAR str_true[] = {'T','r','u','e','\0'};
static const WCHAR str_false[] = {'F','a','l','s','e','\0'};
static WCHAR str_true[32];
static WCHAR str_false[32];
static const WCHAR sz_empty[] = {'\0'};
leftvt = V_VT(left);
rightvt = V_VT(right);
@ -2476,6 +2477,11 @@ HRESULT WINAPI VarCat(LPVARIANT left, LPVARIANT right, LPVARIANT out)
TRACE("(%p->(%s%s),%p->(%s%s),%p)\n", left, debugstr_VT(left),
debugstr_VF(left), right, debugstr_VT(right), debugstr_VF(right), out);
if (!str_true[0]) {
VARIANT_GetLocalisedText(LOCALE_USER_DEFAULT, IDS_FALSE, str_false);
VARIANT_GetLocalisedText(LOCALE_USER_DEFAULT, IDS_TRUE, str_true);
}
/* when both left and right are NULL the result is NULL */
if (leftvt == VT_NULL && rightvt == VT_NULL)
{
@ -2558,7 +2564,7 @@ HRESULT WINAPI VarCat(LPVARIANT left, LPVARIANT right, LPVARIANT out)
{
if (leftvt == VT_BOOL)
{
/* Bools are handled as True/False strings instead of 0/-1 as in MSDN */
/* Bools are handled as localized True/False strings instead of 0/-1 as in MSDN */
V_VT(&bstrvar_left) = VT_BSTR;
if (V_BOOL(left) == TRUE)
V_BSTR(&bstrvar_left) = SysAllocString(str_true);
@ -2598,7 +2604,7 @@ HRESULT WINAPI VarCat(LPVARIANT left, LPVARIANT right, LPVARIANT out)
{
if (rightvt == VT_BOOL)
{
/* Bools are handled as True/False strings instead of 0/-1 as in MSDN */
/* Bools are handled as localized True/False strings instead of 0/-1 as in MSDN */
V_VT(&bstrvar_right) = VT_BSTR;
if (V_BOOL(right) == TRUE)
V_BSTR(&bstrvar_right) = SysAllocString(str_true);

View file

@ -123,3 +123,6 @@ typedef struct tagVARIANT_NUMBER_CHARS
WCHAR cCurrencyDecimalPoint;
WCHAR cCurrencyDigitSeparator;
} VARIANT_NUMBER_CHARS;
BOOL VARIANT_GetLocalisedText(LANGID, DWORD, WCHAR *);

View file

@ -5961,7 +5961,13 @@ HRESULT WINAPI VarBoolFromCy(CY cyIn, VARIANT_BOOL *pBoolOut)
return S_OK;
}
static BOOL VARIANT_GetLocalisedText(LANGID langId, DWORD dwId, WCHAR *lpszDest)
/************************************************************************
* VARIANT_GetLocalisedText [internal]
*
* Get a localized string from the resources
*
*/
BOOL VARIANT_GetLocalisedText(LANGID langId, DWORD dwId, WCHAR *lpszDest)
{
HRSRC hrsrc;
@ -6957,9 +6963,8 @@ HRESULT WINAPI VarBstrCmp(BSTR pbstrLeft, BSTR pbstrRight, LCID lcid, DWORD dwFl
if (!pbstrLeft || !*pbstrLeft)
{
if (!pbstrRight || !*pbstrRight)
return VARCMP_EQ;
return VARCMP_LT;
if (pbstrRight && *pbstrRight)
return VARCMP_LT;
}
else if (!pbstrRight || !*pbstrRight)
return VARCMP_GT;
@ -6981,8 +6986,17 @@ HRESULT WINAPI VarBstrCmp(BSTR pbstrLeft, BSTR pbstrRight, LCID lcid, DWORD dwFl
}
else
{
hres = CompareStringW(lcid, dwFlags, pbstrLeft, SysStringLen(pbstrLeft),
pbstrRight, SysStringLen(pbstrRight)) - 1;
unsigned int lenLeft = SysStringLen(pbstrLeft);
unsigned int lenRight = SysStringLen(pbstrRight);
if (lenLeft == 0 || lenRight == 0)
{
if (lenLeft == 0 && lenRight == 0) return VARCMP_EQ;
return lenLeft < lenRight ? VARCMP_LT : VARCMP_GT;
}
hres = CompareStringW(lcid, dwFlags, pbstrLeft, lenLeft,
pbstrRight, lenRight) - 1;
TRACE("%d\n", hres);
return hres;
}

View file

@ -907,7 +907,7 @@ interface IStorage : IUnknown
[call_as(OpenStream)]
HRESULT RemoteOpenStream(
[in] LPCOLESTR pwcsName,
[in] unsigned long cbReserved1,
[in] ULONG cbReserved1,
[in, unique, size_is(cbReserved1)] byte *reserved1,
[in] DWORD grfMode,
[in] DWORD reserved2,
@ -955,7 +955,7 @@ interface IStorage : IUnknown
[call_as(EnumElements)]
HRESULT RemoteEnumElements(
[in] DWORD reserved1,
[in] unsigned long cbReserved2,
[in] ULONG cbReserved2,
[in, unique, size_is(cbReserved2)] byte *reserved2,
[in] DWORD reserved3,
[out] IEnumSTATSTG **ppenum);