Made a start of the PropVariantClear function on the hunt for another bug ChangeLog: - Support a few trivial cases in PropVariantClear Rob
Index: wine/dlls/ole32/ole2.c =================================================================== RCS file: /home/wine/wine/dlls/ole32/ole2.c,v retrieving revision 1.39 diff -u -r1.39 ole2.c --- wine/dlls/ole32/ole2.c 7 Jan 2003 20:36:27 -0000 1.39 +++ wine/dlls/ole32/ole2.c 11 Jan 2003 21:07:11 -0000 @@ -541,6 +541,9 @@ /* * Setup the drag n drop tracking window. */ + if (!IsValidInterface((LPUNKNOWN)pDropSource)) + return E_INVALIDARG; + trackerInfo.dataObject = pDataObject; trackerInfo.dropSource = pDropSource; trackerInfo.dwOKEffect = dwOKEffect; Index: wine/dlls/ole32/ole2stubs.c =================================================================== RCS file: /home/wine/wine/dlls/ole32/ole2stubs.c,v retrieving revision 1.28 diff -u -r1.28 ole2stubs.c --- wine/dlls/ole32/ole2stubs.c 7 Jan 2003 20:36:27 -0000 1.28 +++ wine/dlls/ole32/ole2stubs.c 11 Jan 2003 21:07:11 -0000 @@ -25,6 +25,7 @@ #include "winbase.h" #include "winuser.h" #include "ole2.h" +#include "objidl.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(ole); @@ -225,13 +226,42 @@ /*********************************************************************** * PropVariantClear [OLE32.166] */ -HRESULT WINAPI PropVariantClear(void *pvar) /* [in/out] FIXME: PROPVARIANT * */ +HRESULT WINAPI PropVariantClear(PROPVARIANT * pvar) /* [in/out] FIXME: PROPVARIANT * */ { - FIXME("(%p): stub:\n", pvar); + TRACE("(%p)\n", pvar); - *(LPWORD)pvar = 0; - /* sets at least the vt field to VT_EMPTY */ - return E_NOTIMPL; + if (!pvar) + return S_OK; + + switch(pvar->vt) + { + case VT_BSTR: + CoTaskMemFree(pvar->u.bstrVal); + break; + case VT_STREAM: + case VT_STREAMED_OBJECT: + case VT_STORAGE: + case VT_STORED_OBJECT: + IUnknown_Release((LPUNKNOWN)pvar->u.pStream); + break; + case VT_CLSID: + case VT_CF: + case VT_LPSTR: + case VT_LPWSTR: + case VT_BLOB: + case VT_BLOB_OBJECT: + FIXME("Don't know what to do for variant type %d\n", pvar->vt); + default: + if (pvar->vt && VT_VECTOR) + { + FIXME("Need to recursively destroy elements in vector\n"); +// SafeArrayDestroy(pvar->u.caub); + } + } + + ZeroMemory(pvar, sizeof(PROPVARIANT)); + + return S_OK; }