• <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 閱讀(3018) 評論(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牛人

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            青青草原1769久久免费播放| 国产日韩久久久精品影院首页| 久久亚洲国产精品成人AV秋霞| 日韩电影久久久被窝网| 亚洲精品无码久久不卡| 97久久久久人妻精品专区| 国产69精品久久久久99尤物| 狠狠色丁香久久婷婷综合_中| 久久久久高潮毛片免费全部播放 | 久久久久亚洲AV片无码下载蜜桃| 囯产精品久久久久久久久蜜桃 | 99久久国产综合精品女同图片 | 狠狠久久综合| 久久久久久人妻无码| 开心久久婷婷综合中文字幕| 久久精品国产清高在天天线| 午夜精品久久影院蜜桃| 青青草原综合久久大伊人精品| 99精品久久久久久久婷婷| 93精91精品国产综合久久香蕉| 久久久久av无码免费网| 久久无码一区二区三区少妇| 久久综合丝袜日本网| 久久99国产综合精品| 久久久久久久精品妇女99| 久久久综合香蕉尹人综合网| 91超碰碰碰碰久久久久久综合| 久久久一本精品99久久精品88| 久久久久久曰本AV免费免费| 久久综合久久伊人| 日韩久久无码免费毛片软件| 国产精品嫩草影院久久| 99久久精品国产一区二区| 久久91精品久久91综合| 国产精品久久国产精麻豆99网站 | 亚洲狠狠综合久久| 好久久免费视频高清| 久久精品国产精品青草| 欧美一区二区精品久久| 一本大道加勒比久久综合| 精品久久久久久久久久久久久久久 |