获得验证码,显示PNG图片

来源:互联网 发布:添加网络打印机 不显示 编辑:程序博客网 时间:2024/05/16 04:19

最近做个小工具,要获得网页的验证码,并显示出来,把经验来分析一下。

要获得验证码,先的取得相应的URL,这个就不多说了。我用的CInternetSession,和CHttpConnection,贴代码:

CString strFileURLInServer=_T("http://captcha.qq.com/getimage?aid=1007901&r=0.6972409240712645");
CString strFileLocalFullPath = _T("124.PNG");
CInternetSession session;
CHttpConnection* pHttpConnection = NULL;
CHttpFile* pHttpFile = NULL;
CString strServer, strObject;
INTERNET_PORT wPort;
DWORD dwType;
char* pszBuffer = NULL;  
AfxParseURL(strFileURLInServer, dwType, strServer, strObject, wPort);
pHttpConnection = session.GetHttpConnection(strServer,
dwType == AFX_INET_SERVICE_HTTP ? NORMAL_CONNECT : SECURE_CONNECT, wPort);
pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject, 
NULL, 1, NULL, NULL, (dwType == AFX_INET_SERVICE_HTTP ? NORMAL_REQUEST : SECURE_REQUEST));
if(pHttpFile->SendRequest() == FALSE)
return  ;
DWORD dwStateCode;
pHttpFile->QueryInfoStatusCode(dwStateCode);
if(dwStateCode == HTTP_STATUS_OK)
{

HANDLE hFile = CreateFile(strFileLocalFullPath, GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);  //创建本地文件
if(hFile == INVALID_HANDLE_VALUE)
{
pHttpFile->Close();
pHttpConnection->Close();
session.Close();
return  ;
}
char szInfoBuffer[1000];  //返回消息
DWORD dwFileSize = 0;   //文件长度
DWORD dwInfoBufferSize = sizeof(szInfoBuffer);
BOOL bResult = FALSE;
bResult = pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,
(void*)szInfoBuffer,&dwInfoBufferSize,NULL);
dwFileSize = atoi(szInfoBuffer);
const int BUFFER_LENGTH = 1024 * 10;
pszBuffer = new char[BUFFER_LENGTH];  //读取文件的缓冲
DWORD dwWrite, dwTotalWrite;
dwWrite = dwTotalWrite = 0;
UINT nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH); //读取服务器上数据
while(nRead > 0)
{

WriteFile(hFile, pszBuffer, nRead, &dwWrite, NULL);  //写到本地文件
dwTotalWrite += nRead;
nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH);
}

delete[]pszBuffer;
pszBuffer = NULL;
CloseHandle(hFile);
}

注意保存图片的格式,我原来下载的图片格式是PNG的,所以我代码里面用的"124.PNG",要显示PNG图片,可以用Graphics

Image image(124.PNG); 
Graphics *graphics=NULL;
Graphics *graphics2=NULL;
HDC hdc = ::GetDC(GetDlgItem(IDC_PIC)->m_hWnd);
graphics2 = graphics->FromHDC(hdc);
graphics2->DrawImage(&image,0,0,60,20);

用Graphics是注意开始调用GdiplusStartup,结束后GdiplusShutdown,多的不说了,我上传工程例子。


http://download.csdn.net/detail/ll305vc/5255280

例子里面不是用的QQ,12306的地址,需要修改一下,12306不能获得的,确认安装了安全文件。

原创粉丝点击