程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 如何快速檢測PocketPC是否已經連接到PC上

如何快速檢測PocketPC是否已經連接到PC上

編輯:關於VC++

如果在程序中檢測PocketPC(以下簡稱PPC)是否已經連接到PC上。PocketPC SDK提供了一組RAPI函數,我們可以通過其中的CeRapiInit或者CeRapiInitEx來檢測。

先說CeRapiInit,它的定義是:

HRESULT CeRapiInit(void);

這個函數調用起來比較簡單一些,只需要檢測其返回值就可以。但是當PPC並沒有連接到PC上時,該函數會一直等待而不返回,也就是說讓當前的線程死鎖了。一直等到PPC與PC連接成功的時候才會返回一個S_OK值。

假設一個程序必須在已知PPC與PC連接成功的情況下執行某種操作,如果已經連接,那麼好辦,CeRapiInit返回S_OK;如果沒有連接,那麼CeRapiInit一直等待,用戶會認為程序死掉了。

還好我們有另一個函數CeRapiInitEx,這個函數原形是:

HRESULT CeRapiInitEx(RAPIINIT *pRapiInit);

該函數功能與CeRapiInit相當,區別在於它會立即返回,但是返回值並不代表PPC與PC的連接情況。我們還需要寫額外的代碼來檢測是否連接成功。請注意該函數需要有一個參數RAPIINIT *pRapiInit,其中RAPIINIT定義如下:

typedef struct _RAPIINIT {
DWORD cbSize;    // RAPIINIT結構的大小
HANDLE heRapiInit;  // 一個Event的Handle
HRESULT hrRapiInit; // 返回連接是否建立成功
} RAPIINIT;

MSDN的官方做法是使用MsgWaitForMultipleObjects函數來監視該結構中的heRapiInit變量,實驗證明,用WaitForSingleObject也可以完成該操作,而且WaitForSingleObject調用起來更方便:)

示例代碼如下:

// 定義RAPIINIT結構變量
RAPIINIT ri;
// 將該變量的大小賦予cbSize參數,這個是Windows SDK編程中常用的操作
// 不知者請查閱相關資料
ri.cbSize = sizeof(RAPIINIT);
// 調用CeRapiInitEx函數,該函數立即返回
// 注意,其返回值並不代表PPC與PC的連接狀態
HRESULT hInitResult=CeRapiInitEx(&ri);
// 這裡用WaitForSingleObject來跟蹤heRapiInit這個Event
DWORD dwWaitResult=WaitForSingleObject(ri.heRapiInit,2000);
// 檢測是否連接成功
if(hInitResult==S_OK && ri.hrRapiInit==S_OK && dwWaitResult!=WAIT_TIMEOUT)
{
   // 連接成功
   ...
}
else
{
   // 連接不成功
   ...
}

好了,到這裡代碼已經寫完,要注意:

這個檢測過程並不規范,但是不會有太大的問題,關鍵在於WaitForSingleObject的最後一個參數的值如何設置,也就是說這個是個經驗值。根據我的經驗,如果PPC與PC已經連接,那麼檢測的過程將在不到1秒的時間內完成;如果沒有連接,那麼最長的等待時間也不會超過2秒。

好了,第一次寫開發,水平有限,希望大家指正。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved