diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index dc7399b..7672bba 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -520,7 +520,7 @@
     long *len)
 {
     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( (IXMLDOMNode*)This->node );
+    xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node );
     xmlChar *pContent;
     long nLength = 0;
 
@@ -546,7 +546,7 @@
     long offset, long count, BSTR *p)
 {
     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( (IXMLDOMNode*)This->node );
+    xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node );
     xmlChar *pContent;
     long nLength = 0;
     HRESULT hr = S_FALSE;
@@ -591,7 +591,7 @@
     BSTR p)
 {
     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( (IXMLDOMNode*)This->node );
+    xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node );
     xmlChar *pContent;
     HRESULT hr = S_FALSE;
 
@@ -601,7 +601,7 @@
     if(p == NULL || SysStringLen(p) == 0)
         return S_OK;
 
-    pContent = xmlChar_from_wchar( (WCHAR*)p );
+    pContent = xmlChar_from_wchar( p );
     if(pContent)
     {
         if(xmlTextConcat(pDOMNode->node, pContent, SysStringLen(p) ) == 0)
@@ -621,7 +621,7 @@
     long offset, BSTR p)
 {
     domcdata *This = impl_from_IXMLDOMCDATASection( iface );
-    xmlnode *pDOMNode = impl_from_IXMLDOMNode( (IXMLDOMNode*)This->node );
+    xmlnode *pDOMNode = impl_from_IXMLDOMNode( This->node );
     xmlChar *pXmlContent;
     BSTR sNewString;
     HRESULT hr = S_FALSE;
@@ -667,7 +667,7 @@
 
             sNewString[nLengthP + nLength] = 0;
 
-            str = xmlChar_from_wchar((WCHAR*)sNewString);
+            str = xmlChar_from_wchar(sNewString);
             if(str)
             {
                 xmlNodeSetContent(pDOMNode->node, str);
diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c
index 20781a1..1950b52 100644
--- a/dlls/msxml3/comment.c
+++ b/dlls/msxml3/comment.c
@@ -595,7 +595,7 @@
     if(p == NULL || SysStringLen(p) == 0)
         return S_OK;
 
-    pContent = xmlChar_from_wchar( (WCHAR*)p );
+    pContent = xmlChar_from_wchar( p );
     if(pContent)
     {
         /* Older versions of libxml < 2.6.27 didn't correctly support
@@ -675,7 +675,7 @@
 
             sNewString[nLengthP + nLength] = 0;
 
-            str = xmlChar_from_wchar((WCHAR*)sNewString);
+            str = xmlChar_from_wchar(sNewString);
             if(str)
             {
                 xmlNodeSetContent(pDOMNode->node, str);
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 49f18cc..a50b4e9 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -459,11 +459,11 @@
     }
     else if (IsEqualGUID(&IID_IPersistStream, riid))
     {
-        *ppvObject = (IPersistStream*)&(This->lpvtblIPersistStream);
+        *ppvObject = &(This->lpvtblIPersistStream);
     }
     else if (IsEqualGUID(&IID_IObjectWithSite, riid))
     {
-        *ppvObject = (IObjectWithSite*)&(This->lpvtblIObjectWithSite);
+        *ppvObject = &(This->lpvtblIObjectWithSite);
     }
     else if( IsEqualGUID( riid, &IID_ISupportErrorInfo ))
     {
@@ -1041,7 +1041,7 @@
 
     TRACE("%p->(%s,%p)\n", iface, debugstr_w(tagname), element);
 
-    xml_name = xmlChar_from_wchar((WCHAR*)tagname);
+    xml_name = xmlChar_from_wchar(tagname);
     xmlnode = xmlNewDocNode(get_doc(This), NULL, xml_name, NULL);
     xmldoc_add_orphan(xmlnode->doc, xmlnode);
 
@@ -1098,7 +1098,7 @@
 
     *text = NULL;
 
-    xml_content = xmlChar_from_wchar((WCHAR*)data);
+    xml_content = xmlChar_from_wchar(data);
     xmlnode = xmlNewText(xml_content);
     HeapFree(GetProcessHeap(), 0, xml_content);
 
@@ -1130,7 +1130,7 @@
 
     *comment = NULL;
 
-    xml_content = xmlChar_from_wchar((WCHAR*)data);
+    xml_content = xmlChar_from_wchar(data);
     xmlnode = xmlNewComment(xml_content);
     HeapFree(GetProcessHeap(), 0, xml_content);
 
@@ -1162,7 +1162,7 @@
 
     *cdata = NULL;
 
-    xml_content = xmlChar_from_wchar((WCHAR*)data);
+    xml_content = xmlChar_from_wchar(data);
     xmlnode = xmlNewCDataBlock(get_doc( This ), xml_content, strlen( (char*)xml_content) );
     HeapFree(GetProcessHeap(), 0, xml_content);
 
@@ -1197,8 +1197,8 @@
     if(!target || lstrlenW(target) == 0)
         return E_FAIL;
 
-    xml_target = xmlChar_from_wchar((WCHAR*)target);
-    xml_content = xmlChar_from_wchar((WCHAR*)data);
+    xml_target = xmlChar_from_wchar(target);
+    xml_content = xmlChar_from_wchar(data);
 
     xmlnode = xmlNewDocPI(get_doc(This), xml_target, xml_content);
     xmldoc_add_orphan(xmlnode->doc, xmlnode);
@@ -1232,7 +1232,7 @@
 
     *attribute = NULL;
 
-    xml_name = xmlChar_from_wchar((WCHAR*)name);
+    xml_name = xmlChar_from_wchar(name);
     xmlnode = (xmlNode *)xmlNewProp(NULL, xml_name, NULL);
     HeapFree(GetProcessHeap(), 0, xml_name);
 
@@ -1264,7 +1264,7 @@
 
     *entityRef = NULL;
 
-    xml_name = xmlChar_from_wchar((WCHAR*)name);
+    xml_name = xmlChar_from_wchar(name);
     xmlnode = xmlNewReference(get_doc( This ), xml_name );
     HeapFree(GetProcessHeap(), 0, xml_name);
 
@@ -1339,7 +1339,7 @@
 
     TRACE("node_type %d\n", node_type);
 
-    xml_name = xmlChar_from_wchar((WCHAR*)name);
+    xml_name = xmlChar_from_wchar(name);
 
     switch(node_type)
     {
@@ -2279,7 +2279,7 @@
     if (FAILED(hr))
         return NULL;
 
-    return (IUnknown*)pObj;
+    return pObj;
 }
 
 #else
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 69601e3..7baef30 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -345,7 +345,7 @@
     case XML_PI_NODE:
     case XML_TEXT_NODE:
       {
-        str = xmlChar_from_wchar((WCHAR*)V_BSTR(&string_value));
+        str = xmlChar_from_wchar(V_BSTR(&string_value));
         xmlNodeSetContent(This->node, str);
         HeapFree(GetProcessHeap(),0,str);
         hr = S_OK;
@@ -904,7 +904,7 @@
         break;
     }
 
-    str = xmlChar_from_wchar((WCHAR*)text);
+    str = xmlChar_from_wchar(text);
 
     /* Escape the string. */
     str2 = xmlEncodeEntitiesReentrant(This->node->doc, str);
@@ -1060,7 +1060,7 @@
     {
         xmlNsPtr pNS = NULL;
         xmlAttrPtr pAttr = NULL;
-        xmlChar* str = xmlChar_from_wchar((WCHAR*)dataTypeName);
+        xmlChar* str = xmlChar_from_wchar(dataTypeName);
 
         pAttr = xmlHasNsProp(This->node, (xmlChar*)"dt",
                             (xmlChar*)"urn:schemas-microsoft-com:datatypes");
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 17a3334..90600eb 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -457,9 +457,8 @@
 {
     saxattributes *This = impl_from_IVBSAXAttributes( iface );
     return ISAXAttributes_getIndexFromName(
-            (ISAXAttributes*)&This->lpSAXAttributesVtbl,
-            (const WCHAR*)uri, SysStringLen(uri),
-            (const WCHAR*)localName, SysStringLen(localName), index);
+            (ISAXAttributes*)&This->lpSAXAttributesVtbl, uri, SysStringLen(uri),
+            localName, SysStringLen(localName), index);
 }
 
 static HRESULT WINAPI ivbsaxattributes_getIndexFromQName(
@@ -469,8 +468,8 @@
 {
     saxattributes *This = impl_from_IVBSAXAttributes( iface );
     return ISAXAttributes_getIndexFromQName(
-            (ISAXAttributes*)&This->lpSAXAttributesVtbl,
-            (const WCHAR*)QName, SysStringLen(QName), index);
+            (ISAXAttributes*)&This->lpSAXAttributesVtbl, QName,
+            SysStringLen(QName), index);
 }
 
 static HRESULT WINAPI ivbsaxattributes_getType(
@@ -494,10 +493,8 @@
     int len;
     saxattributes *This = impl_from_IVBSAXAttributes( iface );
     return ISAXAttributes_getTypeFromName(
-            (ISAXAttributes*)&This->lpSAXAttributesVtbl,
-            (const WCHAR*)uri, SysStringLen(uri),
-            (const WCHAR*)localName, SysStringLen(localName),
-            (const WCHAR**)type, &len);
+            (ISAXAttributes*)&This->lpSAXAttributesVtbl, uri, SysStringLen(uri),
+            localName, SysStringLen(localName), (const WCHAR**)type, &len);
 }
 
 static HRESULT WINAPI ivbsaxattributes_getTypeFromQName(
@@ -508,9 +505,8 @@
     int len;
     saxattributes *This = impl_from_IVBSAXAttributes( iface );
     return ISAXAttributes_getTypeFromQName(
-            (ISAXAttributes*)&This->lpSAXAttributesVtbl,
-            (const WCHAR*)QName, SysStringLen(QName),
-            (const WCHAR**)type, &len);
+            (ISAXAttributes*)&This->lpSAXAttributesVtbl, QName,
+            SysStringLen(QName), (const WCHAR**)type, &len);
 }
 
 static HRESULT WINAPI ivbsaxattributes_getValue(
@@ -534,10 +530,8 @@
     int len;
     saxattributes *This = impl_from_IVBSAXAttributes( iface );
     return ISAXAttributes_getValueFromName(
-            (ISAXAttributes*)&This->lpSAXAttributesVtbl,
-            (const WCHAR*)uri, SysStringLen(uri),
-            (const WCHAR*)localName, SysStringLen(localName),
-            (const WCHAR**)value, &len);
+            (ISAXAttributes*)&This->lpSAXAttributesVtbl, uri, SysStringLen(uri),
+            localName, SysStringLen(localName), (const WCHAR**)value, &len);
 }
 
 static HRESULT WINAPI ivbsaxattributes_getValueFromQName(
@@ -548,9 +542,8 @@
     int len;
     saxattributes *This = impl_from_IVBSAXAttributes( iface );
     return ISAXAttributes_getValueFromQName(
-            (ISAXAttributes*)&This->lpSAXAttributesVtbl,
-            (const WCHAR*)QName, SysStringLen(QName),
-            (const WCHAR**)value, &len);
+            (ISAXAttributes*)&This->lpSAXAttributesVtbl, QName,
+            SysStringLen(QName), (const WCHAR**)value, &len);
 }
 
 static const struct IVBSAXAttributesVtbl ivbsaxattributes_vtbl =
