從編譯ipmsg開始


 搞定i900的wifi後, 很容易就想到怎麼通過wifi同步文件了.
 以前一直用數據線或者藍牙, 數據線麻煩, 藍牙由於本身不瞭解, 常常被各種異常玩弄.
 首先當然想到的是M$的文件共享, 但是我把server服務關閉多年了,老感覺他太重.
 平時用什麼--IPMSG.
 IPMSG就是飛鴿傳書了, 小日本的東西.
 小日本還是搞了很多好玩意的, 除了這個首先想到的就是memcached了.
 memcached還讓額學到不少思想呢.
 
 從他們的官網找到了整套源代碼(http://www.ipmsg.org/index.html.en).
 整套源代碼加上些資源竟然500k都不到,很好弄嘛.
 拿過來首先確認他可以編譯一個ipmsg 的app 出來拉
 
 src是用vc6編譯的, 但爲了wm的開發, 機器上早換vs2005了.
 所以編譯時候就發現三個問題:
 
 首先是大量的危險函數調用(strcpy之流),
 雖然以前也推過源代碼安全的東西, 但個人還是覺得, 只要代碼寫嚴謹就可以了.
 可以把 #pragma warning(disable:4996)加到ipmsg.h文件頭 ,讓編譯器忽略.
 
 然後就是一堆變量定義的作用域問題,
 典型的就是for循環裏頭的變量, 拉到for循環外頭上再判斷.
 這個本來就是非常噁心的做法,
 首先小日本沒有很好的控制變量的作用域.
 第二, 這個似乎本來就不符合標準的.
 
 第三個就是兩處的函數指針的賦值問題.
 本來一頭霧水, 最後這個頁面提供瞭解決方案:
 http://blog.csdn.net/Tycool/archive/2006/06/22/820333.aspx
 感謝一個.
 無非就是成員函數需要加上取地址符了:
 Mainwin.cpp 裏
 TMainWin::SendFileThread函數:
 BOOL (TMainWin::*SendFileFunc)(SendFileObj *obj) = obj->command == IPMSG_GETDIRFILES ? &(TMainWin::SendDirFile) : &(TMainWin::SendFile);
 TRecvDlg::RecvFileThread函數:
 BOOL (TRecvDlg::*RecvFileFunc)(void) =fileObj->isDir ? &(TRecvDlg::RecvDirFile) : &(TRecvDlg::RecvFile); //bydk

 解決了這三個問題後,
 DEBUG編譯通過, 通信也正常,但是發現app很多地方還是使用了小日本的語言, 比如右鍵菜單.
 但是對我來說已經不重要了, 我要做的下一步是把流程分離出來 , 然後嘗試加個wm的外殼...
 
 
 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章