Pocket PC SDK 提供 RAPI (Remote API) 函式庫。`CeRapiInit` 簡單但阻塞直到連線成功,若裝置未連接會導致執行緒卡死。`CeRapiInitEx` 立即返回,配合事件物件非阻塞等待,是正確做法。
HRESULT CeRapiInitEx(RAPIINIT* pRapiInit);
typedef struct _RAPIINIT {
DWORD cbSize; // 結構大小
HANDLE heRapiInit; // 事件控制代碼,連線完成時觸發
HRESULT hrRapiInit; // 連線結果 (S_OK=成功)
} RAPIINIT;
#include
#pragma comment(lib, "rapi.lib")
BOOL IsPocketPCConnected(DWORD timeoutMs = 2000) {
RAPIINIT ri = {0};
ri.cbSize = sizeof(RAPIINIT);
// 1. 非阻塞初始化
HRESULT hInit = CeRapiInitEx(&ri);
if (FAILED(hInit)) return FALSE; // API 呼叫失敗
// 2. 等待連線事件 (最多 timeoutMs)
DWORD dwWait = WaitForSingleObject(ri.heRapiInit, timeoutMs);
// 3. 綜合判斷
if (hInit == S_OK && ri.hrRapiInit == S_OK && dwWait != WAIT_TIMEOUT) {
// 連線成功
// 此後可呼叫 CeRapiInvoke, CeGetFileAttributes 等 RAPI 函式
return TRUE;
}
// 連線失敗或逾時,清理
CeRapiUninit();
return FALSE;
}
| 步驟 | 說明 |
|---|---|
| cbSize | 必須設為 `sizeof(RAPIINIT)`,否則 API 失敗 |
| CeRapiInitEx 返回值 | 僅代表 API 呼叫本身成功,**不代表裝置已連線** |
| heRapiInit 事件 | 裝置連線完成 (或失敗) 時由系統觸發 |
| hrRapiInit | 事件觸發後的真實連線結果 |
| WaitForSingleObject | 可換成 `MsgWaitForMultipleObjects` 若需同時處理視窗訊息 |
| 逾時值 | 經驗值:已連線 <1秒;未連線 2 秒內會失敗。建議 2000~3000ms |
BOOL CMyApp::InitInstance() {
// ... 標準初始化 ...
if (!IsPocketPCConnected(3000)) {
AfxMessageBox(_T("未偵測到 Pocket PC 裝置,相關功能將無法使用。"));
// 可選:停用相關選單/按鈕
}
// ... 後續初始化 ...
return TRUE;
}
// 程式結束或不再需要 RAPI 時
CeRapiUninit();