引言:感謝維護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句柄