• <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

            來(lái)自 http://www.cnblogs.com/walzer/archive/2006/02/05/325605.html

            作者:Walzer
            日期:2005.12.12

            RAPI全寫(xiě)為Remote Application Interface, 就是PC端調(diào)用這組API, 通過(guò)ActiveSync來(lái)操作TARGET端WindowsCE作業(yè). 這個(gè)功能估計(jì)以后在WINCE或WIN MOBILE的應(yīng)用上會(huì)用到許多

            我今天修改了同事留下的Updateboot.exe的代碼, 改進(jìn)藍(lán)牙讀寫(xiě)的模塊. 這個(gè)地方我們用到了RAPI, 看一下他們?cè)诔绦蛑谐跏蓟疪API的做法

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

            看起來(lái)是平淡無(wú)奇, 實(shí)際上單步一下就可以發(fā)現(xiàn)運(yùn)行到CeRapiInit()時(shí), 程序就BLOCK在這里了,死活走不下去, 并沒(méi)有達(dá)到?if(hRapiResult != S_OK)的預(yù)期目的. 我查了一下CeRapiInit()的說(shuō)明:

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

            也就是說(shuō)像我現(xiàn)在并沒(méi)有把板子和PC相連并啟動(dòng)ACTIVE SYNC時(shí), 這個(gè)CeRapiInit()是肯定賴著不走了, 程序會(huì)死在這里. (鄙視一下誰(shuí)寫(xiě)的代碼,這個(gè)坑好大啊) ?因此想到了重新創(chuàng)立個(gè)等待進(jìn)程調(diào)用CeRapiUninit來(lái)干掉它. 不過(guò)這樣做顯然不厚道, 創(chuàng)立進(jìn)程需要占用更多的內(nèi)存. 所以用了上句說(shuō)明的下半段:

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

            建立個(gè)事件, 用WaitForSingleObject來(lái)等他, 超時(shí)就BYEBYE了. 貢獻(xiàn)自己寫(xiě)的如下代碼, 以后RAPI INIT可以參考

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

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

            ????????hRapiResult?
            =?CeRapiInitEx(&struRapiInit);??//關(guān)鍵點(diǎn)

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

            ????????
            if(?hRapiResult?==?S_OK?&&?
            ????????????struRapiInit.hrRapiInit?
            ==?S_OK?&&
            ????????????dwWaitResult?
            !=?WAIT_TIMEOUT)????//保守起見(jiàn),?三個(gè)返回值都判斷
            ????????{
            ???????????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");???//一般是沒(méi)連接導(dǎo)致,?當(dāng)然也可能用戶沒(méi)裝ActiveSync
            ???????????return?FALSE;
            ????????}
            ????}
            ????
            else
            ????{
            ?????????m_bRapiInitFlag?
            =?TRUE;
            ?????????
            return?TRUE;
            ????}
            }

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

            評(píng)論

            # 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的組件,同時(shí)PC端要裝ActiveSync。這樣Device是server端,PC是Client端。
            我是用VC6.0作為工具編寫(xiě)PC端APP來(lái)控制Device的。當(dāng)然我們?cè)瓉?lái)的VC中并沒(méi)有包含RAPI的相關(guān)API實(shí)現(xiàn),所以要添加RAPI的相關(guān)lib文件和頭文件:RAPI.lib和RAPI.h。同時(shí)要在project\settings里面設(shè)置連接RAPI.lib。
            相關(guān)編程環(huán)境建立后就可以開(kāi)始編程了。

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

            2) 下面以修改藍(lán)牙注冊(cè)表為例:
            打開(kāi)注冊(cè)表:
            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的函數(shù)都使用unicode,所以所有字符串都必須是unicode形式。這一點(diǎn)要注意。

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

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

            然后關(guān)閉注冊(cè)表項(xiàng):
            CeRegCloseKey(hChildKey);

            3) 關(guān)閉RAPI
            CeRapiUninit();


            我對(duì)RAPI的了解只是皮毛。隨著了解的深入,我們可以用它寫(xiě)出強(qiáng)大的應(yīng)用程序,比如完美的通過(guò)ActiveSync的升級(jí)程序。

              回復(fù)  更多評(píng)論   

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            隨筆皆原創(chuàng),文章乃轉(zhuǎn)載. 歡迎留言!

            常用鏈接

            留言簿(37)

            隨筆分類(104)

            隨筆檔案(101)

            文章分類(51)

            文章檔案(53)

            wince牛人

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            精品熟女少妇aⅴ免费久久| 韩国三级大全久久网站| 久久中文字幕视频、最近更新| 久久久久亚洲AV无码专区桃色| 午夜精品久久久久久影视riav| 一本一本久久a久久综合精品蜜桃 一本一道久久综合狠狠老 | 亚洲国产精品无码久久98| 精品综合久久久久久888蜜芽| 久久se精品一区精品二区| 亚洲AⅤ优女AV综合久久久| 久久精品99久久香蕉国产色戒| 久久99精品久久久久久齐齐| 亚洲精品美女久久久久99小说 | 久久精品无码专区免费东京热| 99久久精品费精品国产一区二区 | 国产精品一区二区久久精品| 久久午夜福利电影| 97久久精品国产精品青草| 国产精品久久新婚兰兰| 国产精品99久久久久久董美香| 日韩人妻无码一区二区三区久久| 欧美性大战久久久久久| 91久久国产视频| 99久久综合狠狠综合久久止| 99精品久久久久久久婷婷| 久久人妻少妇嫩草AV蜜桃| 久久亚洲精品中文字幕三区| 无码人妻精品一区二区三区久久久| 久久电影网| 国产精品一区二区久久精品无码 | 久久最近最新中文字幕大全| 久久精品国产亚洲AV麻豆网站| 日韩精品无码久久一区二区三| 亚洲精品国产成人99久久| 青青青国产成人久久111网站| 精品久久久久香蕉网| AV无码久久久久不卡网站下载| 久久综合给合久久狠狠狠97色| 国内精品久久久久影院薰衣草 | 久久美女网站免费| 国产福利电影一区二区三区,免费久久久久久久精 |