mfc如何把图片从webBrowser中提取出来?

龙猫哪里跑 2012-03-13 12:44:49
如题,小弟最近做了个自动提取网页图片的mfc程序。我想问如何从webBrowser中提取出该图片?
微软msdn上有这个函数,但是我不会用啊,比如想把webBrowser中的图片存成本地bmp或者放到picturebox的话应该具体怎么做?大侠们赶紧帮忙啊,感激不尽!
STDMETHODIMP CMyBrowser::CopyImage(LPDISPATCH pDispDoc, VARIANT vImageID)
{
HRESULT hr = E_FAIL;
IHTMLDocument2* pDoc = NULL;
IHTMLElement* pelmBody = NULL;
IHTMLElement2* pelmBodyTwo = NULL;
IDispatch* pdispImgElement = NULL;
IDispatch* pdispCtrlRange = NULL;
IHTMLElementCollection* pColl = NULL;
IHTMLControlElement* pCtrlElement = NULL;
IHTMLControlRange* pCtrlRange = NULL;
BSTR bstrCommand = SysAllocString(L"Copy");
VARIANT_BOOL vbReturn;
VARIANT vEmpty;
VariantInit(&vEmpty);

if (pDispDoc == NULL)
goto Cleanup;

if (FAILED(pDispDoc->QueryInterface(IID_IHTMLDocument2, (void**) &pDoc)))
goto Cleanup;

if (FAILED(pDoc->get_all(&pColl)))
goto Cleanup;

if (FAILED(pColl->item(vImageID, vEmpty, &pdispImgElement))
|| pdispImgElement == NULL)
goto Cleanup;

if (FAILED(pDoc->get_body(&pelmBody)) || pelmBody == NULL)
goto Cleanup;

if (FAILED(pelmBody->QueryInterface(IID_IHTMLElement2, (void**) &pelmBodyTwo))
|| pelmBodyTwo == NULL)
goto Cleanup;

if (FAILED(pelmBodyTwo->createControlRange(&pdispCtrlRange))
|| pdispCtrlRange == NULL)
goto Cleanup;

if (FAILED(pdispCtrlRange->QueryInterface(IID_IHTMLControlRange, (void**) &pCtrlRange))
|| pCtrlRange == NULL)
goto Cleanup;

if (FAILED(pdispImgElement->QueryInterface(IID_IHTMLControlElement, (void**) &pCtrlElement))
|| pCtrlElement == NULL)
goto Cleanup;

hr = pCtrlRange->add(pCtrlElement);

if (SUCCEEDED(hr))
hr = pCtrlRange->execCommand(bstrCommand, VARIANT_FALSE, vEmpty, &vbReturn);

pCtrlElement->Release();
hr = S_OK;

Cleanup:

SysFreeString(bstrCommand);

if (pCtrlRange)
pCtrlRange->Release();

if (pdispCtrlRange)
pdispCtrlRange->Release();

if (pelmBodyTwo)
pelmBodyTwo->Release();

if (pelmBody)
pelmBody->Release();

if (pdispImgElement)
pdispImgElement->Release();

if (pColl)
pColl->Release();

if (pDispDoc)
pDispDoc->Release();

return hr;
}
...全文
1143 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
caojun19790629 2014-05-16
  • 打赏
  • 举报
