Sync to Wine-20050628:
Robert Shearman <rob(a)codeweavers.com>
- Convert some registry helper functions to use unicode versions of
CLSID & registry functions (untested).
- Add registry entries for local-only OLE interfaces.
- Change IUnknown to local interface.
- IUnknown isn't a remotable interface so the stub manager shouldn't
need a marshaller for it.
- Change the RPC code to use the unicode versions of the CLSID &
registry functions.
- Don't disconnect proxies flagged with SORFP_NOLIFETIMEMGMT. It makes
no sense and only causes trouble for proxies that depend on these
proxies being available.
- Change some of the registry helper functions to use the unicode
versions of the CLSID & registry functions.
- Reindent CoGetClassObject and output an error message if the class
isn't registered.
- Add tests for the touched functions.
Dmitry Timoshkov <dmitry(a)codeweavers.com>
- Make remaining OLE interface vtables const.
Richard Cohen <richard(a)daijobu.co.uk>
- Base FileMonikerImpl_Save() on XP.
- Correct handling of Unicode strings & multibyte locales.
- More error checking.
- Change ERR to WARN.
- Match Windows quick & dirty estimate for GetSizeMax().
Stefan Huehner <stefan(a)huehner.org>
- Fix some more -Wstrict-prototypes warnings.
Mike Hearn <mike(a)navi.cx>
- Add some tracing to the IRemUnknown RpcProxyBuffer implementation.
Eric Pouech <pouech-eric(a)wanadoo.fr>
- Const correctness fixes.
Richard Cohen <richard(a)daijobu.co.uk>
- IEnum::Clone shouldn't do a Reset.
Marcus Meissner <marcus(a)jet.franken.de>
- Removed CLSID_CompositeMoniker (conflicting with static definition).
Alexandre Julliard <julliard(a)winehq.org>
- Sort entry points alphabetically.
Modified: trunk/reactos/lib/ole32/antimoniker.c
Modified: trunk/reactos/lib/ole32/bindctx.c
Modified: trunk/reactos/lib/ole32/clipboard.c
Modified: trunk/reactos/lib/ole32/compobj.c
Modified: trunk/reactos/lib/ole32/compobj_private.h
Modified: trunk/reactos/lib/ole32/compositemoniker.c
Modified: trunk/reactos/lib/ole32/datacache.c
Modified: trunk/reactos/lib/ole32/defaulthandler.c
Modified: trunk/reactos/lib/ole32/errorinfo.c
Modified: trunk/reactos/lib/ole32/filemoniker.c
Modified: trunk/reactos/lib/ole32/ftmarshal.c
Modified: trunk/reactos/lib/ole32/git.c
Modified: trunk/reactos/lib/ole32/hglobalstream.c
Modified: trunk/reactos/lib/ole32/ifs.c
Modified: trunk/reactos/lib/ole32/itemmoniker.c
Modified: trunk/reactos/lib/ole32/marshal.c
Modified: trunk/reactos/lib/ole32/memlockbytes.c
Modified: trunk/reactos/lib/ole32/memlockbytes16.c
Modified: trunk/reactos/lib/ole32/moniker.c
Modified: trunk/reactos/lib/ole32/moniker.h
Modified: trunk/reactos/lib/ole32/ole16.c
Modified: trunk/reactos/lib/ole32/ole2.c
Modified: trunk/reactos/lib/ole32/ole32.spec
Modified: trunk/reactos/lib/ole32/oleobj.c
Modified: trunk/reactos/lib/ole32/oleproxy.c
Modified: trunk/reactos/lib/ole32/regsvr.c
Modified: trunk/reactos/lib/ole32/rpc.c
Modified: trunk/reactos/lib/ole32/stg_prop.c
Modified: trunk/reactos/lib/ole32/stg_stream.c
Modified: trunk/reactos/lib/ole32/storage.c
Modified: trunk/reactos/lib/ole32/storage32.c
Modified: trunk/reactos/lib/ole32/storage32.h
Modified: trunk/reactos/lib/ole32/stubmanager.c
_____
Modified: trunk/reactos/lib/ole32/antimoniker.c
--- trunk/reactos/lib/ole32/antimoniker.c 2005-08-03 22:31:41 UTC
(rev 17035)
+++ trunk/reactos/lib/ole32/antimoniker.c 2005-08-03 22:31:39 UTC
(rev 17036)
@@ -42,12 +42,12 @@
/* AntiMoniker data structure */
typedef struct AntiMonikerImpl{
- IMonikerVtbl* lpvtbl1; /* VTable relative to the IMoniker
interface.*/
+ const IMonikerVtbl* lpvtbl1; /* VTable relative to the IMoniker
interface.*/
/* The ROT (RunningObjectTable implementation) uses the IROTData
interface to test whether
* two monikers are equal. That's whay IROTData interface is
implemented by monikers.
*/
- IROTDataVtbl* lpvtbl2; /* VTable relative to the IROTData
interface.*/
+ const IROTDataVtbl* lpvtbl2; /* VTable relative to the IROTData
interface.*/
ULONG ref; /* reference counter for this object */
@@ -530,7 +530,7 @@
/***********************************************************************
*********/
/* Virtual function table for the AntiMonikerImpl class which include
IPersist,*/
/* IPersistStream and IMoniker functions.
*/
-static IMonikerVtbl VT_AntiMonikerImpl =
+static const IMonikerVtbl VT_AntiMonikerImpl =
{
AntiMonikerImpl_QueryInterface,
AntiMonikerImpl_AddRef,
@@ -559,7 +559,7 @@
/***********************************************************************
*********/
/* Virtual function table for the IROTData class.
*/
-static IROTDataVtbl VT_ROTDataImpl =
+static const IROTDataVtbl VT_ROTDataImpl =
{
AntiMonikerROTDataImpl_QueryInterface,
AntiMonikerROTDataImpl_AddRef,
_____
Modified: trunk/reactos/lib/ole32/bindctx.c
--- trunk/reactos/lib/ole32/bindctx.c 2005-08-03 22:31:41 UTC (rev
17035)
+++ trunk/reactos/lib/ole32/bindctx.c 2005-08-03 22:31:39 UTC (rev
17036)
@@ -50,7 +50,7 @@
/* BindCtx data strucrture */
typedef struct BindCtxImpl{
- IBindCtxVtbl *lpVtbl; /* VTable relative to the IBindCtx
interface.*/
+ const IBindCtxVtbl *lpVtbl; /* VTable relative to the IBindCtx
interface.*/
ULONG ref; /* reference counter for this object */
@@ -474,7 +474,7 @@
}
/* Virtual function table for the BindCtx class. */
-static IBindCtxVtbl VT_BindCtxImpl =
+static const IBindCtxVtbl VT_BindCtxImpl =
{
BindCtxImpl_QueryInterface,
BindCtxImpl_AddRef,
_____
Modified: trunk/reactos/lib/ole32/clipboard.c
--- trunk/reactos/lib/ole32/clipboard.c 2005-08-03 22:31:41 UTC (rev
17035)
+++ trunk/reactos/lib/ole32/clipboard.c 2005-08-03 22:31:39 UTC (rev
17036)
@@ -96,7 +96,7 @@
/*
* List all interface VTables here
*/
- IDataObjectVtbl* lpvtbl1; /* IDataObject VTable */
+ const IDataObjectVtbl* lpvtbl1; /* IDataObject VTable */
/*
* The hidden OLE clipboard window. This window is used as the bridge
between the
@@ -135,7 +135,7 @@
typedef struct
{
/* IEnumFORMATETC VTable */
- IEnumFORMATETCVtbl *lpVtbl;
+ const IEnumFORMATETCVtbl *lpVtbl;
/* IEnumFORMATETC fields */
UINT posFmt; /* current enumerator
position */
@@ -250,7 +250,7 @@
/*
* Virtual function table for the OLEClipbrd's exposed IDataObject
interface
*/
-static IDataObjectVtbl OLEClipbrd_IDataObject_VTable =
+static const IDataObjectVtbl OLEClipbrd_IDataObject_VTable =
{
OLEClipbrd_IDataObject_QueryInterface,
OLEClipbrd_IDataObject_AddRef,
@@ -269,7 +269,7 @@
/*
* Virtual function table for IEnumFORMATETC interface
*/
-static struct IEnumFORMATETCVtbl efvt =
+static const IEnumFORMATETCVtbl efvt =
{
OLEClipbrd_IEnumFORMATETC_QueryInterface,
OLEClipbrd_IEnumFORMATETC_AddRef,
_____
Modified: trunk/reactos/lib/ole32/compobj.c
--- trunk/reactos/lib/ole32/compobj.c 2005-08-03 22:31:41 UTC (rev
17035)
+++ trunk/reactos/lib/ole32/compobj.c 2005-08-03 22:31:39 UTC (rev
17036)
@@ -76,6 +76,8 @@
HINSTANCE OLE32_hInstance = 0; /* FIXME: make static ... */
+#define ARRAYSIZE(array) (sizeof(array)/sizeof((array)[0]))
+
/***********************************************************************
*****
* This section defines variables internal to the COM module.
*
@@ -195,7 +197,7 @@
UnregisterClassW(wszAptWinClass, OLE32_hInstance);
}
-static void COM_TlsDestroy()
+static void COM_TlsDestroy(void)
{
struct oletls *info = NtCurrentTeb()->ReservedForOle;
if (info)
@@ -981,6 +983,16 @@
return MultiByteToWideChar( CP_ACP, 0, xguid, -1, str, cmax );
}
+/* open HKCR\\CLSID\\{string form of clsid} key */
+DWORD COM_OpenKeyForCLSID(REFCLSID clsid, REGSAM access, HKEY *key)
+{
+ static const WCHAR wszCLSIDSlash[] =
{'C','L','S','I','D','\\',0};
+ WCHAR path[CHARS_IN_GUID + ARRAYSIZE(wszCLSIDSlash) - 1];
+ strcpyW(path, wszCLSIDSlash);
+ StringFromGUID2(clsid, path + strlenW(wszCLSIDSlash),
CHARS_IN_GUID);
+ return RegOpenKeyExW(HKEY_CLASSES_ROOT, path, 0, access, key);
+}
+
/***********************************************************************
*******
* ProgIDFromCLSID [OLE32.@]
*
@@ -997,43 +1009,42 @@
*/
HRESULT WINAPI ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *lplpszProgID)
{
- char strCLSID[50], *buf, *buf2;
- DWORD buf2len;
- HKEY xhkey;
- LPMALLOC mllc;
+ static const WCHAR wszProgID[] =
{'P','r','o','g','I','D',0};
+ HKEY hkey = NULL;
+ HKEY hkey_clsid;
HRESULT ret = S_OK;
- WINE_StringFromCLSID(clsid, strCLSID);
-
- buf = HeapAlloc(GetProcessHeap(), 0, strlen(strCLSID)+14);
- sprintf(buf,"CLSID\\%s\\ProgID", strCLSID);
- if (RegOpenKeyA(HKEY_CLASSES_ROOT, buf, &xhkey))
+ if (ERROR_SUCCESS != COM_OpenKeyForCLSID(clsid, KEY_READ,
&hkey_clsid))
ret = REGDB_E_CLASSNOTREG;
- HeapFree(GetProcessHeap(), 0, buf);
+ if (ret == S_OK)
+ {
+ if (RegOpenKeyExW(hkey_clsid, wszProgID, 0, KEY_READ, &hkey))
+ ret = REGDB_E_CLASSNOTREG;
+ RegCloseKey(hkey_clsid);
+ }
if (ret == S_OK)
{
- buf2 = HeapAlloc(GetProcessHeap(), 0, 255);
- buf2len = 255;
- if (RegQueryValueA(xhkey, NULL, buf2, &buf2len))
+ DWORD progidlen = 0;
+
+ if (RegQueryValueW(hkey, NULL, NULL, &progidlen))
ret = REGDB_E_CLASSNOTREG;
if (ret == S_OK)
{
- if (CoGetMalloc(0,&mllc))
- ret = E_OUTOFMEMORY;
- else
+ *lplpszProgID = CoTaskMemAlloc(progidlen * sizeof(WCHAR));
+ if (*lplpszProgID)
{
- DWORD len = MultiByteToWideChar( CP_ACP, 0, buf2, -1, NULL, 0
);
- *lplpszProgID = IMalloc_Alloc(mllc, len * sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, buf2, -1, *lplpszProgID, len
);
+ if (RegQueryValueW(hkey, NULL, *lplpszProgID, &progidlen))
+ ret = REGDB_E_CLASSNOTREG;
}
+ else
+ ret = E_OUTOFMEMORY;
}
- HeapFree(GetProcessHeap(), 0, buf2);
- RegCloseKey(xhkey);
}
+ RegCloseKey(hkey);
return ret;
}
@@ -1089,7 +1100,7 @@
HRESULT WINAPI CLSIDFromProgID(LPCOLESTR progid, LPCLSID riid)
{
static const WCHAR clsidW[] = {
'\\','C','L','S','I','D',0 };
- char buf2[80];
+ WCHAR buf2[CHARS_IN_GUID];
DWORD buf2len = sizeof(buf2);
HKEY xhkey;
@@ -1103,13 +1114,13 @@
}
HeapFree(GetProcessHeap(),0,buf);
- if (RegQueryValueA(xhkey,NULL,buf2,&buf2len))
+ if (RegQueryValueW(xhkey,NULL,buf2,&buf2len))
{
RegCloseKey(xhkey);
return CO_E_CLASSSTRING;
}
RegCloseKey(xhkey);
- return __CLSIDFromStringA(buf2,riid);
+ return CLSIDFromString(buf2,riid);
}
@@ -1151,46 +1162,41 @@
*/
HRESULT WINAPI CoGetPSClsid(REFIID riid, CLSID *pclsid)
{
- char *buf, buf2[40];
- DWORD buf2len;
- HKEY xhkey;
+ static const WCHAR wszInterface[] =
{'I','n','t','e','r','f','a','c','e','\\',0};
+ static const WCHAR wszPSC[] =
{'\\','P','r','o','x','y','S','t','u','b','C','l','s','i','d','3','2',0}
;
+ WCHAR path[ARRAYSIZE(wszInterface) - 1 + CHARS_IN_GUID - 1 +
ARRAYSIZE(wszPSC)];
+ WCHAR value[CHARS_IN_GUID];
+ DWORD len;
+ HKEY hkey;
TRACE("() riid=%s, pclsid=%p\n", debugstr_guid(riid), pclsid);
- /* Get the input iid as a string */
- WINE_StringFromCLSID(riid, buf2);
- /* Allocate memory for the registry key we will construct.
- (length of iid string plus constant length of static text */
- buf = HeapAlloc(GetProcessHeap(), 0, strlen(buf2)+27);
- if (buf == NULL)
- return E_OUTOFMEMORY;
+ /* Interface\\{string form of riid}\\ProxyStubClsid32 */
+ strcpyW(path, wszInterface);
+ StringFromGUID2(riid, path + ARRAYSIZE(wszInterface) - 1,
CHARS_IN_GUID);
+ strcpyW(path + ARRAYSIZE(wszInterface) - 1 + CHARS_IN_GUID - 1,
wszPSC);
- /* Construct the registry key we want */
- sprintf(buf,"Interface\\%s\\ProxyStubClsid32", buf2);
-
/* Open the key.. */
- if (RegOpenKeyA(HKEY_CLASSES_ROOT, buf, &xhkey))
+ if (RegOpenKeyExW(HKEY_CLASSES_ROOT, path, 0, KEY_READ, &hkey))
{
WARN("No PSFactoryBuffer object is registered for IID %s\n",
debugstr_guid(riid));
- HeapFree(GetProcessHeap(),0,buf);
return REGDB_E_IIDNOTREG;
}
- HeapFree(GetProcessHeap(),0,buf);
/* ... Once we have the key, query the registry to get the
value of CLSID as a string, and convert it into a
proper CLSID structure to be passed back to the app */
- buf2len = sizeof(buf2);
- if ( (RegQueryValueA(xhkey,NULL,buf2,&buf2len)) )
+ len = sizeof(value);
+ if (ERROR_SUCCESS != RegQueryValueW(hkey, NULL, value, &len))
{
- RegCloseKey(xhkey);
+ RegCloseKey(hkey);
return REGDB_E_IIDNOTREG;
}
- RegCloseKey(xhkey);
+ RegCloseKey(hkey);
/* We have the CLSid we want back from the registry as a string, so
lets convert it into a CLSID structure */
- if ( (__CLSIDFromStringA(buf2,pclsid)) != NOERROR)
+ if (CLSIDFromString(value, pclsid) != NOERROR)
return REGDB_E_IIDNOTREG;
TRACE ("() Returning CLSID=%s\n", debugstr_guid(pclsid));
@@ -1528,25 +1534,24 @@
}
/***********************************************************************
- * compobj_RegReadPath [internal]
+ * COM_RegReadPath [internal]
*
* Reads a registry value and expands it when necessary
*/
-static HRESULT
-compobj_RegReadPath(char * keyname, char * valuename, char * dst, DWORD
dstlen)
+HRESULT COM_RegReadPath(HKEY hkeyroot, const WCHAR *keyname, const
WCHAR *valuename, WCHAR * dst, DWORD dstlen)
{
HRESULT hres;
HKEY key;
DWORD keytype;
- char src[MAX_PATH];
- DWORD dwLength = dstlen;
+ WCHAR src[MAX_PATH];
+ DWORD dwLength = dstlen * sizeof(WCHAR);
- if((hres = RegOpenKeyExA(HKEY_CLASSES_ROOT, keyname, 0,
KEY_READ, &key)) == ERROR_SUCCESS) {
- if( (hres = RegQueryValueExA(key, NULL, NULL, &keytype,
(LPBYTE)src, &dwLength)) == ERROR_SUCCESS ) {
+ if((hres = RegOpenKeyExW(hkeyroot, keyname, 0, KEY_READ, &key))
== ERROR_SUCCESS) {
+ if( (hres = RegQueryValueExW(key, NULL, NULL, &keytype,
(LPBYTE)src, &dwLength)) == ERROR_SUCCESS ) {
if (keytype == REG_EXPAND_SZ) {
- if (dstlen <= ExpandEnvironmentStringsA(src, dst,
dstlen)) hres = ERROR_MORE_DATA;
+ if (dstlen <= ExpandEnvironmentStringsW(src, dst,
dstlen)) hres = ERROR_MORE_DATA;
} else {
- lstrcpynA(dst, src, dstlen);
+ lstrcpynW(dst, src, dstlen);
}
}
RegCloseKey (key);
@@ -1565,17 +1570,11 @@
*/
HRESULT WINAPI CoGetClassObject(
REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo,
- REFIID iid, LPVOID *ppv
-) {
+ REFIID iid, LPVOID *ppv)
+{
LPUNKNOWN regClassObject;
HRESULT hres = E_UNEXPECTED;
- char xclsid[80];
- HINSTANCE hLibrary;
- typedef HRESULT (CALLBACK *DllGetClassObjectFunc)(REFCLSID clsid,
REFIID iid, LPVOID *ppv);
- DllGetClassObjectFunc DllGetClassObject;
- WINE_StringFromCLSID((LPCLSID)rclsid,xclsid);
-
TRACE("\n\tCLSID:\t%s,\n\tIID:\t%s\n", debugstr_guid(rclsid),
debugstr_guid(iid));
if (pServerInfo) {
@@ -1589,9 +1588,7 @@
*/
if (S_OK == COM_GetRegisteredClassObject(rclsid, dwClsContext,
®ClassObject))
{
- /*
- * Get the required interface from the retrieved pointer.
- */
+ /* Get the required interface from the retrieved pointer. */
hres = IUnknown_QueryInterface(regClassObject, iid, ppv);
/*
@@ -1605,32 +1602,49 @@
}
/* first try: in-process */
- if ((CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER) & dwClsContext)
{
- char keyname[MAX_PATH];
- char dllpath[MAX_PATH+1];
+ if ((CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER) & dwClsContext)
+ {
+ static const WCHAR wszInprocServer32[] =
{'I','n','p','r','o','c','S','e','r','v','e','r','3','2',0};
+ HINSTANCE hLibrary;
+ typedef HRESULT (CALLBACK *DllGetClassObjectFunc)(REFCLSID
clsid, REFIID iid, LPVOID *ppv);
+ DllGetClassObjectFunc DllGetClassObject;
+ WCHAR dllpath[MAX_PATH+1];
+ HKEY hkey;
- sprintf(keyname,"CLSID\\%s\\InprocServer32",xclsid);
+ if (ERROR_SUCCESS != COM_OpenKeyForCLSID(rclsid, KEY_READ,
&hkey))
+ {
+ ERR("class %s not registered\n", debugstr_guid(rclsid));
+ hres = REGDB_E_CLASSNOTREG;
+ }
- if ( compobj_RegReadPath(keyname, NULL, dllpath,
sizeof(dllpath)) != ERROR_SUCCESS) {
- /* failure: CLSID is not found in registry */
- WARN("class %s not registered inproc\n", xclsid);
+ if (COM_RegReadPath(hkey, wszInprocServer32, NULL, dllpath,
ARRAYSIZE(dllpath)) != ERROR_SUCCESS)
+ {
+ /* failure: CLSID is not found in registry */
+ WARN("class %s not registered inproc\n",
debugstr_guid(rclsid));
hres = REGDB_E_CLASSNOTREG;
- } else {
- if ((hLibrary = LoadLibraryExA(dllpath, 0,
LOAD_WITH_ALTERED_SEARCH_PATH)) == 0) {
- /* failure: DLL could not be loaded */
- ERR("couldn't load InprocServer32 dll %s\n", dllpath);
- hres = E_ACCESSDENIED; /* FIXME: or should this be
CO_E_DLLNOTFOUND? */
- } else if (!(DllGetClassObject =
(DllGetClassObjectFunc)GetProcAddress(hLibrary, "DllGetClassObject"))) {
- /* failure: the dll did not export DllGetClassObject */
- ERR("couldn't find function DllGetClassObject in %s\n",
dllpath);
- FreeLibrary( hLibrary );
- hres = CO_E_DLLNOTFOUND;
- } else {
- /* OK: get the ClassObject */
- COMPOBJ_DLLList_Add( hLibrary );
- return DllGetClassObject(rclsid, iid, ppv);
- }
- }
+ }
+ else
+ {
+ if ((hLibrary = LoadLibraryExW(dllpath, 0,
LOAD_WITH_ALTERED_SEARCH_PATH)) == 0)
+ {
+ /* failure: DLL could not be loaded */
+ ERR("couldn't load InprocServer32 dll %s\n",
debugstr_w(dllpath));
+ hres = E_ACCESSDENIED; /* FIXME: or should this be
CO_E_DLLNOTFOUND? */
+ }
+ else if (!(DllGetClassObject =
(DllGetClassObjectFunc)GetProcAddress(hLibrary, "DllGetClassObject")))
+ {
+ /* failure: the dll did not export DllGetClassObject */
+ ERR("couldn't find function DllGetClassObject in %s\n",
debugstr_w(dllpath));
+ FreeLibrary( hLibrary );
+ hres = CO_E_DLLNOTFOUND;
+ }
+ else
+ {
+ /* OK: get the ClassObject */
+ COMPOBJ_DLLList_Add( hLibrary );
+ return DllGetClassObject(rclsid, iid, ppv);
+ }
+ }
}
/* Next try out of process */
@@ -2154,28 +2168,27 @@
*/
HRESULT WINAPI OleGetAutoConvert(REFCLSID clsidOld, LPCLSID pClsidNew)
{
- HKEY hkey = 0;
- char buf[200];
- WCHAR wbuf[200];
+ static const WCHAR wszAutoConvertTo[] =
{'A','u','t','o','C','o','n','v','e','r','t','T','o',0};
+ HKEY hkey = NULL;
+ WCHAR buf[CHARS_IN_GUID];
DWORD len;
HRESULT res = S_OK;
- sprintf(buf,"CLSID\\");WINE_StringFromCLSID(clsidOld,&buf[6]);
- if (RegOpenKeyA(HKEY_CLASSES_ROOT,buf,&hkey))
+ if (ERROR_SUCCESS != COM_OpenKeyForCLSID(clsidOld, KEY_READ,
&hkey))
{
res = REGDB_E_CLASSNOTREG;
- goto done;
+ goto done;
}
- len = 200;
+
+ len = sizeof(buf);
/* we can just query for the default value of AutoConvertTo key
like that,
without opening the AutoConvertTo key and querying for NULL
(default) */
- if (RegQueryValueA(hkey,"AutoConvertTo",buf,&len))
+ if (RegQueryValueW(hkey, wszAutoConvertTo, buf, &len))
{
res = REGDB_E_KEYMISSING;
- goto done;
+ goto done;
}
- MultiByteToWideChar( CP_ACP, 0, buf, -1, wbuf,
sizeof(wbuf)/sizeof(WCHAR) );
- CLSIDFromString(wbuf,pClsidNew);
+ res = CLSIDFromString(buf, pClsidNew);
done:
if (hkey) RegCloseKey(hkey);
return res;
@@ -2199,27 +2212,26 @@
*/
HRESULT WINAPI CoTreatAsClass(REFCLSID clsidOld, REFCLSID clsidNew)
{
- HKEY hkey = 0;
- char buf[47];
- char szClsidNew[39];
+ static const WCHAR wszAutoTreatAs[] =
{'A','u','t','o','T','r','e','a','t','A','s',0};
+ static const WCHAR wszTreatAs[] =
{'T','r','e','a','t','A','s',0};
+ HKEY hkey = NULL;
+ WCHAR szClsidNew[CHARS_IN_GUID];
HRESULT res = S_OK;
- char auto_treat_as[39];
+ WCHAR auto_treat_as[CHARS_IN_GUID];
LONG auto_treat_as_size = sizeof(auto_treat_as);
CLSID id;
- sprintf(buf,"CLSID\\");WINE_StringFromCLSID(clsidOld,&buf[6]);
- WINE_StringFromCLSID(clsidNew, szClsidNew);
- if (RegOpenKeyA(HKEY_CLASSES_ROOT,buf,&hkey))
+ if (ERROR_SUCCESS != COM_OpenKeyForCLSID(clsidOld, KEY_READ |
KEY_WRITE, &hkey))
{
res = REGDB_E_CLASSNOTREG;
goto done;
}
if (!memcmp( clsidOld, clsidNew, sizeof(*clsidOld) ))
{
- if (!RegQueryValueA(hkey, "AutoTreatAs", auto_treat_as,
&auto_treat_as_size) &&
- !__CLSIDFromStringA(auto_treat_as, &id))
+ if (!RegQueryValueW(hkey, wszAutoTreatAs, auto_treat_as,
&auto_treat_as_size) &&
+ !CLSIDFromString(auto_treat_as, &id))
{
- if (RegSetValueA(hkey, "TreatAs", REG_SZ, auto_treat_as,
strlen(auto_treat_as)+1))
+ if (RegSetValueW(hkey, wszTreatAs, REG_SZ, auto_treat_as,
sizeof(auto_treat_as)))
{
res = REGDB_E_WRITEREGDB;
goto done;
@@ -2227,13 +2239,14 @@
}
else
{
- RegDeleteKeyA(hkey, "TreatAs");
+ RegDeleteKeyW(hkey, wszTreatAs);
goto done;
}
}
- else if (RegSetValueA(hkey, "TreatAs", REG_SZ, szClsidNew,
strlen(szClsidNew)+1))
+ else if (!StringFromGUID2(clsidNew, szClsidNew,
ARRAYSIZE(szClsidNew)) &&
+ !RegSetValueW(hkey, wszTreatAs, REG_SZ, szClsidNew,
sizeof(szClsidNew)))
{
- res = REGDB_E_WRITEREGDB;
+ res = REGDB_E_WRITEREGDB;
goto done;
}
@@ -2260,32 +2273,31 @@
*/
HRESULT WINAPI CoGetTreatAsClass(REFCLSID clsidOld, LPCLSID clsidNew)
{
- HKEY hkey = 0;
- char buf[200], szClsidNew[200];
+ static const WCHAR wszTreatAs[] =
{'T','r','e','a','t','A','s',0};
+ HKEY hkey = NULL;
+ WCHAR szClsidNew[CHARS_IN_GUID];
HRESULT res = S_OK;
LONG len = sizeof(szClsidNew);
FIXME("(%s,%p)\n", debugstr_guid(clsidOld), clsidNew);
- sprintf(buf,"CLSID\\");WINE_StringFromCLSID(clsidOld,&buf[6]);
memcpy(clsidNew,clsidOld,sizeof(CLSID)); /* copy over old value */
- if (RegOpenKeyA(HKEY_CLASSES_ROOT,buf,&hkey))
+ if (COM_OpenKeyForCLSID(clsidOld, KEY_READ, &hkey))
{
res = REGDB_E_CLASSNOTREG;
goto done;
}
- if (RegQueryValueA(hkey, "TreatAs", szClsidNew, &len))
+ if (RegQueryValueW(hkey, wszTreatAs, szClsidNew, &len))
{
res = S_FALSE;
goto done;
}
- res = __CLSIDFromStringA(szClsidNew,clsidNew);
+ res = CLSIDFromString(szClsidNew,clsidNew);
if (FAILED(res))
- FIXME("Failed CLSIDFromStringA(%s), hres
%lx?\n",szClsidNew,res);
+ ERR("Failed CLSIDFromStringA(%s), hres 0x%08lx\n",
debugstr_w(szClsidNew), res);
done:
if (hkey) RegCloseKey(hkey);
return res;
-
}
/***********************************************************************
*******
_____
Modified: trunk/reactos/lib/ole32/compobj_private.h
--- trunk/reactos/lib/ole32/compobj_private.h 2005-08-03 22:31:41 UTC
(rev 17035)
+++ trunk/reactos/lib/ole32/compobj_private.h 2005-08-03 22:31:39 UTC
(rev 17036)
@@ -163,6 +163,7 @@
extern HRESULT WINE_StringFromCLSID(const CLSID *id,LPSTR idstr);
HRESULT WINAPI __CLSIDFromStringA(LPCSTR idstr, CLSID *id);
+DWORD COM_OpenKeyForCLSID(REFCLSID clsid, REGSAM access, HKEY *key);
HRESULT MARSHAL_GetStandardMarshalCF(LPVOID *ppv);
/* Stub Manager */
@@ -256,4 +257,6 @@
extern HINSTANCE OLE32_hInstance; /* FIXME: make static */
+#define CHARS_IN_GUID 39 /* including NULL */
+
#endif /* __WINE_OLE_COMPOBJ_H */
_____
Modified: trunk/reactos/lib/ole32/compositemoniker.c
--- trunk/reactos/lib/ole32/compositemoniker.c 2005-08-03 22:31:41 UTC
(rev 17035)
+++ trunk/reactos/lib/ole32/compositemoniker.c 2005-08-03 22:31:39 UTC
(rev 17036)
@@ -37,7 +37,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(ole);
-const CLSID CLSID_CompositeMoniker = {
+static const CLSID CLSID_CompositeMoniker = {
0x309, 0, 0, {0xC0, 0, 0, 0, 0, 0, 0, 0x46}
};
@@ -46,13 +46,13 @@
/* CompositeMoniker data structure */
typedef struct CompositeMonikerImpl{
- IMonikerVtbl* lpvtbl1; /* VTable relative to the IMoniker
interface.*/
+ const IMonikerVtbl* lpvtbl1; /* VTable relative to the IMoniker
interface.*/
/* The ROT (RunningObjectTable implementation) uses the IROTData
* interface to test whether two monikers are equal. That's why
IROTData
* interface is implemented by monikers.
*/
- IROTDataVtbl* lpvtbl2; /* VTable relative to the IROTData
interface.*/
+ const IROTDataVtbl* lpvtbl2; /* VTable relative to the IROTData
interface.*/
ULONG ref; /* reference counter for this object */
@@ -68,7 +68,7 @@
/* EnumMoniker data structure */
typedef struct EnumMonikerImpl{
- IEnumMonikerVtbl *lpVtbl; /* VTable relative to the IEnumMoniker
interface.*/
+ const IEnumMonikerVtbl *lpVtbl; /* VTable relative to the
IEnumMoniker interface.*/
ULONG ref; /* reference counter for this object */
@@ -1388,7 +1388,7 @@
/***********************************************************************
*********/
/* Virtual function table for the IROTData class
*/
-static IEnumMonikerVtbl VT_EnumMonikerImpl =
+static const IEnumMonikerVtbl VT_EnumMonikerImpl =
{
EnumMonikerImpl_QueryInterface,
EnumMonikerImpl_AddRef,
@@ -1453,7 +1453,7 @@
/* Virtual function table for the CompositeMonikerImpl class which
includes */
/* IPersist, IPersistStream and IMoniker functions.
*/
-static IMonikerVtbl VT_CompositeMonikerImpl =
+static const IMonikerVtbl VT_CompositeMonikerImpl =
{
CompositeMonikerImpl_QueryInterface,
CompositeMonikerImpl_AddRef,
@@ -1482,7 +1482,7 @@
/***********************************************************************
*********/
/* Virtual function table for the IROTData class.
*/
-static IROTDataVtbl VT_ROTDataImpl =
+static const IROTDataVtbl VT_ROTDataImpl =
{
CompositeMonikerROTDataImpl_QueryInterface,
CompositeMonikerROTDataImpl_AddRef,
_____
Modified: trunk/reactos/lib/ole32/datacache.c
--- trunk/reactos/lib/ole32/datacache.c 2005-08-03 22:31:41 UTC (rev
17035)
+++ trunk/reactos/lib/ole32/datacache.c 2005-08-03 22:31:39 UTC (rev
17036)
@@ -93,12 +93,12 @@
/*
* List all interface VTables here
*/
- IDataObjectVtbl* lpvtbl1;
- IUnknownVtbl* lpvtbl2;
- IPersistStorageVtbl* lpvtbl3;
- IViewObject2Vtbl* lpvtbl4;
- IOleCache2Vtbl* lpvtbl5;
- IOleCacheControlVtbl* lpvtbl6;
+ const IDataObjectVtbl* lpvtbl1;
+ const IUnknownVtbl* lpvtbl2;
+ const IPersistStorageVtbl* lpvtbl3;
+ const IViewObject2Vtbl* lpvtbl4;
+ const IOleCache2Vtbl* lpvtbl5;
+ const IOleCacheControlVtbl* lpvtbl6;
/*
* Reference count of this object
@@ -1617,14 +1617,14 @@
/*
* Virtual function tables for the DataCache class.
*/
-static IUnknownVtbl DataCache_NDIUnknown_VTable =
+static const IUnknownVtbl DataCache_NDIUnknown_VTable =
{
DataCache_NDIUnknown_QueryInterface,
DataCache_NDIUnknown_AddRef,
DataCache_NDIUnknown_Release
};
-static IDataObjectVtbl DataCache_IDataObject_VTable =
+static const IDataObjectVtbl DataCache_IDataObject_VTable =
{
DataCache_IDataObject_QueryInterface,
DataCache_IDataObject_AddRef,
@@ -1640,7 +1640,7 @@
DataCache_EnumDAdvise
};
-static IPersistStorageVtbl DataCache_IPersistStorage_VTable =
+static const IPersistStorageVtbl DataCache_IPersistStorage_VTable =
{
DataCache_IPersistStorage_QueryInterface,
DataCache_IPersistStorage_AddRef,
@@ -1654,7 +1654,7 @@
DataCache_HandsOffStorage
};
-static IViewObject2Vtbl DataCache_IViewObject2_VTable =
+static const IViewObject2Vtbl DataCache_IViewObject2_VTable =
{
DataCache_IViewObject2_QueryInterface,
DataCache_IViewObject2_AddRef,
@@ -1668,7 +1668,7 @@
DataCache_GetExtent
};
-static IOleCache2Vtbl DataCache_IOleCache2_VTable =
+static const IOleCache2Vtbl DataCache_IOleCache2_VTable =
{
DataCache_IOleCache2_QueryInterface,
DataCache_IOleCache2_AddRef,
@@ -1682,7 +1682,7 @@
DataCache_DiscardCache
};
-static IOleCacheControlVtbl DataCache_IOleCacheControl_VTable =
+static const IOleCacheControlVtbl DataCache_IOleCacheControl_VTable =
{
DataCache_IOleCacheControl_QueryInterface,
DataCache_IOleCacheControl_AddRef,
_____
Modified: trunk/reactos/lib/ole32/defaulthandler.c
--- trunk/reactos/lib/ole32/defaulthandler.c 2005-08-03 22:31:41 UTC
(rev 17035)
+++ trunk/reactos/lib/ole32/defaulthandler.c 2005-08-03 22:31:39 UTC
(rev 17036)
@@ -70,10 +70,10 @@
/*
* List all interface VTables here
*/
- IOleObjectVtbl* lpvtbl1;
- IUnknownVtbl* lpvtbl2;
- IDataObjectVtbl* lpvtbl3;
- IRunnableObjectVtbl* lpvtbl4;
+ const IOleObjectVtbl* lpvtbl1;
+ const IUnknownVtbl* lpvtbl2;
+ const IDataObjectVtbl* lpvtbl3;
+ const IRunnableObjectVtbl* lpvtbl4;
/*
* Reference count of this object
@@ -325,7 +325,7 @@
/*
* Virtual function tables for the DefaultHandler class.
*/
-static IOleObjectVtbl DefaultHandler_IOleObject_VTable =
+static const IOleObjectVtbl DefaultHandler_IOleObject_VTable =
{
DefaultHandler_QueryInterface,
DefaultHandler_AddRef,
@@ -353,14 +353,14 @@
DefaultHandler_SetColorScheme
};
-static IUnknownVtbl DefaultHandler_NDIUnknown_VTable =
+static const IUnknownVtbl DefaultHandler_NDIUnknown_VTable =
{
DefaultHandler_NDIUnknown_QueryInterface,
DefaultHandler_NDIUnknown_AddRef,
DefaultHandler_NDIUnknown_Release,
};
-static IDataObjectVtbl DefaultHandler_IDataObject_VTable =
+static const IDataObjectVtbl DefaultHandler_IDataObject_VTable =
{
DefaultHandler_IDataObject_QueryInterface,
DefaultHandler_IDataObject_AddRef,
@@ -376,7 +376,7 @@
DefaultHandler_EnumDAdvise
};
-static IRunnableObjectVtbl DefaultHandler_IRunnableObject_VTable =
+static const IRunnableObjectVtbl DefaultHandler_IRunnableObject_VTable
=
{
DefaultHandler_IRunnableObject_QueryInterface,
DefaultHandler_IRunnableObject_AddRef,
_____
Modified: trunk/reactos/lib/ole32/errorinfo.c
--- trunk/reactos/lib/ole32/errorinfo.c 2005-08-03 22:31:41 UTC (rev
17035)
+++ trunk/reactos/lib/ole32/errorinfo.c 2005-08-03 22:31:39 UTC (rev
17036)
@@ -128,9 +128,9 @@
typedef struct ErrorInfoImpl
{
- IErrorInfoVtbl *lpvtei;
- ICreateErrorInfoVtbl *lpvtcei;
- ISupportErrorInfoVtbl *lpvtsei;
+ const IErrorInfoVtbl *lpvtei;
+ const ICreateErrorInfoVtbl *lpvtcei;
+ const ISupportErrorInfoVtbl *lpvtsei;
DWORD ref;
GUID m_Guid;
@@ -140,9 +140,9 @@
DWORD m_dwHelpContext;
} ErrorInfoImpl;
-static IErrorInfoVtbl IErrorInfoImpl_VTable;
-static ICreateErrorInfoVtbl ICreateErrorInfoImpl_VTable;
-static ISupportErrorInfoVtbl ISupportErrorInfoImpl_VTable;
+static const IErrorInfoVtbl IErrorInfoImpl_VTable;
+static const ICreateErrorInfoVtbl ICreateErrorInfoImpl_VTable;
+static const ISupportErrorInfoVtbl ISupportErrorInfoImpl_VTable;
/*
converts an object pointer to This
@@ -303,7 +303,7 @@
return S_OK;
}
-static IErrorInfoVtbl IErrorInfoImpl_VTable =
+static const IErrorInfoVtbl IErrorInfoImpl_VTable =
{
IErrorInfoImpl_QueryInterface,
IErrorInfoImpl_AddRef,
@@ -402,7 +402,7 @@
return S_OK;
}
-static ICreateErrorInfoVtbl ICreateErrorInfoImpl_VTable =
+static const ICreateErrorInfoVtbl ICreateErrorInfoImpl_VTable =
{
ICreateErrorInfoImpl_QueryInterface,
ICreateErrorInfoImpl_AddRef,
@@ -452,7 +452,7 @@
return (IsEqualIID(riid, &This->m_Guid)) ? S_OK : S_FALSE;
}
-static ISupportErrorInfoVtbl ISupportErrorInfoImpl_VTable =
+static const ISupportErrorInfoVtbl ISupportErrorInfoImpl_VTable =
{
ISupportErrorInfoImpl_QueryInterface,
ISupportErrorInfoImpl_AddRef,
_____
Modified: trunk/reactos/lib/ole32/filemoniker.c
--- trunk/reactos/lib/ole32/filemoniker.c 2005-08-03 22:31:41 UTC
(rev 17035)
+++ trunk/reactos/lib/ole32/filemoniker.c 2005-08-03 22:31:39 UTC
(rev 17036)
@@ -46,12 +46,12 @@
/* filemoniker data structure */
typedef struct FileMonikerImpl{
- IMonikerVtbl* lpvtbl1; /* VTable relative to the IMoniker
interface.*/
+ const IMonikerVtbl* lpvtbl1; /* VTable relative to the IMoniker
interface.*/
/* The ROT (RunningObjectTable implementation) uses the IROTData
interface to test whether
* two monikers are equal. That's whay IROTData interface is
implemented by monikers.
*/
- IROTDataVtbl* lpvtbl2; /* VTable relative to the IROTData
interface.*/
+ const IROTDataVtbl* lpvtbl2; /* VTable relative to the IROTData
interface.*/
ULONG ref; /* reference counter for this object */
@@ -182,121 +182,155 @@
* written by FileMonikerImpl_Save
*/
static HRESULT WINAPI
-FileMonikerImpl_Load(IMoniker* iface,IStream* pStm)
+FileMonikerImpl_Load(IMoniker* iface, IStream* pStm)
{
HRESULT res;
- CHAR* filePathA;
- WCHAR* filePathW;
+ CHAR* filePathA = NULL;
+ WCHAR* filePathW = NULL;
ULONG bread;
WORD wbuffer;
- DWORD dwbuffer,length,i,doubleLenHex,doubleLenDec;
+ DWORD dwbuffer, bytesA, bytesW, len;
+ int i;
FileMonikerImpl *This = (FileMonikerImpl *)iface;
TRACE("(%p,%p)\n",iface,pStm);
- /* first WORD is non significative */
+ /* first WORD must be 0 */
res=IStream_Read(pStm,&wbuffer,sizeof(WORD),&bread);
if (bread!=sizeof(WORD) || wbuffer!=0)
{
- ERR("Couldn't read 0 word\n");
- return E_FAIL;
+ WARN("Couldn't read 0 word\n");
+ goto fail;
}
/* read filePath string length (plus one) */
- res=IStream_Read(pStm,&length,sizeof(DWORD),&bread);
+ res=IStream_Read(pStm,&bytesA,sizeof(DWORD),&bread);
if (bread != sizeof(DWORD))
{
- ERR("Couldn't read file string length\n");
- return E_FAIL;
+ WARN("Couldn't read file string length\n");
+ goto fail;
}
/* read filePath string */
- filePathA=HeapAlloc(GetProcessHeap(),0,length);
- res=IStream_Read(pStm,filePathA,length,&bread);
- HeapFree(GetProcessHeap(),0,filePathA);
- if (bread != length)
+ filePathA=HeapAlloc(GetProcessHeap(),0,bytesA);
+ if (!filePathA)
{
- ERR("Couldn't read file path string\n");
- return E_FAIL;
+ res = E_OUTOFMEMORY;
+ goto fail;
}
+ res=IStream_Read(pStm,filePathA,bytesA,&bread);
+ if (bread != bytesA)
+ {
+ WARN("Couldn't read file path string\n");
+ goto fail;
+ }
+
/* read the first constant */
IStream_Read(pStm,&dwbuffer,sizeof(DWORD),&bread);
if (bread != sizeof(DWORD) || dwbuffer != 0xDEADFFFF)
{
- ERR("Couldn't read 0xDEADFFFF constant\n");
- return E_FAIL;
+ WARN("Couldn't read 0xDEADFFFF constant\n");
+ goto fail;
}
- length--;
-
- for(i=0;i<10;i++){
- res=IStream_Read(pStm,&wbuffer,sizeof(WORD),&bread);
- if (bread!=sizeof(WORD) || wbuffer!=0)
+ for(i=0;i<5;i++)
+ {
+ res=IStream_Read(pStm,&dwbuffer,sizeof(DWORD),&bread);
+ if (bread!=sizeof(DWORD) || dwbuffer!=0)
{
- ERR("Couldn't read 0 padding\n");
- return E_FAIL;
+ WARN("Couldn't read 0 padding\n");
+ goto fail;
}
}
- if (length>8)
- length=0;
+ res=IStream_Read(pStm,&dwbuffer,sizeof(DWORD),&bread);
+ if (bread!=sizeof(DWORD))
+ goto fail;
- doubleLenHex=doubleLenDec=2*length;
- if (length > 5)
- doubleLenDec+=6;
+ if (!dwbuffer) /* No W-string */
+ {
+ bytesA--;
+ len=MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS,
filePathA, bytesA, NULL, 0);
+ if (!len)
+ goto fail;
- res=IStream_Read(pStm,&dwbuffer,sizeof(DWORD),&bread);
- if (bread!=sizeof(DWORD) || dwbuffer!=doubleLenDec)
- return E_FAIL;
+ filePathW=HeapAlloc(GetProcessHeap(),0,(len+1)*sizeof(WCHAR));
+ if (!filePathW)
+ {
+ res = E_OUTOFMEMORY;
+ goto fail;
+ }
+ MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, filePathA,
-1, filePathW, len+1);
+ goto succeed;
+ }
- if (length==0)
- return res;
+ if (dwbuffer < 6)
+ goto fail;
+ bytesW=dwbuffer - 6;
+
res=IStream_Read(pStm,&dwbuffer,sizeof(DWORD),&bread);
- if (bread!=sizeof(DWORD) || dwbuffer!=doubleLenHex)
- return E_FAIL;
+ if (bread!=sizeof(DWORD) || dwbuffer!=bytesW)
+ goto fail;
res=IStream_Read(pStm,&wbuffer,sizeof(WORD),&bread);
if (bread!=sizeof(WORD) || wbuffer!=0x3)
- return E_FAIL;
+ goto fail;
- filePathW=HeapAlloc(GetProcessHeap(),0,(length+1)*sizeof(WCHAR));
- filePathW[length]=0;
- res=IStream_Read(pStm,filePathW,doubleLenHex,&bread);
- if (bread!=doubleLenHex) {
- HeapFree(GetProcessHeap(), 0, filePathW);
- return E_FAIL;
+ len=bytesW/sizeof(WCHAR);
+ filePathW=HeapAlloc(GetProcessHeap(),0,(len+1)*sizeof(WCHAR));
+ if(!filePathW)
[truncated at 1000 lines; 1370 more skipped]