初学MFC,如何通过一个网址获取图片或数据并显示出来?

yudiguan5836 2017-10-11 10:10:18
刚刚接触MFC,感觉代码可读性不高,想写一个MFC程序,通过按键获取网址例如http://baidu.com上面的图片并显示出来,百度搜索了很久,感觉都很复杂,有没有可以直接调用的库或者函数?
CInternetSession mysession;
CHttpConnection *myconn = mysession.GetHttpConnection(L"http://www.baidu.com");
CHttpFile *myfile = myconn->OpenRequest(L"GET", L"/index.html");
myfile->SendRequest();
CString mystr;
CString tmp;
while (myfile->ReadString(tmp))
{
mystr += tmp;
}
myfile->Close();
myconn->Close();
mysession.Close();
delete myfile;
delete myconn;
myfile = 0;
myconn = 0;
...全文
1225 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿源是少年 2017-10-14
  • 打赏
  • 举报
回复
引用 11 楼 yudiguan5836 的回复:
我想向一个网址post数据并且获得他的返回结果,请问大家有什么可用的代码么???加到100分也可以!谢谢大家啦!!!
真建议你用libcurl来做了,winhttp用起来太麻烦
yudiguan5836 2017-10-13
  • 打赏
  • 举报
回复
我想向一个网址post数据并且获得他的返回结果,请问大家有什么可用的代码么???加到100分也可以!谢谢大家啦!!!
yudiguan5836 2017-10-12
  • 打赏
  • 举报
回复
谢谢大家的回复!我用下面的代码,获取的数据为什么messagebox显示的是乱码? CString HttpGet(CString strUrl) { CString strResult; CInternetSession session(NULL, 0); CHttpFile* pHTTPFile = NULL; if (pHTTPFile = (CHttpFile*)session.OpenURL(strUrl)) { CString strText; while (pHTTPFile->ReadString(strText)) strResult += strText + _T("\r\n"); pHTTPFile->Close(); delete pHTTPFile; } return strResult; }
阿源是少年 2017-10-12
  • 打赏
  • 举报
回复
第一步:发出HTTP请求获取返回的HTML页面代码,这步估计你已经做好了。 第二步:解析返回的HTML代码,提取出<img>标签的src属性,属性值就是图片的URL了,如果这个URL是绝对路径,再次发起HTTP请求去获取这张图片,返回的是图片的原始数据,你直接存入文件就得到图片了,如果是相对路径,也就是不是已HTTP开头的URL,这个时候你需要自己观察HTML源码,把主目录的URL提取出来,然后再加上图片URL才是绝对路径URL 关于网页<img>标签的提取以及它的src属性的获取,你可以自己写代码去提取,鉴于你可能初学,你可以用现成的HTML解析库,这里推荐google的gumbo-parser 利于这个库枚举所有<img>标签并获取src属性值。这个库可在github上下载。
smwhotjay 2017-10-12
  • 打赏
  • 举报
回复
UrlDownloadToFile 木马的最爱,一句话下载 然后WinExec 执行。 你要mfc显示,则要用gdi+
向立天 2017-10-12
  • 打赏
  • 举报
回复
MFC没那么多现成的东西 很多功能都要自己设计实现
xiaohuh421 2017-10-12
  • 打赏
  • 举报
回复
调用wininet相关api下载图片到本地或者 内存 然后再加载显示出来. 分别百度相关知识, 拆开来就简单了. 先找如何使用wininet api 下载网络图片 然后再找如何加载本地图片显示 .
赵4老师 2017-10-12
  • 打赏
  • 举报
回复
百度搜“curl”
阿源是少年 2017-10-12
  • 打赏
  • 举报
回复
阿源是少年 2017-10-12
  • 打赏
  • 举报
回复
现在的网页大多都是UTF8编码的,所以你下载到的HTML字符串是UTF8编码的,MessageBox只能显现ANSI和Unicode编码,如要显示正确字符串请自行转码,给你一个转码代码:
LPCSTR UIAsset::UTF8ToANSI(LPCSTR utf8)
{
	int nLen = ::MultiByteToWideChar(CP_UTF8, NULL, utf8, strlen(utf8), NULL, 0);
	wchar_t* ucs = new wchar_t[nLen + 1];
	::MultiByteToWideChar(CP_UTF8, NULL, utf8, strlen(utf8), ucs, nLen);
	ucs[nLen] = '\0';
	nLen = ::WideCharToMultiByte(CP_ACP, NULL, ucs, wcslen(ucs), NULL, 0, NULL, NULL);
	char* ansi = new char[nLen + 1];
	::WideCharToMultiByte(CP_ACP, NULL, ucs, wcslen(ucs), ansi, nLen, NULL, NULL);
	ansi[nLen] = '\0';
	delete[] ucs;
	return ansi;
}

LPCWSTR UTF8ToUCS(LPCSTR utf8)
{
	int nLen = ::MultiByteToWideChar(CP_UTF8, NULL, utf8, strlen(utf8), NULL, 0);
	wchar_t* ucs = new wchar_t[nLen + 1];
	::MultiByteToWideChar(CP_UTF8, NULL, utf8, strlen(utf8), ucs, nLen);
	ucs[nLen] = '\0';
	return ucs;
}
smwhotjay 2017-10-12
  • 打赏
  • 举报
回复

#include "resource.h"
#include "stdafx.h"
#include<windows.h>   
#include<wininet.h>   
 
#pragma   comment(lib,"wininet.lib")   
#pragma   comment(lib,"kernel32.lib")   
void   Entry();
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 
int ret=URLDownloadToFile(NULL,"http://www.google.cn/intl/zh-CN/images/logo_cn.gif",
						  "c:\\logo.gif",0,NULL); 


if (ret==S_OK) //如果下载成功 
{
MessageBox(NULL, "okok", "OK", MB_OK);
}
 
	Entry();
	return 0;
}

    
  void   Entry()   
  {   
      HINTERNET   hSession=InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);   
      HINTERNET   hConnection=InternetOpenUrl(hSession,"http://www.google.com",NULL,0,0,0);   
    
        BYTE   Buffer[4096];   
        DWORD   Read=0,i;   
       HANDLE   hFile=CreateFile("c:\\index.htm",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);   
        InternetReadFile(hConnection,Buffer,sizeof(Buffer),&Read);   
        while(Read!=0)   
        {   
             WriteFile(hFile,Buffer,Read,&i,NULL);   
             InternetReadFile(hConnection,Buffer,sizeof(Buffer),&Read);   
        }   
         CloseHandle(hFile);   
    
         InternetCloseHandle(hConnection);   
         InternetCloseHandle(hSession);   
  }

两种方法 可以下载任何东西了。
yudiguan5836 2017-10-11
  • 打赏
  • 举报
回复
希望有源码或者写好的程序借鉴,谢谢大家

18,356

社区成员

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

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