描述:
如何让 atl activex 获得网页的内容?在线等待,来者有分!
有选择的获得网页的内容,有那些方法?
给点提示、资料。
解决方案1:
CAtlHttpClient
CAtlNavigateData
如果你想找出具体的文本,可以对 m_HtmlPageCode进行分析,
给你一段代码看看吧
CoInitialize( NULL );
1. HWND hwnd = HWND GetActiveInputHandle();
2. IHTMLDocument2* pDoc2 = GetDocInterface(hwnd) ;
3. 将网页中textbox的name是controlname的内容提取出来
CString s = PageName(GetDocInterface(hwnd),textboxname);
CoUninitialize();
// 获得当前系统的输入焦点
HWND GetActiveInputHandle()
{
HWND winHld, focusld;
DWORD threadID;
winHld = GetForegroundWindow();
threadID = GetWindowThreadProcessId(winHld, 0);
AttachThreadInput(GetCurrentThreadId(), threadID, TRUE);
focusld = GetFocus();
AttachThreadInput(GetCurrentThreadId(), threadID, FALSE);
return focusld;
}
IHTMLDocument2* GetDocInterface(HWND hWnd)
{
// 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
IHTMLDocument2* pDoc2=NULL;
if ( hInst != NULL ){
if ( hWnd != NULL ){
CComPtr<IHTMLDocument> spDoc=NULL;
LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL ){
HRESULT hr;
hr=pfObjectFromLresult(lRes,IID_IHTMLDocument,0,(void**)&spDoc);
if ( SUCCEEDED(hr) ){
CComPtr<IDispatch> spDisp;
CComQIPtr<IHTMLWindow2> spWin;
spDoc->get_Script( &spDisp );
spWin = spDisp;
spWin->get_document( &pDoc2 );
}
}
}
::FreeLibrary(hInst);
}
else{//如果没有安装MSAA
AfxMessageBox(_T("请您安装Microsoft Active Accessibility"));
}
return pDoc2;
}
CString PageName(IHTMLDocument2 *pDoc2 , char* controlname)
{
//-------------------------------------
if(pDoc2==NULL)
return "";
//声明一个IHTMLElement接口指针
CComPtr<IHTMLElement> pElement;
CComPtr<IHTMLElementCollection> pElementCollection;
IDispatch * Idisp;
IHTMLInputTextElement * input;
CComBSTR type;
CComBSTR name;
CString pwname = "";
HRESULT hr=pDoc2->get_all(&pElementCollection);
long n;
pElementCollection->get_length(&n);
for(long i=0;i<n;i++)
{
_variant_t d = i;
hr = pElementCollection->item(d,d,&Idisp);
if(SUCCEEDED(hr))
{
hr = Idisp->QueryInterface(IID_IHTMLInputTextElement,(void**)&input);
if(SUCCEEDED(hr))
{
hr = input->get_name(&name);
if(SUCCEEDED(hr))
{
if(name==controlname)
{
CComBSTR ppw;
input->get_value(&ppw);
pwname = ppw;
}
}
}
}
}
pDoc2->Release();
return pwname;
}
up
解决方案4: CAtlHttpClient client;
CAtlNavigateData navData;
char* m_HtmlPageCode = 0;
if(client.Navigate(_T(http://www.163.com"),&navData))
{
char* head = 0;
if (client.GetStatus() == 200) // 200 = successful HTTP transaction
{
m_HtmlPageCode = new char[client.GetBodyLength()+1];
memcpy(m_HtmlPageCode, client.GetBody(),client.GetBodyLength());
m_HtmlPageCode[client.GetBodyLength()] = 0;
delete [] head;
}
}
m_HtmlPageCode//最有网页源码字符串
我也在做此类项目,共同学习
我做的一个例子是把信息放到textbox框,通过DCOM获得
解决方案6: 我建议你用winInet来写
CString CWebSite::GetWebPage(const CString& Url,bool &bSuccess)
{
HINTERNET hHttpFile;
char szSizeBuffer[32];
DWORD dwLengthSizeBuffer = sizeof(szSizeBuffer);
DWORD dwFileSize;
DWORD dwBytesRead;
BOOL bSuccessful;
CString Contents;
// Setting default error message
Contents = m_ErrorMessage;
// Opening the Url and getting a Handle for HTTP file
hHttpFile = InternetOpenUrl(m_Session, (const char *) Url, NULL, 0, 0, 0);
if (hHttpFile)
{
// Getting the size of HTTP Files
BOOL bQuery = ::HttpQueryInfo(hHttpFile,HTTP_QUERY_CONTENT_LENGTH, szSizeBuffer, &dwLengthSizeBuffer, NULL) ;
if(bQuery==TRUE)
{
// Allocating the memory space for HTTP file contents
dwFileSize=atol(szSizeBuffer);
LPSTR szContents = Contents.GetBuffer(dwFileSize);
// Read the HTTP file
BOOL bRead = ::InternetReadFile(hHttpFile, szContents, dwFileSize, &dwBytesRead);
//Should add exception catch
if (bRead)
{
bSuccessful = TRUE;
bSuccess = TRUE;
}
::InternetCloseHandle(hHttpFile); // Close the connection.
}
}
else
{
// Connection failed.
bSuccessful = FALSE;
bSuccess = FALSE;
}
return Contents;
}
一个简单的例子,自己参考一下,查查资料就能搞定
http://www.vckbase.com/code/