• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            milkyway的窩

            最初想法的誕生地

             

            RAPI初始化算法和SAMPLE CODE

            來自 http://www.cnblogs.com/walzer/archive/2006/02/05/325605.html

            作者:Walzer
            日期:2005.12.12

            RAPI全寫為Remote Application Interface, 就是PC端調用這組API, 通過ActiveSync來操作TARGET端WindowsCE作業. 這個功能估計以后在WINCE或WIN MOBILE的應用上會用到許多

            我今天修改了同事留下的Updateboot.exe的代碼, 改進藍牙讀寫的模塊. 這個地方我們用到了RAPI, 看一下他們在程序中初始化RAPI的做法

            ?HRESULT hRapiResult;
            ?hRapiResult = CeRapiInit();
            ?if(hRapiResult != S_OK)
            ?{
            ???? m_ValueEdit.SetWindowText((LPCTSTR)"初始化RAPI失敗");
            ???? return;
            ?}

            看起來是平淡無奇, 實際上單步一下就可以發現運行到CeRapiInit()時, 程序就BLOCK在這里了,死活走不下去, 并沒有達到?if(hRapiResult != S_OK)的預期目的. 我查了一下CeRapiInit()的說明:

            A call to CeRapiInit does not return until the connection is made, an error occurs, or another thread calls CeRapiUninit.

            也就是說像我現在并沒有把板子和PC相連并啟動ACTIVE SYNC時, 這個CeRapiInit()是肯定賴著不走了, 程序會死在這里. (鄙視一下誰寫的代碼,這個坑好大啊) ?因此想到了重新創立個等待進程調用CeRapiUninit來干掉它. 不過這樣做顯然不厚道, 創立進程需要占用更多的內存. 所以用了上句說明的下半段:

            The CeRapiInitEx function does not block the calling thread. Instead, it uses an event to signal when initialization is complete.

            建立個事件, 用WaitForSingleObject來等他, 超時就BYEBYE了. 貢獻自己寫的如下代碼, 以后RAPI INIT可以參考

            BOOL?RapiInitialzation()
            {
            ????RAPIINIT?struRapiInit;???
            //這個是CeRapiInitEx函數要求的入口參數
            ????DWORD?dwWaitResult?=?0;??//等待初始化完成事件的變量
            ????HRESULT?hRapiResult?=?NULL;?//CeRapiInitEx的返回HANDLE

            ????
            if?(?m_bRapiInitFlag?==?FALSE?)?//全局的一個FLAG,如果初始化過就不再重復了
            ????{
            ????????struRapiInit.cbSize?
            =?sizeof(RAPIINIT);??//填滿該結構體僅有的三個成員
            ????????struRapiInit.hrRapiInit?=?NULL;??//明知是輸出參數也順手填一下,?我以前吃過虧,?驚弓之鳥
            ????????struRapiInit.heRapiInit?=?NULL;

            ????????hRapiResult?
            =?CeRapiInitEx(&struRapiInit);??//關鍵點

            ????????m_ValueEdit.SetWindowText((LPCTSTR)
            "Wait?2?second?for?RapiInit");?//后面2秒程序要頓一下了,?得告訴用戶.??m_ValutEdit和對話框里一個IDC_STATIC關聯了.
            ????????dwWaitResult?=?WaitForSingleObject(struRapiInit.heRapiInit,?2000);??//關鍵點

            ????????
            if(?hRapiResult?==?S_OK?&&?
            ????????????struRapiInit.hrRapiInit?
            ==?S_OK?&&
            ????????????dwWaitResult?
            !=?WAIT_TIMEOUT)????//保守起見,?三個返回值都判斷
            ????????{
            ???????????m_bRapiInitFlag?
            =?TRUE;
            ???????????
            return?TRUE;
            ????????}
            ????????
            else
            ????????{
            ????????????m_ValueEdit.SetWindowText((LPCTSTR)
            "The?initialization?of?RAPI?falied,?you?need?to?install?an?ActiveSync?or?connect?the?IPTV?to?PC");???//一般是沒連接導致,?當然也可能用戶沒裝ActiveSync
            ???????????return?FALSE;
            ????????}
            ????}
            ????
            else
            ????{
            ?????????m_bRapiInitFlag?
            =?TRUE;
            ?????????
            return?TRUE;
            ????}
            }

            posted on 2007-01-16 09:42 milkyway 閱讀(3020) 評論(1)  編輯 收藏 引用 所屬分類: wince(別人的文章技巧總結)

            評論

            # re: RAPI初始化算法和SAMPLE CODE 2007-01-16 09:44 相思酸中有甜

            另一篇文章 http://www.cnblogs.com/yakin/archive/2005/07/20/196569.aspx

            RAPI:Remote Application Programming Interface

            RAPI是基于ActiveSync的.所以在Device要加ActiveSync的組件,同時PC端要裝ActiveSync。這樣Device是server端,PC是Client端。
            我是用VC6.0作為工具編寫PC端APP來控制Device的。當然我們原來的VC中并沒有包含RAPI的相關API實現,所以要添加RAPI的相關lib文件和頭文件:RAPI.lib和RAPI.h。同時要在project\settings里面設置連接RAPI.lib。
            相關編程環境建立后就可以開始編程了。

            1) 初始化RAPI。
            開始編寫的時候忘了這一點,結果總是不行。后來在網上狂搜,搜到了微軟日本的一篇相關文章,才搞明白。日語里面有很多漢字,大體還知道他在說什么,看來武大郎的故事有可能是真的哦!
            HRESULT hr = CeRapiInit(); //must initilize RAPI first before performing other operation.
            if ( hr != ERROR_SUCCESS )
            { return; }

            2) 下面以修改藍牙注冊表為例:
            打開注冊表:
            wcscpy((wchar_t *)Name, L"Software\\Microsoft\\Bluetooth\\HCI\\psKey");
            if ((lRet = CeRegOpenKeyEx(HKEY_LOCAL_MACHINE, (wchar_t *)Name, 0, 0, &hChildKey)) == ERROR_SUCCESS)
            {.......}
            RAPI的函數都使用unicode,所以所有字符串都必須是unicode形式。這一點要注意。

            查詢注冊表的值:
            if (ERROR_SUCCESS == (lRet = CeRegQueryValueEx(hChildKey,
            L"Pskey2", NULL, &dwType, (LPBYTE)Data,
            &dwSize)))

            修改注冊表的值:
            if(ERROR_SUCCESS == (lRet = CeRegSetValueEx(hChildKey,
            L"Pskey2", NULL, NULL, (LPBYTE)&wData,
            sizeof(wData))))

            然后關閉注冊表項:
            CeRegCloseKey(hChildKey);

            3) 關閉RAPI
            CeRapiUninit();


            我對RAPI的了解只是皮毛。隨著了解的深入,我們可以用它寫出強大的應用程序,比如完美的通過ActiveSync的升級程序。

              回復  更多評論   

            導航

            統計

            公告

            隨筆皆原創,文章乃轉載. 歡迎留言!

            常用鏈接

            留言簿(37)

            隨筆分類(104)

            隨筆檔案(101)

            文章分類(51)

            文章檔案(53)

            wince牛人

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久超乳爆乳中文字幕| 亚洲午夜无码久久久久| 久久99国产精品久久久| 99久久综合狠狠综合久久止| 热久久国产精品| 色播久久人人爽人人爽人人片AV| 久久久久免费看成人影片| 久久99免费视频| 国产精品亚洲综合久久| 国内精品伊人久久久久av一坑| 国产精品免费久久久久电影网| 久久人人爽人人爽人人爽 | 成人精品一区二区久久久| 久久久WWW成人| 久久精品人人槡人妻人人玩AV| 精品久久久久久久中文字幕| 精品久久久中文字幕人妻| 久久久久久亚洲精品不卡 | .精品久久久麻豆国产精品| 久久精品国产一区二区三区| 日韩乱码人妻无码中文字幕久久 | 国产91久久精品一区二区| 中文成人无码精品久久久不卡 | 亚洲精品无码久久久久sm| 久久久免费观成人影院| 日韩精品国产自在久久现线拍| 亚洲午夜无码久久久久| 久久人做人爽一区二区三区 | 久久国产亚洲高清观看| 久久午夜免费视频| 欧美国产成人久久精品| 国产精自产拍久久久久久蜜| 国产精品视频久久| www性久久久com| 99国产欧美精品久久久蜜芽| 精品国际久久久久999波多野| 久久精品国产精品亚洲精品| 久久久久综合国产欧美一区二区| 久久天堂AV综合合色蜜桃网| 精品熟女少妇AV免费久久| 久久久久亚洲AV片无码下载蜜桃|