Prev: No stack shown while remote debugging a crash
Next: Detecting Memory leak in Visual Studio (Debug mode)
From: Jingcheng on 4 May 2010 03:22 IHTMLInputElement::put_value doesn't set editbox value? I want to set a the editbox in a html-form. IHTMLInputElement::put_value returns S_OK, but the text of the editbox is not set, instead it's just cleared. Can you please help me take a look? The following is my C++ code: CString filename = _T("C:\\temp\\test.htm"); _variant_t varFlags(0L); _variant_t varMissing(0L); m_browser.Navigate(filename, &varFlags, &varMissing, &varMissing, &varMissing); LPUNKNOWN lpUnk = m_browser.GetControlUnknown(); IWebBrowser2Ptr ipWebCtrl(lpUnk); VARIANT_BOOL bBusy = VARIANT_TRUE; while (bBusy == VARIANT_TRUE) ipWebCtrl->get_Busy(&bBusy); IDispatchPtr ipDispatch; HRESULT hr = ipWebCtrl->get_Document(&ipDispatch); IHTMLDocument2Ptr ipHtmlDoc2(ipDispatch); if (!ipHtmlDoc2) return; IHTMLElementCollectionPtr ipElements; ipHtmlDoc2->get_all(&ipElements); if (!ipElements) return; long count = 0; ipElements->get_length(&count); for(long i = 0; i < count; i++) { LPDISPATCH lpItem; ipElements->item(CComVariant(i), CComVariant(i), &lpItem); IHTMLInputElementPtr ipInput(lpItem); if(!ipInput) continue; // Edit-Field? BSTR bstrType; ipInput->get_type(&bstrType); if (CString(bstrType) == "text") { // Fill in Text CString sTemp (_T("TestVal")); BSTR bstrNewValue = sTemp.AllocSysString (); ipInput->put_value (bstrNewValue); SysFreeString(bstrNewValue); } } The following is my test.htm: <html> <head> </head> <body> <script language="JScript"><!-- function GoNext() { id = document.all.userID.value; window.external.GoNext("$#pageName:#UserIDPage.htm$#userID:#" + id + "$#"); } //--></script> <table border="0" width="60%" align="center"> <tr> <td width="100%"> <form> <p><input type="text" name="myEditBox" size="20"> Edit</p> </form> <form> <p><input type="checkbox" name="myCheck1" value="ON"> Chk1 <input type="checkbox" name="myCheck2" value="ON" checked>Chk2 <input type="checkbox" name="myCheck3" value="ON">Chk3</p> </form> <form"> <p><input type="radio" value="V1" checked name="myRadio"> Op1 <input type="radio" name="myRadio" value="V2"> Op2 <input type="radio" name="myRadio" value="V3">Op3</ p> </form> <form> <p><select size="1" name="myDropDown"> <option selected>Sel 1</option> <option>Sel 2</option> <option>Sel 3</option> </select> Sel</p> </form> <form> <p align="center"><input type="text" name="userID" size="20"></p> </form> <form> <p align="center"><input type="button" onclick="GoNext();" value="Next >>" name="NextBtn"></p> </form> </td> </tr> </table> </body> </html>
From: Hector Santos on 4 May 2010 05:04
Two things: 1) You need to wait until the DocumentComplete() before you edit it. So you would you edit in the OnDocumentComplete() handler for the web component. 2) I presume the control element you wish to change is this? <input type="text" name="myEditBox" size="20"> ??? If so, you don't look for "text", you normally look for the element attribute id <INPUT id="myEditBoxId"> class <INPUT class"colorClass" ...> tagName <INPUT> The typical way is to use the element id attribute: <input id="myEditboxId" type="text" name="myEditBox" size="20"> and try to use an easy HTML interface like IHTMLDocument3 that allows you to use the function: IHTMLDocument3::getElementById(idName) which is what JavaScript programmers uses to find elements in DOM. While you can have a collection of the same id's, that is generally bad html/javascript programming since the above POWERFUL function only return one element. via C/C++, you would add this to your DocumentComplete() handler: HRESULT hr; CComQIPtr<IHTMLDocument3> dom = m_web.get_Document(); if (dom != NULL) { TRACE("GOT DOM!\n"); } CComPtr<IHTMLElement> pElem = 0; CComBSTR bs = "myEditBoxId"; hr = dom->getElementById(bs,&pElem); if (SUCCEEDED(hr) && pElem != NULL) { TRACE("GOT IT!\n"); CString sTemp (_T("TestVal")); BSTR bstrNewValue = sTemp.AllocSysString (); pElem->put_innerText(bstrNewValue); SysFreeString(bstrNewValue); // add some color pElem->put_className(L"clRed"); } For adding the color class, add this to your <HEAD></HEAD> block: <style> ..clRed { color: red; font-weight: bold;} </style> -- HLS Jingcheng wrote: > IHTMLInputElement::put_value doesn't set editbox value? > > > I want to set a the editbox in a html-form. > IHTMLInputElement::put_value returns S_OK, but the text of the > editbox is not set, instead it's just cleared. Can you please help me > take a look? > > The following is my C++ code: > > CString filename = _T("C:\\temp\\test.htm"); > > _variant_t varFlags(0L); > _variant_t varMissing(0L); > m_browser.Navigate(filename, &varFlags, &varMissing, &varMissing, > &varMissing); > > LPUNKNOWN lpUnk = m_browser.GetControlUnknown(); > IWebBrowser2Ptr ipWebCtrl(lpUnk); > > VARIANT_BOOL bBusy = VARIANT_TRUE; > while (bBusy == VARIANT_TRUE) > ipWebCtrl->get_Busy(&bBusy); > > IDispatchPtr ipDispatch; > HRESULT hr = ipWebCtrl->get_Document(&ipDispatch); > > IHTMLDocument2Ptr ipHtmlDoc2(ipDispatch); > if (!ipHtmlDoc2) > return; > > IHTMLElementCollectionPtr ipElements; > ipHtmlDoc2->get_all(&ipElements); > > if (!ipElements) > return; > > long count = 0; > ipElements->get_length(&count); > > for(long i = 0; i < count; i++) > { > LPDISPATCH lpItem; > ipElements->item(CComVariant(i), CComVariant(i), &lpItem); > > IHTMLInputElementPtr ipInput(lpItem); > if(!ipInput) > continue; > > // Edit-Field? > BSTR bstrType; > ipInput->get_type(&bstrType); > if (CString(bstrType) == "text") > { // Fill in Text > CString sTemp (_T("TestVal")); > BSTR bstrNewValue = sTemp.AllocSysString (); > ipInput->put_value (bstrNewValue); > SysFreeString(bstrNewValue); > } > } > > The following is my test.htm: > > <html> > > <head> > </head> > > <body> > > <script language="JScript"><!-- > function GoNext() > { > id = document.all.userID.value; > window.external.GoNext("$#pageName:#UserIDPage.htm$#userID:#" + id + > "$#"); > } > //--></script> > > <table border="0" width="60%" align="center"> > <tr> > <td width="100%"> > > <form> > <p><input type="text" name="myEditBox" size="20"> Edit</p> > </form> > <form> > <p><input type="checkbox" name="myCheck1" value="ON"> > Chk1 > <input type="checkbox" name="myCheck2" value="ON" > checked>Chk2 > <input type="checkbox" name="myCheck3" value="ON">Chk3</p> > </form> > <form"> > <p><input type="radio" value="V1" checked name="myRadio"> Op1 > <input type="radio" name="myRadio" value="V2"> > Op2 <input type="radio" name="myRadio" value="V3">Op3</ > p> > </form> > <form> > <p><select size="1" name="myDropDown"> > <option selected>Sel 1</option> > <option>Sel 2</option> > <option>Sel 3</option> > </select> Sel</p> > </form> > > <form> > <p align="center"><input type="text" name="userID" size="20"></p> > </form> > > <form> > <p align="center"><input type="button" onclick="GoNext();" > value="Next >>" name="NextBtn"></p> > </form> > > </td> > </tr> > </table> > > </body> > > </html> -- HLS |