搞定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的外殼...