msxml3: Fix putProperty() for declaration handler.
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index e74967e..fca390a 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -2244,25 +2244,45 @@
     {
         if(This->isParsing) return E_FAIL;
 
-        if(V_UNKNOWN(&value))
+        switch (V_VT(&value))
         {
-            if(vbInterface)
-                IVBSAXDeclHandler_AddRef((IVBSAXDeclHandler*)V_UNKNOWN(&value));
+        case VT_EMPTY:
+            if (vbInterface)
+            {
+                if (This->vbdeclHandler)
+                {
+                    IVBSAXDeclHandler_Release(This->vbdeclHandler);
+                    This->vbdeclHandler = NULL;
+                }
+            }
             else
-                ISAXDeclHandler_AddRef((ISAXDeclHandler*)V_UNKNOWN(&value));
-        }
-        if((vbInterface && This->vbdeclHandler)
-                || (!vbInterface && This->declHandler))
-        {
-            if(vbInterface)
-                IVBSAXDeclHandler_Release(This->vbdeclHandler);
+                if (This->declHandler)
+                {
+                    ISAXDeclHandler_Release(This->declHandler);
+                    This->declHandler = NULL;
+                }
+            break;
+        case VT_UNKNOWN:
+            if (V_UNKNOWN(&value)) IUnknown_AddRef(V_UNKNOWN(&value));
+
+            if ((vbInterface && This->vbdeclHandler) ||
+               (!vbInterface && This->declHandler))
+            {
+                if (vbInterface)
+                    IVBSAXDeclHandler_Release(This->vbdeclHandler);
+                else
+                    ISAXDeclHandler_Release(This->declHandler);
+            }
+
+            if (vbInterface)
+                This->vbdeclHandler = (IVBSAXDeclHandler*)V_UNKNOWN(&value);
             else
-                ISAXDeclHandler_Release(This->declHandler);
+                This->declHandler = (ISAXDeclHandler*)V_UNKNOWN(&value);
+            break;
+        default:
+            return E_INVALIDARG;
         }
-        if(vbInterface)
-            This->vbdeclHandler = (IVBSAXDeclHandler*)V_UNKNOWN(&value);
-        else
-            This->declHandler = (ISAXDeclHandler*)V_UNKNOWN(&value);
+
         return S_OK;
     }
 
@@ -2358,6 +2378,14 @@
         return S_OK;
     }
 
+    if (!memcmp(PropertyDeclHandlerW, prop, sizeof(PropertyDeclHandlerW)))
+    {
+        V_VT(value) = VT_UNKNOWN;
+        V_UNKNOWN(value) = vb ? (IUnknown*)This->vbdeclHandler : (IUnknown*)This->declHandler;
+        if (V_UNKNOWN(value)) IUnknown_AddRef(V_UNKNOWN(value));
+        return S_OK;
+    }
+
     FIXME("(%p)->(%s) unsupported property\n", This, debugstr_w(prop));
 
     return E_NOTIMPL;