刷機軟件-Duilib界面

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

發佈了54 篇原創文章 · 獲贊 38 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章