mirror of
https://github.com/reactos/reactos.git
synced 2024-07-02 18:54:25 +00:00
- Sync ole32 and oleaut32 with Wine 1.1.20
svn path=/trunk/; revision=40795
This commit is contained in:
parent
64d2ce31a9
commit
57e86f2709
File diff suppressed because it is too large
Load diff
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -123,3 +123,6 @@ typedef struct tagVARIANT_NUMBER_CHARS
|
|||
WCHAR cCurrencyDecimalPoint;
|
||||
WCHAR cCurrencyDigitSeparator;
|
||||
} VARIANT_NUMBER_CHARS;
|
||||
|
||||
|
||||
BOOL VARIANT_GetLocalisedText(LANGID, DWORD, WCHAR *);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue