來(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;
????}
}