web上的网页有title: 
              name:
               url:
        First Name:
       Last   Name:
       description:
      有这个要填充。现有程序如下:(这段代码可填充,但是不能根据网页中不同的表单插入不同的内容,如上:title,name,First Name插入的内容都不同。如何根据这些不同的表单的内容插入不同的内容?每次插入的内容不同,所以插入的内容用变量最好,要如何写?)
void CFillDlg::OnButton() 
{
// TODO: Add your control notification handler code hereCoInitialize(NULL);   
SHDocVw::IShellWindowsPtr   m_spSHWinds;   
if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows))   ==   S_OK)   
{   
IDispatchPtr   spDisp;   
long   nCount   =   m_spSHWinds->GetCount();   
for   (long   i   =   0;   i   <   nCount;   i++)   
{   
_variant_t   va(i,   VT_I4);   
spDisp   =   m_spSHWinds->Item(va);   
SHDocVw::IWebBrowser2Ptr   spBrowser(spDisp);   
if   (spBrowser   !=   NULL)   
{   
IDispatchPtr   spDisp;   
if(spBrowser->get_Document(&spDisp)   ==   S_OK   &&   spDisp!=   0   )   
{   
MSHTML::IHTMLDocument2Ptr   spHtmlDocument(spDisp);   
MSHTML::IHTMLElementPtr   spHtmlElement;   
if(spHtmlDocument==NULL)   
continue;   
spHtmlDocument->get_body(&spHtmlElement);   
if(spHtmlDocument==NULL)   
continue;   
HRESULT   hr;   
MSHTML::IHTMLElementCollection*   pColl=NULL;   
hr=spHtmlDocument->get_all(&pColl);   
if(pColl!=NULL&&SUCCEEDED(hr))   
{   
long   lcount   =   0;   
pColl->get_length(&lcount);   
for(int   i=0;i<lcount;i++)   
{   
_variant_t   index;   
index.vt=VT_I4;   
index.intVal=i;   
IDispatchPtr   disp;   
disp=pColl->item(index,index);   
if(disp==NULL)   
hr=E_FAIL;   
else   
{   
MSHTML::IHTMLInputElementPtr   pInput(disp);   
if(pInput)   
{   
BSTR   bstrtype;   
pInput->get_type(&bstrtype);   
//printf(_bstr_t(bstrtype));
if(StrCmpW(bstrtype,L"text")==0)   
{   
pInput->put_value(_bstr_t("添充的文字"));
//printf("fill   a   field\n");   
}   
SysFreeString(bstrtype);   
}   
}   

}   
pColl->Release();   
}   
}   

}   
}   

}   
else     
{   
printf("Shell   Windows   interface   is   not   avilable\n");   
}   
CoUninitialize();}分不够可以再加

