Windows Mobile下非同步使用WinInet庫下載資料
現在windows mobile系統雖然開始漸漸淡出人們的視線,我現在也轉到android上了,可是做了這麼些年windows mobile開發總覺得要留下點什麼,所以開始寫點這方面的部落格留個紀念,其實是把以前的東西重新整理回顧一下。
使用WinInet庫進行網路下載時,通常使用InternetReadFile函式,但它是同步下載,所以當正在下載時網路突然斷線,程式有可能會卡在這個函式當中,當然也可以設定一個超時來控制。當程式必須退出時,使用同步方式的話則必須等待函式完成或超時,而用非同步方式則可以方便的控制。
1、介紹程式下載的流程
//開啟Internet,,標記使用非同步方式,設定標誌位INTERNET_FLAG_ASYNC
m_hSession = ::InternetOpen(AGENTNAME,INTERNET_OPEN_TYPE_DIRECT, NULL, NULL,INTERNET_FLAG_ASYNC);
//設定回撥函式AsyncInternetCallback,函式返回舊的回撥函式
INTERNET_STATUS_CALLBACK pOldCallback = InternetSetStatusCallback(m_hSession, AsyncInternetCallback);
//開啟一個url地址,最後一個引數系統會傳遞給回撥函式
m_hInternetFile = ::InternetOpenUrl(m_hSession, lpszUrl, NULL, NULL, INTERNET_FLAG_RELOAD,(DWORD)this);
//返回值為NULL,並且得到的錯誤是ERROR_IO_PENDING,則等待,可以從回撥函式處得到打//開的控制程式碼值
if(m_hInternetFile == NULL)
{
if(GetLastError() == ERROR_IO_PENDING)
{
//等待在回撥函式中取得開啟的控制程式碼
}
else
{
//出錯
}
}
//開始下載,以下取得資料的程式碼可以放在一個迴圈中,直到取得全部的資料
pBuffer = new BYTE[dwBufferSize];
memset(pBuffer,0,dwBufferSize);
INTERNET_BUFFERS i_buf = {0};
i_buf.dwStructSize = sizeof(i_buf);
i_buf.lpvBuffer = pBuffer;
i_buf.dwBufferLength = dwBufferSize;
//重置讀資料事件
ResetEvent(m_hEventComplete);
BOOL bRead = ::InternetReadFileExA(m_hInternetFile,(LPINTERNET_BUFFERSA)&i_buf,IRF_ASYNC,(DWORD)this)
//返回值為FALSE,並且錯誤號為ERROR_IO_PENDING,則說明正在非同步取得資料;有時候網路比較暢通時會返回TRUE,這時候資料已經取得
if ( !bRead )
{
DWORD dwError = GetLastError();
if (ERROR_IO_PENDING == dwError)
{
//等待讀取資料的事件被啟用
}
else
//出錯
}
else
資料已經取得
2、介紹回撥函式
void AsyncInternetCallback(HINTERNET hInternet,DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength)
{
switch(dwInternetStatus)
{
//控制程式碼被建立
case INTERNET_STATUS_HANDLE_CREATED:
m_hInternetFile = (HINTERNET)(((LPINTERNET_ASYNC_RESULT)(lpvStatusInformation))->dwResult);
break;
//控制程式碼被關閉
case INTERNET_STATUS_HANDLE_CLOSING:
case INTERNET_STATUS_CONNECTION_CLOSED:
break;
//一個請求完成,比如一次控制程式碼建立的請求,或者一次讀資料的請求,在這裡啟用相應的事件
case INTERNET_STATUS_REQUEST_COMPLETE:
if (ERROR_SUCCESS == ((LPINTERNET_ASYNC_RESULT)(lpvStatusInformation))->dwError)
{
//啟用等待的事件
}
else
{
//啟用出錯的事件
}
break;
}
}
注意:呼叫::InternetReadFileEx有一個需要注意的地方:在Unicode環境下(比如WinCE中),系統會自動轉譯呼叫InternetReadFileExW函式,這個函式會直接返回錯誤號120,這時候要使用非同步操作必須呼叫InternetReadFileExA函式。
相關文章
- C# 檔案下載 : WinINetC#
- aspera下載nr資料庫資料庫
- GEO資料庫下載 SRA資料庫
- 學習下ECharts 非同步載入資料Echarts非同步
- oracle資料庫軟體下載Oracle資料庫
- sqlserver資料庫下載安裝SQLServer資料庫
- windows下Oracle資料庫完全刪除WindowsOracle資料庫
- 使用treq庫下載
- 如何在Windows下使用DOS命令進入MySQL資料庫?WindowsMySql資料庫
- windows mobile下的檔案路徑Windows
- Windows版PostgreSQL資料庫下載及安裝教程(關係型資料庫管理系統)WindowsSQL資料庫
- 非歸檔模式下恢復資料庫兩例模式資料庫
- CentOS7.1下MySQL資料庫主從同步CentOSMySql資料庫主從同步
- 下載和安裝MySQL資料庫MySql資料庫
- 各版本的資料庫下載地址資料庫
- windows下使用nvm,以及切換nvm下載源Windows
- 【資料庫資料恢復】windows server下SqlServer資料庫的資料恢復資料庫資料恢復WindowsServerSQL
- ACCESS資料庫防止下載大盤點 (轉)資料庫
- MySQL資料庫下載及安裝教程MySql資料庫
- 生信公共資料庫下載處理資料庫
- WINDOWS下安裝MYSQL資料庫教程詳解WindowsMySql資料庫
- 使用 RMAN 同步資料庫資料庫
- oracle資料下載Oracle
- AIX下使用dbca建立oracle資料庫AIOracle資料庫
- Linux下mysql資料庫一主一從同步配置LinuxMySql資料庫
- python下載萬方資料庫文獻Python資料庫
- ASP.NET中防止Access資料庫下載ASP.NET資料庫
- 最新版Access資料庫軟體下載資料庫
- 人工智慧大資料,公開的海量資料集下載,ImageNet資料集下載,資料探勘機器學習資料集下載人工智慧大資料機器學習
- 如何在Windows下利用Apche檢視MySQL資料庫?WindowsMySql資料庫
- Windows 下JDBC 訪問Oracle11g 資料庫WindowsJDBCOracle資料庫
- 利用Kettle進行資料同步(下)
- windows重灌/資料庫物理檔案完好的情況下恢復資料庫Windows資料庫
- 批量下載SRR資料
- Redd資料集下載
- 英語資料下載
- CRM資料合集下載
- windows 10 下載工具Windows