回复
引用 9 楼 qwestw 的回复:
[quote=引用 7 楼 suchunyuan1981 的回复:] LPSTR t = new char[3000];memset(t,0,3000);int m = 0; while( TRUE ) { DWORD l=pFile->GetLength(); if( 0 == l ) break; LPSTR lpBuf=new char [l]; pFile->Read(lpBuf,l); for(int i = 0;i < l;i++) t[m+i] = lpBuf[i]; //读到内存了 m += l; delete [] lpBuf; } pFile -> Close(); CFile f;f.Open("x.jpg",CFile::modeCreate|CFile::modeWrite);f.Write(t,m);f.Close(); delete[] t; 这是我以前用得,虽然比较垃圾,LZ可以借鉴一下
给完整的代码发给我以下 qweswt@163.com 多谢![/quote]
引用 7 楼 suchunyuan1981 的回复:
LPSTR t = new char[3000];memset(t,0,3000);int m = 0; while( TRUE ) { DWORD l=pFile->GetLength(); if( 0 == l ) break; LPSTR lpBuf=new char [l]; pFile->Read(lpBuf,l); for(int i = 0;i < l;i++) t[m+i] = lpBuf[i]; //读到内存了 m += l; delete [] lpBuf; } pFile -> Close(); CFile f;f.Open("x.jpg",CFile::modeCreate|CFile::modeWrite);f.Write(t,m);f.Close(); delete[] t; 这是我以前用得,虽然比较垃圾,LZ可以借鉴一下
老师 我也需要 2448640323@qq.com 谢谢了
qwestw 2014-05-15
  • 打赏
  • 举报
回复
引用 7 楼 suchunyuan1981 的回复:
LPSTR t = new char[3000];memset(t,0,3000);int m = 0; while( TRUE ) { DWORD l=pFile->GetLength(); if( 0 == l ) break; LPSTR lpBuf=new char [l]; pFile->Read(lpBuf,l); for(int i = 0;i < l;i++) t[m+i] = lpBuf[i]; //读到内存了 m += l; delete [] lpBuf; } pFile -> Close(); CFile f;f.Open("x.jpg",CFile::modeCreate|CFile::modeWrite);f.Write(t,m);f.Close(); delete[] t; 这是我以前用得,虽然比较垃圾,LZ可以借鉴一下
给完整的代码发给我以下 qweswt@163.com 多谢!
ok1234567 2012-03-17
  • 打赏
  • 举报
回复
验证码图片也是有URL的,不过是动态生成而已,将下载的图片数据保存为header中定义的图片格式的文件即可
suchunyuan1981 2012-03-15
  • 打赏
  • 举报
回复
LPSTR t = new char[3000];memset(t,0,3000);int m = 0;
while( TRUE )
{
DWORD l=pFile->GetLength();
if( 0 == l ) break;
LPSTR lpBuf=new char [l];
pFile->Read(lpBuf,l);
for(int i = 0;i < l;i++)
t[m+i] = lpBuf[i];
//读到内存了
m += l;
delete [] lpBuf;
}
pFile -> Close();
CFile f;f.Open("x.jpg",CFile::modeCreate|CFile::modeWrite);f.Write(t,m);f.Close();
delete[] t;
这是我以前用得,虽然比较垃圾,LZ可以借鉴一下
土土 2012-03-15
  • 打赏
  • 举报
回复
vc 是copy 上面的代码是 copy 好好研究一下 ,上面的代码都是有用的 然后是粘贴
Eleven 2012-03-13
  • 打赏
  • 举报
回复
如果能得到图片的URL地址,可以直接URLDownloadToFile保存到本地
JohnHealy 2012-03-13
  • 打赏
  • 举报
回复
1.截屏肯定可以的.
2.获取缓存文件夹里也是肯定可以的.
3.获取网络包也是可以的.
龙猫哪里跑 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chinatcp 的回复:]
图片不会保存在webBrowser中,而是保存在 IE的临时缓存目录下。

知道文件名的话,可以从缓存目录中读取,或者直接截屏幕图片自己保存。
[/Quote]
可以从webBrowser中提取出图片,有人用C#实现过,而且是提取缓存目录中没有的验证码图片。现在的问题是用vc怎么提取出图片。
罗平 2012-03-13
  • 打赏
  • 举报
回复
图片不会保存在webBrowser中,而是保存在 IE的临时缓存目录下。

知道文件名的话,可以从缓存目录中读取,或者直接截屏幕图片自己保存。
龙猫哪里跑 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]
如果能得到图片的URL地址,可以直接URLDownloadToFile保存到本地
[/Quote]
貌似不行呢,我要取的是验证码图片,没有具体网址。
当webBrowser加载完页面之后,验证码图片也会被保存在webBrowser中,我想做的是根据这个验证码图片的name或者alt或者id来从webBrowser中取出,请问应该怎么做?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