Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

IHTMLDOMNode appendChild return E_INVALIDARG

Posted on 2003-11-09
6
Medium Priority
?
1,490 Views
Last Modified: 2007-12-19
Hi,

I need some help please.
I tried to figure it out, but with no success so far.
Why do I get  E_INVALIDARG   when I try to use the appendChild Function.
This is my source code:


IHTMLElement* pHTMLElement;
IHTMLElement* pNewHTMLElement;
IHTMLDOMNode* pHTMLDOMNode;
IHTMLDOMNode* pNewHTMLDOMNode;
IHTMLDOMNode* pNew2HTMLDOMNode;
IDispatch* pDisp;


   v.vt = VT_BSTR;
   v.bstrVal =  SysAllocString(L"HEAD");

   hResult = pIHTMLElementCollection->tags(v,&pDisp );

   if (hResult == S_OK)

   {
        hResult = pDisp->QueryInterface(IID_IHTMLElementCollection,(void**)&pIHTMLElementCollection);
        if (hResult == S_OK)
        {
             pIHTMLElementCollection->get_length(&lCollectionSize);

             v.vt = VT_I4;
             v.lVal = 0;

             hResult = pIHTMLElementCollection->item(v,v,&pDisp);

             if (hResult == S_OK && pDisp != NULL)
             {
                  hResult = pDisp->QueryInterface(IID_IHTMLElement,(void**)&pHTMLElement);
                  if (hResult == S_OK)
                  {
                       hResult=pHTMLElement->QueryInterface(IID_IHTMLDOMNode,(void**)&pHTMLDOMNode);

                       if (hResult == S_OK)
                       {
                            bstrTemp = SysAllocString(L"BASE");
                            hResult=pIHTMLDocument2->createElement(bstrTemp, &pNewHTMLElement);
                            SysFreeString(bstrTemp);

                            if (hResult == S_OK)
                            {
                                  bstrTemp = SysAllocString(L"href");
                                  v.vt = VT_BSTR;
                                  v.bstrVal =  strWebPageDomain.GetBuffer();

                                 hResult=pNewHTMLElement->setAttribute(bstrTemp, v, 0);

                                 SysFreeString(bstrTemp);

                                 if (hResult == S_OK)
                                 {
                                      hResult=pNewHTMLElement->QueryInterface(IID_IHTMLDOMNode,(void**)&pNewHTMLDOMNode);
                                      if (hResult == S_OK)
                                      {
                                          ***********************************
************************************
                                                hResult =pHTMLDOMNode->appendChild(pNewHTMLDOMNode, &pNew2HTMLDOMNode);
 
                                          ************************************
***********************************
                                        }
                               }

                          }
                     }
              }
           }
        }
      }
      }
    }
0
Comment
Question by:shy_amar
  • 3
6 Comments
 
LVL 49

Expert Comment

by:DanRollins
ID: 9714412
I did not check your code.
If you can use that code to insert a different type of node (say, a <P>) then the problem is probably related to the the fact that the <BASE> tag gets special treatment.  It must be included in the <HEAD> container before any other URLs are accessed.

You could try getElementByTagName to get the HEAD tag (it is a member of the all collection) and then add the node as a child.  Or get its innerHTML and insert the <base>...</base> text.

But I'm not at all certain that that would work... Something would need to be done to make the browser completely refresh the screen since virtually everything on it could change.

=-=-=-=-=-=-=-=-=-=
If you are having trouble inserting other tags, then let me know and I'll check your code.

-- Dan
0
 

Author Comment

by:shy_amar
ID: 9714790
I did try to insert a different tag but I still get the same error code.
Although I don't use the getElementByTagName , I use the  pIHTMLElementCollection->tags(v,&pDisp ) -
the same principle (this is only partial code, but relevant to the problem).

to make is easy for you, I attached the entire function
I would appreciate your help.

HRESULT                  hResult;
VARIANT                  v;
BSTR                  bstrWebPageDomain;
CString                  strWebPageDomain("");
IHTMLElementCollection*      pIHTMLElementCollection;
IHTMLElement*            pHTMLElement;
IHTMLElement*            pNewHTMLElement;
IHTMLDOMNode*            pHTMLDOMNode;
IHTMLDOMNode*            pNewHTMLDOMNode;
IHTMLDOMNode*            pNew2HTMLDOMNode;
IDispatch*                  pDisp;
long                  lCollectionSize;
BOOL                  bIsOK;
BSTR                  bstrTemp;


hResult                 = S_OK;;
pIHTMLElementCollection = NULL;
pHTMLElement           = NULL;
pNewHTMLElement           = NULL;
pHTMLDOMNode           = NULL;
pNewHTMLDOMNode           = NULL;
pNew2HTMLDOMNode           = NULL;
pDisp                 = NULL;
lCollectionSize           = 0;
bIsOK                 = FALSE;
      

