如果在程序中檢測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秒。
好了,第一次寫開發,水平有限,希望大家指正。