@@ -1329,7 +1322,7 @@
     len = MultiByteToWideChar(CP_UNIXCP, 0, message, -1, NULL, 0);
     wszError = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len);
     if(wszError)
-        MultiByteToWideChar(CP_UNIXCP, 0, message, -1, (LPWSTR)wszError, len);
+        MultiByteToWideChar(CP_UNIXCP, 0, message, -1, wszError, len);
 
     if(This->vbInterface)
     {
@@ -2031,7 +2024,7 @@
             hr = SafeArrayGetUBound(V_ARRAY(&varInput), 1, &uBound);
             if(hr != S_OK) break;
             dataRead = (uBound-lBound)*SafeArrayGetElemsize(V_ARRAY(&varInput));
-            hr = SafeArrayAccessData(V_ARRAY(&varInput), (void**)&pSAData);
+            hr = SafeArrayAccessData(V_ARRAY(&varInput), &pSAData);
             if(hr != S_OK) break;
             hr = internal_parseBuffer(This, pSAData, dataRead, vbInterface);
             SafeArrayUnaccessData(V_ARRAY(&varInput));
@@ -2267,7 +2260,7 @@
     }
     else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
     {
-        *ppvObject = (ISAXXMLReader*)&This->lpSAXXMLReaderVtbl;
+        *ppvObject = &This->lpSAXXMLReaderVtbl;
     }
     else
     {
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index 54ffe93..426fe36 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -546,7 +546,7 @@
     CreateStreamOnHGlobal(NULL, TRUE, &iStream);
     liSize.QuadPart = strlen(szTestXML);
     IStream_SetSize(iStream, liSize);
-    IStream_Write(iStream, (void const*)szTestXML, strlen(szTestXML), &bytesWritten);
+    IStream_Write(iStream, szTestXML, strlen(szTestXML), &bytesWritten);
     liPos.QuadPart = 0;
     IStream_Seek(iStream, liPos, STREAM_SEEK_SET, NULL);
     V_VT(&var) = VT_UNKNOWN|VT_DISPATCH;
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index c39fd07..4d78fdd 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -603,7 +603,7 @@
     if(p == NULL || SysStringLen(p) == 0)
         return S_OK;
 
-    pContent = xmlChar_from_wchar( (WCHAR*)p );
+    pContent = xmlChar_from_wchar( p );
     if(pContent)
     {
         if(xmlTextConcat(pDOMNode->node, pContent, SysStringLen(p) ) == 0)
@@ -669,7 +669,7 @@
 
             sNewString[nLengthP + nLength] = 0;
 
-            str = xmlChar_from_wchar((WCHAR*)sNewString);
+            str = xmlChar_from_wchar(sNewString);
             if(str)
             {
                 xmlNodeSetContent(pDOMNode->node, str);
diff --git a/dlls/msxml3/xmldoc.c b/dlls/msxml3/xmldoc.c
index fb653ad..ea2d062 100644
--- a/dlls/msxml3/xmldoc.c
+++ b/dlls/msxml3/xmldoc.c
@@ -86,7 +86,7 @@
     else if (IsEqualGUID(&IID_IPersistStreamInit, riid) ||
              IsEqualGUID(&IID_IPersistStream, riid))
     {
-        *ppvObject = (IPersistStreamInit *)&(This->lpvtblIPersistStreamInit);
+        *ppvObject = &(This->lpvtblIPersistStreamInit);
     }
     else
     {
diff --git a/dlls/msxml3/xmlelem.c b/dlls/msxml3/xmlelem.c
index 0105a0a..97e3429 100644
--- a/dlls/msxml3/xmlelem.c
+++ b/dlls/msxml3/xmlelem.c
@@ -516,7 +516,7 @@
     }
     else if (IsEqualGUID(riid, &IID_IEnumVARIANT))
     {
-        *ppvObject = (IEnumVARIANT *)&(This->lpvtblIEnumVARIANT);
+        *ppvObject = &(This->lpvtblIEnumVARIANT);
     }
     else
     {