hResult =  pIHTMLDocument2->get_domain(&bstrWebPageDomain);
      if (hResult == S_OK)
      {
            strWebPageDomain = bstrWebPageDomain;
            SysFreeString(bstrWebPageDomain);

            hResult = pHiddenIHTMLDocument2->get_all(&pIHTMLElementCollection);
            if (hResult == S_OK)
            {
                  v.vt = VT_BSTR;
                  v.bstrVal =  SysAllocString(L"HEAD");

                  hResult = pIHTMLElementCollection->tags(v,&pDisp );
                  if (hResult == S_OK)
                  {
                        hResult = pDisp->QueryInterface(IID_IHTMLElementCollection, (void**)&pIHTMLElementCollection);
                        if (hResult == S_OK)
                        {
                              pIHTMLElementCollection->get_length(&lCollectionSize);
                                                
                              v.vt      = VT_I4;
                              v.lVal      = 0;
                              
                              hResult = pIHTMLElementCollection->item(v,v,&pDisp);
                              
                              if (hResult == S_OK && pDisp != NULL)
                              {
                                    hResult = pDisp->QueryInterface(IID_IHTMLElement, (void**)&pHTMLElement);
                                    if (hResult == S_OK)
                                    {
                                          hResult = pHTMLElement->QueryInterface(IID_IHTMLDOMNode,(void**)&pHTMLDOMNode);
                              
                                          if (hResult == S_OK)
                                          {
                                                bstrTemp = SysAllocString(L"BASE");
                                                hResult = pIHTMLDocument2->createElement(bstrTemp, &pNewHTMLElement);
                                                SysFreeString(bstrTemp);

                                                if (hResult == S_OK)
                                                {
                                                      
                                                      bstrTemp = SysAllocString(L"href");
                                                      
                                                      v.vt = VT_BSTR;
                                                      v.bstrVal =  strWebPageDomain.GetBuffer();
                                                      
                                                      hResult = pNewHTMLElement->setAttribute(bstrTemp, v, 0);

                                                      SysFreeString(bstrTemp);

                                                      if (hResult == S_OK)
                                                      {
                                                            hResult = pNewHTMLElement->QueryInterface(IID_IHTMLDOMNode,(void**)&pNewHTMLDOMNode);
                                                            if (hResult == S_OK)
                                                            {
                                                                  long lType;
                                                                  pNewHTMLDOMNode->get_nodeType(&lType);
                                                                  
                                                                  if (hResult == S_OK)
                                                                  {
                                                                        pNew2HTMLDOMNode = NULL;
                                                                        hResult = pHTMLDOMNode->appendChild(pNewHTMLDOMNode,&pNew2HTMLDOMNode);
                                                                        if (hResult != S_OK)
                                                                        {
                                                                              int a=0;
                                                                        }
                                                                  }
      else
      {
                                                                  }
                                                            }
                                                            else
                                                            {
                                                                                                                        }
                                                      }
                                                      else
                                                      {
                                                      }

                                                }
                                                else
                                                {
                                                }
                                                
                                                
                                          }
                                          else
                                          {
                                          }
                                    }
                                    else
                                    {
                                    }

                              }
                              else
                              {
                              }
                                    
                              
                        }
                        else
                        {
                        }
                  }
                  else
                  {

                  }

            }
            else
            {
            }
      }
      else
      {
      }
0
 
LVL 49

Accepted Solution

by:
DanRollins earned 2000 total points
ID: 9718817
Here is how I inject elements into an HTML document.  It is much less complicated:
void CDlgWebDlg::OnButton2()
{
      MSHTML::IHTMLDocument2Ptr pDoc= m_ctlBrowser.GetDocument();
      MSHTML::IHTMLElementCollectionPtr pAllElems= pDoc->all;

      long nLength= pAllElems->length;
      for (long j= 0; j<nLength; j++) {
            MSHTML::IHTMLElementPtr pElem= pAllElems->item( _variant_t(j,VT_I4) );
            CString sTag= pElem->getAttribute("tagName",0).bstrVal;
            if ( sTag == "DIV" ) {
                  CString sHtml= pElem->getAttribute(L"innerHTML",0).bstrVal;
                  sHtml.Insert(0,"<B>hi there</B" );
                  pElem->setAttribute(L"innerHTML",_variant_t((LPCSTR)sHtml),0 );
            }
      }
}

=-=-=-=-=-=-=-=-=-=-=-=-=
Note that the innertHTML od the <HEAD> object is documented as being read-only.  When I try
if ( sTag == "HEAD" ) {
      CString sHtml= pElem->getAttribute(L"innerHTML",0).bstrVal;
      sHtml.Insert(0,"<BASE HREF='www.wahtever.com'></BASE" );
      pElem->setAttribute(L"innerHTML",_variant_t((LPCSTR)sHtml),0 );

I also get an error.  I can avoid an error with
if ( sTag == "HEAD" ) {
      HRESULT hr= pElem->insertAdjacentHTML("afterBegin", L"<BASE HREF='http://www.experts-exchange.com'></BASE>");
      CString sHtml= pElem->getAttribute(L"innerHTML",0).bstrVal;

But it seems to have no effect... the
     <IMG SRC="/images/logo.gif">
in my test page does not change.  That is, the browser did not bother to redraw the entire page using the newly-inserted BASE tag.

-- Dan
0
 
LVL 49

Expert Comment

by:DanRollins
ID: 9784182
hi shy_amar,
Do you need more help?  Please communicate.  Thanks!
-- Dan
0
 
LVL 9

Expert Comment

by:tinchos
ID: 10248839
No comment has been added lately, so it's time to clean up this TA.
I will leave the following recommendation for this question in the Cleanup topic area:

Accept: DanRollins {http:#9718817}

Please leave any comments here within the next seven days.
PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!

Tinchos
EE Cleanup Volunteer
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction This article is the first in a series of articles about the C/C++ Visual Studio Express debugger.  It provides a quick start guide in using the debugger. Part 2 focuses on additional topics in breakpoints.  Lastly, Part 3 focuses on th…
  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.

927 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question