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();}分不够可以再加
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();}分不够可以再加
解决方案 »
- 小小学生MFC
- VS05 版本中的问题,在线求解~~~
- 内核模式下的PID 和 TID!
- 在VCWin23空项目中,如何添加一个对话框资源,让他在运行程序时候显示,谢谢!!(初学VC,多多包涵)
- 请问在Win32应用程序中,当用户点击鼠标时如何判断键盘上某键是否被按下?谢谢!!!
- 程序中,有关“重新登陆”的问题
- 可不可以用Excel做报表?
- unexpected end of file while looking for precompiled header directive
- 如何用程序访问局域网上的某一共享文件夹? 有分相送啊!!!
- 用vxd监视进程
- 谁知道在那里下载这些东东 ????
- 如何在工具栏中显示当前时间??
上面的代码是得到网页内所有元素,判断是否是Input元素而后填充。
你可以再加个逻辑,判断Input后,再判断Input的name或id属性是什么
根据不同的属性填不同的值。
有朋友说过是:获取IElement指针,调用put_value
但是不知道如何写?
谢谢!
-----------------------------
如何判断Input的name或id属性请帮忙写下完整的代码,谢谢
ATLASSERT(spElem!=NULL);
CComVariant ve2;
spElem->getAttribute(CComBSTR(L"id"),0,&ve2);
ATLTRACE(L"%s",ve2.bstrVal);我用的ATL,你加ATL的头文件。
谢谢!
IHTMLElement有,所以
CComQIPtr <IHTMLElement> spElem=pInput;这里的pInput是你上面的变量。
和你程序是集成在一起的。
</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的值不同
ATLTRACE(L"%s",ve2.bstrVal);
ve2.bstrVal的值可以认为就是一个C的字符串了。
不放心的话,这样
CString tmp(ve2.bstrVal)
另外这段代码完整插入的写法是如何写呢?
加 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("添充的文字"));
}
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>'
什么版本的vc和sdk?
mshtml的版本是:
/* File created by MIDL compiler version 3.02.88 */
/* at Mon Nov 17 12:04:35 1997
*/
本来就包含进来了。
你的sdk是vc带的,太老了,建议你下psdk 2001,这是vc6最后一个能用的sdk。
MSHTML::IHTMLElement spElem=pInput;
那这个呢
CComVariant ve2;这样就不用ATL了吧
奇怪喔
IHTMLElement::getAttribute Methodhttp://msdn2.microsoft.com/en-us/library/aa752280(VS.85).aspx
iamduyu#gmail.com
那个是在.net 2.0新增的函数。
给你做个简单的ATL/WTL的
http://iamduyu.googlecode.com/files/fill_form.zip
exe文件运行只填充对话框,不能填充web喔
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");
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
可是我现在装的是VC6
另外我没有源程序
是用 Reflector弄出来的
#include "atlbase.h"还要包含什么文件。
如果直接在我原来的代码上添加
用什么函数可以得到forms的ID和name呢
知道这个函数就好办了
具体是从哪个类继承下来的?
其实已经说得很明白了,你要多去看msdn上IE的二次开发的资料。
那<textarea>
</textarea>
这种描述栏要如何判断呢
一般的forms可以用text判断,如(if(StrCmpW(bstrtype,L"text")==0) )
那描述栏呢
另外要模糊判断ID呢
因为要插入的网站很多,id的描述有点小差异。有上MSDN查这些函数,但不知道是如何使用,不知道其具体是如何继承关系的(是从哪个类继承下来的)
可否介绍下如何用MSDN或介绍本书可网址。
一样的函数使用会查
但是不知道需要使用具体功能去用哪些函数实现时,就不知道如何查找了,非常谢谢!
获取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;
}