diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 7056ca3a0f2..d7eb675c7ec 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -344,11 +344,22 @@ static HRESULT WINAPI xmlnode_put_nodeValue( VARIANT value) { xmlnode *This = impl_from_IXMLDOMNode( iface ); - HRESULT hr = S_FALSE; + HRESULT hr; xmlChar *str = NULL; + VARIANT string_value; TRACE("%p type(%d)\n", This, This->node->type); + VariantInit(&string_value); + hr = VariantChangeType(&string_value, &value, 0, VT_BSTR); + if(FAILED(hr)) + { + VariantClear(&string_value); + WARN("Couldn't convert to VT_BSTR\n"); + return hr; + } + + hr = S_FALSE; /* Document, Document Fragment, Document Type, Element, Entity, Entity Reference, Notation aren't supported. */ switch ( This->node->type ) @@ -359,8 +370,7 @@ static HRESULT WINAPI xmlnode_put_nodeValue( case XML_PI_NODE: case XML_TEXT_NODE: { - str = xmlChar_from_wchar((WCHAR*)V_BSTR(&value)); - + str = xmlChar_from_wchar((WCHAR*)V_BSTR(&string_value)); xmlNodeSetContent(This->node, str); hr = S_OK; break; @@ -370,6 +380,8 @@ static HRESULT WINAPI xmlnode_put_nodeValue( break; } + VariantClear(&string_value); + return hr; } diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index dda9fbb71e5..fa82a8a2f81 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -724,6 +724,30 @@ static void test_domdoc( void ) ok( !lstrcmpW( str, _bstr_("Begin This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n"); SysFreeString(str); + /* test put_data */ + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(szstr1); + r = IXMLDOMText_put_nodeValue(nodetext, var); + ok(r == S_OK, "ret %08x\n", r ); + VariantClear(&var); + + r = IXMLDOMText_get_text(nodetext, &str); + ok(r == S_OK, "ret %08x\n", r ); + ok( !lstrcmpW( str, szstr1 ), "incorrect get_text string\n"); + SysFreeString(str); + + /* test put_data */ + V_VT(&var) = VT_I4; + V_I4(&var) = 99; + r = IXMLDOMText_put_nodeValue(nodetext, var); + ok(r == S_OK, "ret %08x\n", r ); + VariantClear(&var); + + r = IXMLDOMText_get_text(nodetext, &str); + ok(r == S_OK, "ret %08x\n", r ); + ok( !lstrcmpW( str, _bstr_("99") ), "incorrect get_text string\n"); + SysFreeString(str); + IXMLDOMText_Release( nodetext ); }