引言:感谢维护Duilib的各位大牛
1、简介
2、程序分析
3、API学习笔记
简介
界面效果
浏览器内核为wke库,该浏览器小巧又使用方便。这里就不多介绍了,大家可以去看Duilib的demo。
根据搜索框输入的关键字(这里可以输入正则表达式),点击“开始刷机”后,就不断刷新界面并获取网页源码,将源码根据关键字进行正则匹配,匹配完成进行提示。
如果有更好的方法,希望留言给我
程序分析
流程图简介下实现的主要线程
DWORD WINAPI RefreshThread(LPARAM lparam)
{
CMainWnd* pThis = (CMainWnd*)lparam;
string key = T2ANSI(pThis->m_pSearchEdit->GetText().GetData());
CURL* myUrl = new CURL(pThis->m_URL);
#define MAX_BUF_LEN (1024*200)
char* pBuf = new char[MAX_BUF_LEN];
DWORD dwRead;
DWORD dwTryTimes = 0;
CODE_TYPE codeType = unknow;
DWORD res = 0;
while (true)
{
memset(pBuf, 0, MAX_BUF_LEN);
res = myUrl->ConnectURL();
if (res != NULL)
continue;
string strPostData("");
if(!myUrl->sendRequest((char*)strPostData.c_str(),strPostData.length()))
continue;
if (!myUrl->EndRequest())
continue;
myUrl->ReadData((LPBYTE)pBuf, MAX_BUF_LEN - 1, &dwRead);
dwTryTimes++;
if (codeType == unknow)
{
codeType = pThis->WedCodeType(pBuf);
}
if (codeType == type_gbk)
{
if (pThis->MatchKey(pBuf, key.c_str()))
break;
}
else if (codeType == type_utf8)
{
if (pThis->MatchKey(pBuf, _U(key.c_str())))
break;
}
pThis->SendMessage(WM_FIND_TIME, dwTryTimes, 0);
}
delete[] pBuf;
delete myUrl;
pThis->SendMessage(WM_FIND_END, 0, 0);
return 0;
}
示例源码:https://pan.baidu.com/s/1dF3yGv
API学习笔记
关于Windows提供与http协议通信的API笔记
URL_COMPONENTS
typedef struct {
DWORD dwStructSize;
LPTSTR lpszScheme;
DWORD dwSchemeLength;
INTERNET_SCHEME nScheme;
LPTSTR lpszHostName;
DWORD dwHostNameLength;
INTERNET_PORT nPort;
LPTSTR lpszUserName;
DWORD dwUserNameLength;
LPTSTR lpszPassword;
DWORD dwPasswordLength;
LPTSTR lpszUrlPath;
DWORD dwUrlPathLength;
LPTSTR lpszExtraInfo;
DWORD dwExtraInfoLength;
} URL_COMPONENTS, *LPURL_COMPONENTS;
dwStructSize:这个结构的大小,以字节为单位。用于版本检查。
lpszScheme:指向包含方案名称的字符串值。
dwSchemeLength:方案名称的长度,以字符表示。
nScheme:互联网协议方案。此成员可以是以下值之一。
INTERNET_SCHEME_HTTP:互联网方案是HTTP协议
INTERNET_SCHEME_HTTPS:互联网方案HTTPS是一种使用安全交易语义的HTTP协议。
lpszHostName:指向包含主机名称的字符串值。
dwHostNameLength:主机名的长度,以字符为单位。
NPORT:端口号。
lpszUserName:指向包含用户名的字符串。
dwUserNameLength:用户名的长度,以字符表示。
lpszPassword:指向包含密码的字符串的指针。
dwPasswordLength:密码的长度,以字符为单位。
lpszUrlPath:指向包含URL路径的字符串的指针。
dwUrlPathLength:URL路径的长度,以字符为单位。
lpszExtraInfo:指向包含额外信息的字符串值
dwExtraInfoLength:无符号长整型值,包含额外信息的长度,以字符为单位。
WinHttpOpen
HINTERNET WINAPI WinHttpOpen(
_In_opt_ LPCWSTR pwszUserAgent,
_In_ DWORD dwAccessType,
_In_ LPCWSTR pwszProxyName,
_In_ LPCWSTR pwszProxyBypass,
_In_ DWORD dwFlags
);
功能:WinHttpOpen函数为应用程序初始化使用WinHTTP函数
返回值:返回一个WinHTTP会话句柄。
参数:
pwszUserAgent:指向包含调用WinHTTP函数的应用程序或实体的名称的字符串变量的指针。该名称在HTTP协议中用作用户代理。
dwAccessType:所需的访问类型。这可以是以下值之一。
WINHTTP_ACCESS_TYPE_NO_PROXY直接解析所有主机名而不使用代理。
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY从注册表中检索静态代理或直接配置。 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY不会继承浏览器代理设置。 WinHTTP不与Internet Explorer共享任何代理设置。
WINHTTP_ACCESS_TYPE_NAMED_PROXY将请求传递给代理,除非提供代理旁路列表并且要解析的名称绕过代理。在这种情况下,这个函数使用WINHTTP_ACCESS_TYPE_NAMED_PROXY。
pwszProxyName [in]指向字符串变量的指针,其中包含通过将dwAccessType设置为WINHTTP_ACCESS_TYPE_NAMED_PROXY来指定代理访问时要使用的代理服务器的名称。 WinHTTP函数只识别HTTP的CERN类型代理。如果dwAccessType未设置为WINHTTP_ACCESS_TYPE_NAMED_PROXY,则必须将此参数设置为WINHTTP_NO_PROXY_NAME。
pwszProxyBypass [in]指向字符串变量的指针,当dwAccessType设置为WINHTTP_ACCESS_TYPE_NAMED_PROXY时,该变量包含主机名或IP地址的可选分号分隔列表,该列表不应通过代理进行路由。该列表可以包含通配符。不要使用空字符串,因为WinHttpOpen函数使用它作为代理旁路列表。如果此参数将列表中的“”宏指定为唯一条目,则此函数将绕过不包含句点的任何主机名。如果dwAccessType未设置为WINHTTP_ACCESS_TYPE_NAMED_PROXY,则此参数必须设置为WINHTTP_NO_PROXY_BYPASS。
dwFlags [in]包含指示影响此函数行为的各种选项的标志的无符号长整数值。该参数可以具有以下值。
WINHTTP_FLAG_ASYNC异步使用WinHTTP函数。默认情况下,所有使用返回的HINTERNET句柄的WinHTTP函数都是同步执行的。当这个标志被设置时,调用者需要通过WinHttpSetStatusCallback指定一个回调函数。
WinHttpConnect
HINTERNET WINAPI WinHttpConnect(
_In_ HINTERNET hSession,
_In_ LPCWSTR pswzServerName,
_In_ INTERNET_PORT nServerPort,
_Reserved_ DWORD dwReserved
);
功能:指定HTTP请求的初始目标服务器,并为该初始目标的HTTP会话返回一个HINTERNET连接句柄。
返回值:成功返回一个HINTERNET连接句柄,失败返回NULL
参数:
hSession [in]先前调用WinHttpOpen返回的有效HINTERNET WinHTTP会话句柄。
pswzServerName [in]指向包含HTTP服务器的主机名的以空字符结尾的字符串。或者,该字符串可以包含以ASCII码表示的站点的IP地址,例如,10.0.1.45。请注意,WinHttp不接受国际主机名称,而不先将其转换为OnlinePunycode。
nServerPort [in]无符号整数,指定建立连接的服务器上的TCP / IP端口。该参数可以是任何有效的TCP / IP端口号,也可以是下列其中一个值。
INTERNET_DEFAULT_HTTP_PORT使用HTTP服务器的默认端口(端口80)。
INTERNET_DEFAULT_HTTPS_PORT使用HTTPS服务器的默认端口(端口443)。选择此端口不会自动建立安全连接。您还必须使用WinHttpOpenRequest中的WINHTTP_FLAG_SECURE标志来指定使用安全事务语义。
INTERNET_DEFAULT_PORT使用端口80作为HTTP,使用端口443作为安全超文本传输协议(HTTPS)。
dwReserved [in]该参数是保留的,必须是0。
WinHttpOpenRequest
HINTERNET WINAPI WinHttpOpenRequest(
_In_ HINTERNET hConnect,
_In_ LPCWSTR pwszVerb,
_In_ LPCWSTR pwszObjectName,
_In_ LPCWSTR pwszVersion,
_In_ LPCWSTR pwszReferrer,
_In_ LPCWSTR *ppwszAcceptTypes,
_In_ DWORD dwFlags
);
功能:创建一个HTTP请求句柄。
返回值:成功返回一个HTTP请求句柄,失败返回NULL
hConnect [in]HINTERNET连接句柄到由WinHttpConnect返回的HTTP会话。
pwszVerb [in]指向包含要在请求中使用的HTTP谓词的字符串。如果此参数为NULL,则该函数使用GET作为HTTP动词。
注意这个字符串应该全部大写。许多服务器将HTTP动词视为区分大小写,并且Internet工程任务组(IETF)请求注释(RFC)仅使用大写字符来拼写这些动词。
pwszObjectName [in]指向包含指定HTTP动词的目标资源名称的字符串的指针。这通常是文件名称,可执行模块或搜索说明符。
pwszVersion [in]指向包含HTTP版本的字符串的指针。如果此参数为NULL,则该函数使用HTTP / 1.1。
pwszReferrer [in]指向一个字符串的指针,该字符串指定从中获取请求pwszObjectName中的URL的文档的URL。如果此参数设置为WINHTTP_NO_REFERER,则不指定引用文档。
ppwszAcceptTypes [in]指向以空字符结尾的字符串指针数组,指定客户端接受的媒体类型。如果此参数设置为WINHTTP_DEFAULT_ACCEPT_TYPES,则客户端不接受任何类型。通常情况下,服务器处理缺乏接受的类型,表明客户端只接受类型为“text / *”的文档;也就是说,只有文本文件 - 没有图片或其他二进制文件。
dwFlags [in]包含Internet标志值的无符号长整数值
WinHttpAddRequestHeaders
BOOL WINAPI WinHttpAddRequestHeaders(
_In_ HINTERNET hRequest,
_In_ LPCWSTR pwszHeaders,
_In_ DWORD dwHeadersLength,
_In_ DWORD dwModifiers
);
功能:将一个或多个HTTP请求标头添加到HTTP请求句柄。
返回值:成功返回TRUE,失败返回FALSE
参数:
hRequest [in]通过调用WinHttpOpenRequest函数返回的HINTERNET句柄。
pwszHeaders [in]指向包含要附加到请求的标头的字符串变量的指针。 除最后一个标题外,每个标题都必须以回车/换行(CR / LF)结束。
dwHeadersLength [in]一个无符号的长整型值,包含pwszHeaders的字符长度。 如果此参数是-1L,则函数假定pwszHeaders是零终止的(ASCIIZ),并计算长度。
dwModifiers [in]包含用于修改此函数的语义的标志的无符号长整数值,取以下值
WINHTTP_ADDREQ_FLAG_ADD添加标题,如果它不存在。 与WINHTTP_ADDREQ_FLAG_REPLACE一起使用。
WINHTTP_ADDREQ_FLAG_ADD_IF_NEW仅在头文件不存在时才添加头文件; 否则,返回错误。
WINHTTP_ADDREQ_FLAG_COALESCE合并相同名称的标题。
WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA使用逗号合并相同名称的标头。
WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON使用分号合并相同名称的标题。
WINHTTP_ADDREQ_FLAG_REPLACE替换或删除标题。 如果标题值为空并且找到标题,则将其删除。 如果该值不是空的,则被替换。
WinHttpSendRequest
BOOL WINAPI WinHttpSendRequest(
_In_ HINTERNET hRequest,
_In_opt_ LPCWSTR pwszHeaders,
_In_ DWORD dwHeadersLength,
_In_opt_ LPVOID lpOptional,
_In_ DWORD dwOptionalLength,
_In_ DWORD dwTotalLength,
_In_ DWORD_PTR dwContext
);
功能:将指定的请求发送到HTTP服务器。
返回值:成功返回TRUE,失败返回FALSE
参数:
hRequest [in]WinHttpOpenRequest返回的HINTERNET句柄。
pwszHeaders [in,可选]指向包含要附加到请求的附加头的字符串的指针。如果没有额外的头文件可以附加,这个参数可以是WINHTTP_NO_ADDITIONAL_HEADERS。
dwHeadersLength [in]一个无符号的长整型值,包含额外标题的长度(以字符为单位)。如果此参数是-1L,并且pwszHeaders不是NULL,则此函数假定pwszHeaders以null结尾,并计算长度。
lpOptional [in,可选]指向缓冲区的指针,该缓冲区包含在请求标头之后立即发送的任何可选数据。该参数通常用于POST和PUT操作。可选数据可以是发布到服务器的资源或数据。如果没有可选的数据发送,则此参数可以是WINHTTP_NO_REQUEST_DATA。
如果dwOptionalLength参数为0,则忽略此参数并将其设置为NULL。
此缓冲区必须保持可用状态,直到请求句柄关闭或对WinHttpReceiveResponse的调用完成。
dwOptionalLength [in]一个无符号的长整型值,包含可选数据的长度(以字节为单位)。如果没有可选的数据要发送,此参数可以为零。
当lpOptional参数不是NULL时,此参数必须包含有效的长度。否则,lpOptional被忽略并设置为NULL。
dwTotalLength [in]一个无符号的长整型值,包含发送总数据的长度(以字节为单位)。该参数指定请求的Content-Length头。如果此参数的值大于dwOptionalLength指定的长度,则可以使用WinHttpWriteData发送附加数据。
对于同一请求,dwTotalLength不得在对WinHttpSendRequest的调用之间进行更改。如果需要更改dwTotalLength,调用者应该创建一个新的请求。
dwContext [in]指向指针大小的变量的指针,该变量包含应用程序定义的值,该值通过请求句柄传递给任何回调函数。
WinHttpReceiveResponse
BOOL WINAPI WinHttpReceiveResponse(
_In_ HINTERNET hRequest,
_Reserved_ LPVOID lpReserved
);
功能:等待接收对由WinHttpSendRequest发起的HTTP请求的响应。 当WinHttpReceiveResponse成功完成时,状态码和响应头已被接收,并可供应用程序使用WinHttpQueryHeaders进行检查。 应用程序必须先调用WinHttpReceiveResponse,然后才能使用WinHttpQueryDataAvailable和WinHttpReadData来访问响应实体主体(如果有的话)。
返回值:成功返回TRUE,失败返回FALSE
参数:
hRequest [in]由WinHttpOpenRequest返回并由WinHttpSendRequest发送的HINTERNET句柄。 在调用WinHttpReceiveResponse之前,请等到WinHttpSendRequest完成此句柄。
lpReserved [in]该参数是保留的,必须为NULL。
WinHttpReadData
BOOL WINAPI WinHttpReadData(
_In_ HINTERNET hRequest,
_Out_ LPVOID lpBuffer,
_In_ DWORD dwNumberOfBytesToRead,
_Out_ LPDWORD lpdwNumberOfBytesRead
);
功能:从由WinHttpOpenRequest函数打开的句柄中读取数据。
返回值:成功返回TRUE,失败返回FALSE
参数:
hRequest [in] HINTERNET句柄。必须为此句柄调用WinHttpReceiveResponse或WinHttpQueryDataAvailable,并且必须在WinHttpReadData被调用之前完成。尽管WinHttpReceiveResponse完成后立即调用WinHttpReadData可避免缓冲区副本的花费,但这样做要求应用程序使用固定长度的缓冲区进行读取。
lpBuffer [out]指向接收读取数据的缓冲区的指针。确保此缓冲区保持有效,直到WinHttpReadData完成。
dwNumberOfBytesToRead [in]包含要读取的字节数的无符号长整数值。
lpdwNumberOfBytesRead [out]指向一个无符号长整型变量的指针,它接收读取的字节数。在进行任何工作或错误检查之前,WinHttpReadData将此值设置为零。当使用WinHTTP异步时,总是将此参数设置为NULL并检索回调函数中的信息;不这样做可能会导致内存故障。
WinHttpCloseHandle
BOOL WINAPI WinHttpCloseHandle(
_In_ HINTERNET hInternet
);
功能:关闭一个HINTERNET句柄