首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

快速偵測 Pocket PC 連線狀態:RAPI CeRapiInitEx + WaitForSingleObject 非阻塞實作

     編輯:關於VC++

前言:問題與解決方案

Pocket PC SDK 提供 RAPI (Remote API) 函式庫。`CeRapiInit` 簡單但阻塞直到連線成功,若裝置未連接會導致執行緒卡死。`CeRapiInitEx` 立即返回,配合事件物件非阻塞等待,是正確做法。

核心 API


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

完整範例:MFC 應用程式啟動時檢測


BOOL CMyApp::InitInstance() {
    // ... 標準初始化 ...

    if (!IsPocketPCConnected(3000)) {
        AfxMessageBox(_T("未偵測到 Pocket PC 裝置,相關功能將無法使用。"));
        // 可選:停用相關選單/按鈕
    }

    // ... 後續初始化 ...
    return TRUE;
}

後續操作:連線成功後的常用 RAPI 函式

  • `CeFindFirstFile` / `CeFindNextFile`:列舉裝置檔案
  • `CeCreateFile` / `CeReadFile` / `CeWriteFile`:檔案存取
  • `CeRapiInvoke`:在裝置上執行 DLL 匯出函式 (需裝置端有對應 DLL)
  • `CeGetSystemInfo` / `CeGetVersionEx`:取得裝置系統資訊
  • `CeSHCreateShortcut`:建立捷徑

清理資源


// 程式結束或不再需要 RAPI 時
CeRapiUninit();

注意事項

  1. ActiveSync / Windows Mobile Device Center 必須安裝並執行於 PC 端
  2. 裝置端 需在 ActiveSync 設定中允許「資料同步」或「檔案存取」
  3. 防火牆 可能阻擋 RAPI 通訊埠 (預設 990, 999 等)
  4. Unicode/ANSI:`CP_WINANSI` (0) 或 `CP_UTF8` 視 SDK 版本而定
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved