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