解决方案 »

  1.   

    如果你熟悉DOM,熟悉JS,这事儿就好明白多了。
    上面的代码是得到网页内所有元素,判断是否是Input元素而后填充。
    你可以再加个逻辑,判断Input后,再判断Input的name或id属性是什么
    根据不同的属性填不同的值。
      

  2.   

    可不可以帮忙写个,就是不知道是哪个函数,是具体如何写
    有朋友说过是:获取IElement指针,调用put_value
    但是不知道如何写?
    谢谢!
      

  3.   

    你可以再加个逻辑,判断Input后,再判断Input的name或id属性是什么
    -----------------------------
    如何判断Input的name或id属性请帮忙写下完整的代码,谢谢
      

  4.   

    CComQIPtr<IHTMLElement> spElem=pInput;
    ATLASSERT(spElem!=NULL);
    CComVariant ve2;
    spElem->getAttribute(CComBSTR(L"id"),0,&ve2);
    ATLTRACE(L"%s",ve2.bstrVal);我用的ATL,你加ATL的头文件。
      

  5.   

    用我原来的COM怎么写?是不是用get_id来获取表单的title呢
    谢谢!
      

  6.   

    MSHTML::IHTMLInputElementPtr这个接口并没有获取id的函数,
    IHTMLElement有,所以
    CComQIPtr <IHTMLElement>   spElem=pInput;这里的pInput是你上面的变量。
    和你程序是集成在一起的。
      

  7.   

    <input type="text" name="title" value="" size="30" id="title" /><br />
    </p>
    <p class="field">
    <strong>Listing URL:</strong><br />

    <input type="text" name="url" </p>
    <strong>Description:</strong><br />

    <textarea name="description" 如何获取以上HTML中的name标签呢
    用什么函数来获取和用什么函数来判断其name的值不同
      

  8.   

    spElem-> getAttribute(CComBSTR(L"name"),0,&ve2);//这样就是获取name
    ATLTRACE(L"%s",ve2.bstrVal); 
      

  9.   

    id一般更好点,毕竟理论上id是唯一的,不过实际上tag的id属性也是可以重复的。
    ve2.bstrVal的值可以认为就是一个C的字符串了。
    不放心的话,这样
    CString tmp(ve2.bstrVal)
      

  10.   

    请问要加什么头文件(ATL)呢,我是在MFC中写的
    另外这段代码完整插入的写法是如何写呢?
      

  11.   

    1.
    加 atlbase.h2.你仔细看看代码,务求自己看懂先。
    在:
    if(StrCmpW(bstrtype,L"text")==0)      
    {   //这代码是比较input的元素的type是否是text,也就是文字输入框,//加入我的代码
    CComQIPtr <IHTMLElement>   spElem=pInput;
    ATLASSERT(spElem!=NULL);
    CComVariant   ve2;
    spElem-> getAttribute(CComBSTR(L"name"),0,&ve2); //得到了name属性的值了switch(ve2.bstrVal)// 当然c++不能switch字符串,以下是伪码
    {
     case "url":
        pInput-> put_value(_bstr_t("添充的文字")); 
     case "description":
        pInput-> put_value(_bstr_t("添充的文字"));
    }
      

  12.   

    编译出错:
    IHTMLElement未定义,我用的是VC6
    vc98\atl\include\atlbase.h(417) : error C2504: 'IHTMLElement' : base class undefined
            D:\vccode\fill\fillDlg.cpp(292) : see reference to class template instantiation 'ATL::_NoAddRefReleaseOnCComPtr<struct IHTMLElement>' being compiled
    D:\vccode\fill\fillDlg.cpp(292) : error C2039: 'getAttribute' : is not a member of '_NoAddRefReleaseOnCComPtr<struct IHTMLElement>'
      

  13.   

    IHTMLElement这个接口是在mshtml.h文件内定义的,没有可能是你没安sdk。
    什么版本的vc和sdk?
      

  14.   

    vc6.0的
    mshtml的版本是:
    /* File created by MIDL compiler version 3.02.88 */
    /* at Mon Nov 17 12:04:35 1997
     */
      

  15.   

    Visual Studio 6.0英文版mshtml.h
    本来就包含进来了。
      

  16.   

    你试着在IDE里跳到定义,看能跳到不。
    你的sdk是vc带的,太老了,建议你下psdk 2001,这是vc6最后一个能用的sdk。
      

  17.   

    CComQIPtr   <IHTMLElement>       spElem=pInput;我是否可以改为
    MSHTML::IHTMLElement   spElem=pInput;
    那这个呢
    CComVariant       ve2;这样就不用ATL了吧
      

  18.   

    MSDN上介绍的也有这个方法
    奇怪喔
    IHTMLElement::getAttribute Methodhttp://msdn2.microsoft.com/en-us/library/aa752280(VS.85).aspx
      

  19.   

    好像不可以,要不你把工程发给我。
    iamduyu#gmail.com
      

  20.   

    了解了,刚查看了下,
    那个是在.net 2.0新增的函数。
      

  21.   

    工程看了,没有容器,host不了ActiveX的。路漫漫。
    给你做个简单的ATL/WTL的
    http://iamduyu.googlecode.com/files/fill_form.zip
      

  22.   

    没有这个头文件#include "atlres.h"
    exe文件运行只填充对话框,不能填充web喔
      

  23.   

    对话框内是webbrowser控件。
      

  24.   

    IHTMLInputElementPtr title = document3->getElementById(L"title");
    title->put_value(L"sometitle");或者下面的代码:
    CComQIPtr<IHTMLDocument3> spDoc3 = spDoc2;
    CComPtr<IHTMLElement> e;
    spDoc3->getElementById(L"title", &e);
    CComQIPtr<IHTMLInputElement> title = e;
    title->put_value(L"sometitle");
      

  25.   

    我看别的用C#写的是用这些函数,VC++6。0哪些可以用呢Microsoft.mshtml
    mshtml.HTMLDivElementClass
    mshtml.HTMLDivElementClass.get_innerHTML() : String
    mshtml.HTMLDivElementClass.get_innerText() : String
    mshtml.HTMLDocumentClass
    mshtml.HTMLDocumentClass.get_body() : IHTMLElement
    mshtml.HTMLDocumentClass.get_forms() : IHTMLElementCollection
    mshtml.HTMLDocumentClass.getElementsByTagName(String) : IHTMLElementCollection
    mshtml.HTMLFormElementClass
    mshtml.HTMLFormElementClass.get_id() : String
    mshtml.HTMLFormElementClass.get_innerHTML() : String
    mshtml.HTMLFormElementClass.get_name() : String
    mshtml.HTMLFormElementClass.getElementsByTagName(String) : IHTMLElementCollection
    mshtml.HTMLInputElementClass
    mshtml.HTMLInputElementClass.get_id() : String
    mshtml.HTMLInputElementClass.get_name() : String
    mshtml.HTMLInputElementClass.get_type() : String
    mshtml.HTMLInputElementClass.get_value() : String
    mshtml.HTMLInputElementClass.set_value(String) : Void
    mshtml.HTMLTextAreaElementClass
    mshtml.HTMLTextAreaElementClass.get_name() : String
    mshtml.HTMLTextAreaElementClass.set_value(String) : Void
    mshtml.IHTMLElement
    mshtml.IHTMLElement.get_innerHTML() : String
    mshtml.IHTMLElementCollection
    mshtml.IHTMLElementCollection.get_length() : Int32
    mshtml.IHTMLElementCollection.GetEnumerator() : IEnumerator
      

  26.   

    VC可以使用C#中列出的所有内容
      

  27.   

    你的意思是把C#转成VC++
    可是我现在装的是VC6
    另外我没有源程序
    是用 Reflector弄出来的
      

  28.   

    已经包含ATL头文件
    #include "atlbase.h"还要包含什么文件。
      

  29.   

    下载了WTL8也装上了编译时还是出错
      

  30.   

    这个本来就加上去了
    如果直接在我原来的代码上添加
    用什么函数可以得到forms的ID和name呢
    知道这个函数就好办了
    具体是从哪个类继承下来的?
      

  31.   

    http://iamduyu.googlecode.com/files/Fill_IE.zip
    其实已经说得很明白了,你要多去看msdn上IE的二次开发的资料。
      

  32.   

    谢谢,可以了
    那<textarea>
    </textarea>
    这种描述栏要如何判断呢
    一般的forms可以用text判断,如(if(StrCmpW(bstrtype,L"text")==0) )  
    那描述栏呢
    另外要模糊判断ID呢
    因为要插入的网站很多,id的描述有点小差异。有上MSDN查这些函数,但不知道是如何使用,不知道其具体是如何继承关系的(是从哪个类继承下来的)
    可否介绍下如何用MSDN或介绍本书可网址。
    一样的函数使用会查
    但是不知道需要使用具体功能去用哪些函数实现时,就不知道如何查找了,非常谢谢!
      

  33.   

    个人觉得这个用js实现就可以了,何必用这么复杂的,可以参考maxthon使用插件的方法来实现
      

  34.   

    关键我这个是要用C/S架构的,所以JS恐怕派上不用场。另外,为什么这段代码无法插入我用webbrowser控件写的浏览器中的表单?!是不是要增加webbrowser控件什么的消息?PS:我是在对话框中插入和使用webbrowser控件的。wbbrowser控件使用的功能正常。
      

  35.   

    masterz说的方法。
    获取Internet Explorer_Server的窗口句柄
    然后
    ---------------------------------------#include <mshtml.h>
    #include <atlbase.h>
    #include <oleacc.h>// 根据窗口句柄返回一个IHTMLDocument2指针
    // 注意, 
    // 使用IHTMLDocument2指针后需要调用IHTMLDocument2->Release()函数释放该指针
    IHTMLDocument2* GetDocInterface(HWND hWnd)
    {
    if(hWnd == NULL)
    return NULL; HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
    if ( hInst == NULL )
    return NULL; IHTMLDocument2* pDoc2 = NULL;
    CComPtr<IHTMLDocument> spDoc ;
    CComPtr<IDispatch> spDisp ;
    CComQIPtr<IHTMLWindow2> spWin ;
    LRESULT lRes = 0; UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
    ::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
    if(FAILED(lRes))
    return NULL; LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
    if(pfObjectFromLresult == NULL)
    return NULL; lRes = (*pfObjectFromLresult)(lRes, IID_IHTMLDocument, 0, (void**)&spDoc);
    if(FAILED(lRes))
    return NULL; lRes = spDoc->get_Script( &spDisp );
    if(FAILED(lRes))
    return NULL; spWin = spDisp;
    lRes = spWin->get_document( &pDoc2 );
    if(FAILED(lRes))
    return NULL; // pDoc2->put_bgColor(CComVariant("red")); // pDoc2->Release(); //::FreeLibrary(hInst); return pDoc2;
    }