摘要: 封裝Common Control Library 6.0的API越來越順手了。雖說要消滅BEGIN_MESSAGE_MAP之類的代碼,不過寫起來也不容易。BEGIN_MESSAGE_MAP不能動態替換,所以我換成了類似C#的Event和Delegate那樣子的東西。如果不需要動態替換的話,實際上并沒有什么區別,唯一的區別就在于你可以利用VC++的Intellisense去查看自己想要的事件,而不是將什么WM_LBUTTONDOWN之類的消息記住了。
閱讀全文
posted @
2008-08-03 08:48 陳梓瀚(vczh) 閱讀(1972) |
評論 (8) |
編輯 收藏
摘要: 為了緩解疲勞,我網絡和UI同時做。封裝UI真是麻煩啊,一大堆習慣的東西原來是沒有的,什么tab轉移焦點,什么控件對齊,都要自己做。后來就囧了,干脆實現一個Placement來自動調整控件的位置。
閱讀全文
posted @
2008-08-03 04:54 陳梓瀚(vczh) 閱讀(1924) |
評論 (8) |
編輯 收藏
開始設計一個對稱的通訊框架了。這個框架要求所有client的電腦上有一組host threads。host threads可以在另一個程序里面。有了host之后,client就可以跟遠程或者本機的程序通訊了。client可以做的事情有:與host連接與斷開,指定一個遠程的client并發送信息,通知host可以不必繼續維護到某client的連接,查詢某個ip和端口下面的所有client。每一次通訊的時候,client都必須給出ip\port\name來,而不是獲取一個連接然后使用。鑒于client和host未必在同一個程序上,獲得連接然后使用不是很好。
因此就有了如下的設計。host通過socket與其他地方的host通訊,client與host通過named pipe聯系。client與client的信息通過兩個或更多的host傳遞。到了這里,就有必要指定一下協議了。
首先是client-host。client-host發的消息的格式是:Type:BYTE , NameLen:BYTE , Name:CHAR[ ] , MsgLen:INT , Msg:CHAR[ ]。這5部分串在一起成為一個完整的消息通過named pipe傳遞。Type定義如下:
client發給host:
0:CONNECT_TO_HOST , Name=ignore , Message=client name
1:DISCONNECT_TO_HOST , Name=ignore , Message=ignore
2:COMMUNICATE , Name="ip\port\client name" , Message=?
3:REQUEST_LIST , Name="ip\port\*" , Message=ignore
4:COMMUNICATE_FINISH , Name="ip\port\client name" , Message=ignore
host發給client:
0:ERROR , Name=ignore , Message=?
1:DISCONNECT_TO_CLIENT , Name=ignore , Message=ignore
2:COMMUNICATE , Name="ip\port\client name" , Message=?
3:RECEIVE_LIST , Name="ip\host\*" , Message="name1\name2\...."
其次是host與host之間的消息。消息的格式是Type:BYTE , SourceLen:BYTE , SourceName:CHAR[ ] , DestLen:BYTE , DestName:CHAR[ ] , MsgLen:INT , Msg=CHAR[ ]。跟client-host一樣,也是串在一起成為一個完整的消息的。Type定義如下:
消息:(HELLO在不同的狀態下有不同的意義)
0:ERROR , Source=ignore , Dest=ignore , Message=?
1:HELLO , Source=ignore , Dest=ignore , Message=?
2:HELLO_RESPONSE , Source=ignore , Dest=ignore , Message=HELLO的消息內容反轉
3:DISCONNECT , Source=ignore , Dest=ignore , Message=ignore
4:COMMUNICATE , Source="client name" , Dest="client name" , Message=?
5:REQUEST_LIST , Source=ignore , Dest=ignore , Message=ignore
6:RECEIVE_LIST , Source=ignore , Dest=ignore , Message="name1\name2\...."
因為client每一次發消息都要填上地址,因此host可以自行決定要不要將某些socket斷開。同理,COMMUNICATE_FINISH也是可以不發的,這只是為了資源管理的靈活性而設置的。這個東西就暫時命名為Vczh Messenger吧。Vczh Messenger將提供兩套類庫。第一套用于建立host,第二套用于建立client。這樣的話,一個程序可以決定跟其他程序共享host或者是自己給自己建立host。client將使用事件驅動模型。配合vl::system::synchronize命名空間下的一些組件可以很容易將事件驅動模型修改為其他各種各樣的模型。
Vczh Messenger在邏輯上是無連接無順序的通訊框架,用于為進一步的remote object access服務。
posted @
2008-08-02 06:47 陳梓瀚(vczh) 閱讀(1793) |
評論 (4) |
編輯 收藏
摘要: 有了全盤的計劃之后,我們必須先處理輸入的腳本,才能夠進行下一步的工作。字符串處理方面可以參照一下三篇文章:《構造可配置語法分析器》、《構造正則表達式引擎》以及《如何手寫語法分析器》。作為補充,這里再說一說其他的辦法。
閱讀全文
posted @
2008-08-01 23:19 陳梓瀚(vczh) 閱讀(5193) |
評論 (4) |
編輯 收藏
摘要: 為了建立一個remote object access system我不得不封裝了socket、pipe以及synchronize objects。不過我還不知道如何實現穿透,這個就暫時算了。今晚用了兩個小時封裝了socket的一些必要操作,并寫了人生中第一個socket程序。
這個程序同時作為server和client。第一次啟動的為server。接下來server進行監聽,client則往server發信息并接受返回的信息。server會將接受到的信息進行反轉發回去,除非收到了exit結束線程,last結束線程并結束監聽。
閱讀全文
posted @
2008-08-01 06:23 陳梓瀚(vczh) 閱讀(1666) |
評論 (3) |
編輯 收藏
摘要: 此管道非彼管道,不是unix用來做命令行的那個。
Windows的管道可以訪問本機或已知機器名的機器上的命名管道,自己也可以建立命名管道。一個命名管道就跟一個server socket一樣,可以進行listen,并產生很多實例來跟很多個client交談。主要函數有:
閱讀全文
posted @
2008-07-31 09:07 陳梓瀚(vczh) 閱讀(4327) |
評論 (1) |
編輯 收藏
vista的sp1竟然讓我的筆記本掛了,整個C盤恢復到出廠狀態……日。
實習的時候我充分體驗到了Windows Communication Foundation的好處以及壞處。真想用C++弄個出來,整天死鎖。
本來打算周末更新的教程由于我們組的集體活動加上電腦的囧態無法完成鳥,過幾天再更新。
posted @
2008-07-29 06:27 陳梓瀚(vczh) 閱讀(704) |
評論 (2) |
編輯 收藏
摘要: Vista提供的Common Control Library 6.0的BUTTON類中提供了兩種新的按鈕:Command Link和Split Button。只需要在CreateWindow里面指定BS_COMMANDLINK與BS_SPLITBUTTON就可以獲得這兩種新的控件了。
閱讀全文
posted @
2008-07-22 06:41 陳梓瀚(vczh) 閱讀(1940) |
評論 (10) |
編輯 收藏
摘要: 這一篇文章開始講述如何實現一個高級語言的腳本引擎了。由于工程量較為龐大,因此將分開幾篇文章講。學習做腳本還是要從簡單的東西做起的。上一篇文章介紹的命令腳本為實現高級語言的原理做了鋪墊。首先,高級語言和低級語言腳本的架構是一致的。其次,為了具有較大的優化的空間,我們將把高級語言轉換成低級語言,并配合一個低級語言的腳本引擎來實現高級語言的腳本引擎。當然,習慣上,在這種情況下我們把低級語言叫『指令』。
閱讀全文
posted @
2008-07-18 20:31 陳梓瀚(vczh) 閱讀(6639) |
評論 (8) |
編輯 收藏
摘要: 這次要實現的是一個形式最簡單的腳本。這種腳本僅有命令、標號及跳轉構成,看起來就跟匯編一樣,不過好是比較好讀的。雖然這種腳本語言的語法非常簡單,但是最基本的要素還是要有的。
作為一個腳本引擎,為了可以在各種各樣的合適的宿主程序中使用,腳本本身最好不要涉及到具體的領域。當然,如果這個腳本被創建的目的僅僅是為了某個領域的話,那就無所謂了。因此,一個腳本引擎需要一個檢查和運行代碼的機制、運行時環境的維護以及一個功能足夠使用的插件系統。一個完整的腳本引擎至少需要如下部件:
閱讀全文
posted @
2008-07-09 21:43 陳梓瀚(vczh) 閱讀(8873) |
評論 (10) |
編輯 收藏