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