随笔-341  评论-2670  文章-0  trackbacks-0
 
     摘要: 封装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) 阅读(1960) | 评论 (8)编辑 收藏
     摘要: 为了缓解疲劳,我网络和UI同时做。封装UI真是麻烦啊,一大堆习惯的东西原来是没有的,什么tab转移焦点,什么控件对齐,都要自己做。后来就囧了,干脆实现一个Placement来自动调整控件的位置。  阅读全文
posted @ 2008-08-03 04:54 陈梓瀚(vczh) 阅读(1908) | 评论 (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) 阅读(1783) | 评论 (4)编辑 收藏
     摘要: 有了全盘的计划之后,我们必须先处理输入的脚本,才能够进行下一步的工作。字符串处理方面可以参照一下三篇文章:《构造可配置语法分析器》、《构造正则表达式引擎》以及《如何手写语法分析器》。作为补充,这里再说一说其他的办法。  阅读全文
posted @ 2008-08-01 23:19 陈梓瀚(vczh) 阅读(5125) | 评论 (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) 阅读(1650) | 评论 (3)编辑 收藏
     摘要: 此管道非彼管道,不是unix用来做命令行的那个。
Windows的管道可以访问本机或已知机器名的机器上的命名管道,自己也可以建立命名管道。一个命名管道就跟一个server socket一样,可以进行listen,并产生很多实例来跟很多个client交谈。主要函数有:  阅读全文
posted @ 2008-07-31 09:07 陈梓瀚(vczh) 阅读(4299) | 评论 (1)编辑 收藏
    vista的sp1竟然让我的笔记本挂了,整个C盘恢复到出厂状态……日。

    实习的时候我充分体验到了Windows Communication Foundation的好处以及坏处。真想用C++弄个出来,整天死锁。

    本来打算周末更新的教程由于我们组的集体活动加上电脑的囧态无法完成鸟,过几天再更新。
posted @ 2008-07-29 06:27 陈梓瀚(vczh) 阅读(690) | 评论 (2)编辑 收藏
     摘要: Vista提供的Common Control Library 6.0的BUTTON类中提供了两种新的按钮:Command Link和Split Button。只需要在CreateWindow里面指定BS_COMMANDLINK与BS_SPLITBUTTON就可以获得这两种新的控件了。  阅读全文
posted @ 2008-07-22 06:41 陈梓瀚(vczh) 阅读(1920) | 评论 (10)编辑 收藏
     摘要: 这一篇文章开始讲述如何实现一个高级语言的脚本引擎了。由于工程量较为庞大,因此将分开几篇文章讲。学习做脚本还是要从简单的东西做起的。上一篇文章介绍的命令脚本为实现高级语言的原理做了铺垫。首先,高级语言和低级语言脚本的架构是一致的。其次,为了具有较大的优化的空间,我们将把高级语言转换成低级语言,并配合一个低级语言的脚本引擎来实现高级语言的脚本引擎。当然,习惯上,在这种情况下我们把低级语言叫『指令』。  阅读全文
posted @ 2008-07-18 20:31 陈梓瀚(vczh) 阅读(6556) | 评论 (8)编辑 收藏
     摘要: 这次要实现的是一个形式最简单的脚本。这种脚本仅有命令、标号及跳转构成,看起来就跟汇编一样,不过好是比较好读的。虽然这种脚本语言的语法非常简单,但是最基本的要素还是要有的。

作为一个脚本引擎,为了可以在各种各样的合适的宿主程序中使用,脚本本身最好不要涉及到具体的领域。当然,如果这个脚本被创建的目的仅仅是为了某个领域的话,那就无所谓了。因此,一个脚本引擎需要一个检查和运行代码的机制、运行时环境的维护以及一个功能足够使用的插件系统。一个完整的脚本引擎至少需要如下部件:  阅读全文
posted @ 2008-07-09 21:43 陈梓瀚(vczh) 阅读(8820) | 评论 (10)编辑 收藏
仅列出标题
共35页: First 26 27 28 29 30 31 32 33 34 Last