Developing MSN/WLM Add-in Part.I

微软的Messenger SDK分为面向多人应用的Activity SDK和面向单人应用的 Add-in SDK(Windows Live Messenger Add-In API)。不过Live时代的WLM Add-In SDK相较于之前的MSN Messenger API,开放的接口反而少了。自微软实行.NET战略以来,Windows平台应用程序开发的主流逐渐由以往的VC++与Platform SDK搭配的方式转由.NET Framework与C#。然则.NET Framework由于设计的目的与一般普适的Platform SDK并不完全一致或者包容后者,在开发许多real world scenario 下的具体应用时,仍需要依赖Inter OP来使用现有COM组件的接口(关于.NET的本质是COM的论述,实际上也有不少相关文章可供参考,读者可自行利用谷歌雅虎百度搜寻,亦可于水木社区dotNET讨论区的精华文章中寻找。)

事实上,无论是新的WLM SDK,或者旧的Messenger API,皆是安装有WLM后才注册在系统中的COM组件。而WLM Add-in与MSN Messenger API最大的不同,就是开发语言必须是基于.NET Framework 2.0的C#,C++/CLI,VB#,J#,抑或IronPython等脚本语言。本文将会以一个实际的例子来探讨如何以C#来开发WLM的 Add-In。

要启用插件功能,首先需要修改注册表项。在HKCU\Software\Microsoft\MSNMessenger新建DWORD项,名为AddInFeatureEnabled,值设置为1。或者将以下四行文本存为reg文件导入。




Windows Registry Editor Version 5.00





[HKEY_CURRENT_USER\Software\Microsoft\MSNMessenger]


“AddInFeatureEnabled”=dword:00000001

修改了注册表之后,登录WLM,在Option菜单中就会出现Add-ins选项,点击Add to Messenger,找到Add-In dll就可以加载了

打开VS 2005(亦可使用Visual C# 2005 Express Edition),建立Class Library工程,名为WLMAddintest,添加引用Messenger API(Project,Add Reference,COM,Messenger API Type Library),添加引用Messenger Client(Project,Add Reference,Browse,C:\Program Files\MSN Messenger\MessengerClient.dll)。

将CS文件改名为test.cs,并新建一个名为TestFrm的新窗体。

更改输出assembly的文件名为WLMAddintest.Test(Project,WLMAddintest Properties,Application,Assembly Name)。因为WLM Add-In对于文件名有着严格的限制,必须是namespace.classname.dll的方式,否则将不能加载。当然你可以使用匿名命名空间,这样就可以只生成test.dll让WLM加载。

Frame代码先省略,其中test.cs代码如下:




using System;


using System.Collections.Generic;


using System.Text;


using System.Windows.Forms;


using Microsoft.Messenger;





namespace WLMAddintest


{


public class Test: IMessengerAddIn


{


public MessengerClient m_client;


public Form frm;


public void Initialize(MessengerClient client)


{


m_client = client;


m_client.Shutdown += new EventHandler(this.Shutdown);





m_client.AddInProperties.Url = new Uri(“http://dev.feuvan.net/“);


m_client.AddInProperties.FriendlyName = “test add-in”;


frm = new TestFrm();


frm.Show();


}


public void Shutdown(object sender, EventArgs e)


{


frm.Close();


}


}


}

在以上部分代码中,我们建立了一个名为test的类,实现了IMessengerAddIn接口,而Initialize则是Add-In的入口。另外我们绑定了Shutdown事件,Shutdown事件是在Add-In被unload,用户登出WLM或者关闭WLM发生的。读者可以使用VS的Object Browser来浏览MessengerClient提供的接口(选中Reference中的MessengerClient,双击或者右键View in Object Browser)。

MessengerClient类共有五种事件,皆可绑定到自己定义的事件响应函数上。





















事件



事件描述



参数描述



EventHandler
IncomingTextMessage



文本消息传入时发生



IncomingTextMessageEventArgs有两个属性


string TextMessage和User UserFrom



EventHandler
OutgoingTextMessage



文本消息传出时发生



OutgoingTextMessageEventArgs有两个属性


string TextMessage和User UserTo



EventHandler
ShowOptionsDialog



用户点击Add-In的Settings时发生



N/A



EventHandler
Shutdown



Add-In被unload时发生



N/A



EventHandler
StatusChanged



有用户的状态改变时发生,如登入登出。



StatusChangedEventArgs有一个属性


User User

其中User类的属性有昵称,email,个人状态信息,状态,唯一ID,并有一个方法GetGroupNames,可以得到用户所在的组名。

MessengerClient类有三种属性:















属性



限制



作用



AddInProperties
AddInProperties



读写



设置Add-In的信息如名称,作者,描述,URL等



User
LocalUser



只读



当前登录用户的属性,包括昵称,email,个人状态信息,状态,唯一ID



string
SavedState



读写



提供Add-In存储空间。


由于WLM Add-In的安全限制,Add-In不能访问本地文件。所以配置等信息可以串行化之后保存在SavedState变量中,下次启动从这里读取。

MessengerClient类有三个方法:











方法



作用



void
SendActionMessage(string
actionText, **Microsoft.Messenger.User
userTo)



发送动作

void SendNudgeMessage(Microsoft.Messenger.User
userTo)



发送震动信息

void SendTextMessage(string
text
, **Microsoft.Messenger.User
userTo)



发送文本

至于这里的User参数,基本上都是相应IncomingTextMessage的时候传进来的UserFrom参数。例如:




void messenger_IncomingTextMessage(object sender, IncomingTextMessageEventArgs e)


{


Microsoft.Messenger.User from = (Microsoft.Messenger.User)e.UserFrom;


messenger.SendTextMessage(output, from);


}

从上面的例子我们可以看到,WLM Add-In SDK还是很弱的,基本上只能拿来写机器人用,当然了,现在MSN机器人层出不穷,也不新鲜了。

接下来,就让我们来看看Messenger API能干点什么,以及更高级的话题。

后续内容更精彩,敬请继续关注。

see also: Developing MSN/WLM Add-in Part.II

假期要看的书

向圣教主致敬
APUE
UNP

再浏览一遍
the c++ programming language
the standard c++ bible
effective c++
more effective c++
exceptional c++
design patterns

还有可能的话翻一翻
inside the c++ object model
c++ effective object-oriented software construction
the art of computer programming

BTW
中关村真是IT民工挥洒血泪的地方
沉痛

Zend Framework前瞻(二):0.2.0的新变化

本文内容已经不能适应当前 Zend Framework 版本(0.9+),请参阅更新的文章。20070407

0.2.0增加了以下内容

Zend_Cache
以文件,sqlite数据库或memcache为后端,通过ID和tag来标示数据,可以设定过期期限(以秒为单位),可以自动序列化(因此可以缓存任何数据)。
Zend_Cache类本身是一个工厂类,可以定制cache内容(前端)为Output,File,Function 和 Class。
不过,你可以用Zend_Cache_Core作为统一的访问方式。以下是一个官方手册的例子
require_once 'Zend/Cache.php'; $frontendOptions = array( 'lifeTime' => 7200, // cache lifetime of 2 hours 'automaticSerialization' => true); $backendOptions = array( 'cacheDir' => './tmp/' `` // Directory where to put the cache files); // getting a Zend_Cache_Core object $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
更多说明在此
http://framework.zend.com/manual/en/zend.cache.html
需要注意的是不同缓存的 id 不能重复,否则会有串扰,lol

Zend_Config
专门用于存储在文本中的配置处理
由 Zend_Config_Array,Zend_Config_Ini 和 Zend_Config_Xml 这三个有共同 父类 Zend_Config 的子类组成
ini 和 xml 可能用得会多点
看看官方例子就知道怎么用了
http://framework.zend.com/manual/en/zend.config.html
不过,这些类不是用来保存配置
Zend 官方说保存配置这件事情不归 ZF 管

Zend_Feed
现在用不着什么 lastRSS 之类的 homemade产品了
Zend_Feed_RSS 和 Zend_Feed_Atom ……或者就用 Zend_Feed 就可以帮你解析 feed
从网页中找到rss feed,修改节点内容,还可以输出为xml…… ZF 官方站点的rss feed就是用Zend_Feed 输出的
解析 feed 最简单
$feed = Zend_Feed::import($url);
…Zend_Feed::importFile($filename);
…Zend_Feed::importString($feedstring);
然后就rss内容就在$feed里了

Zend Google Data Client Library
与一系列 Google 服务交互的 APIs
Google Base, Calendar, Blogger, and CodeSearch 等等
这部分需要单独下载
http://framework.zend.com/download/gdata

其他还有 Zend_Acl, Zend_Registry, Zend_Session 等
但还未进入 stable 的状态,暂时不介绍了

Zend_Controller, Zend_View这块的 MVC 架构在 0.2.0 重新实现了
具体细节我还没有看,稍后为您介绍

另外现在 Zend Framework需要 PHP5.1.4 以上版本
建议用最新(20061106)的 PHP 5.2.0 规避一个htmlentity的缓冲区溢出漏洞

PHP 5.2.0

比较重要的改进:

增加 RFC1867 文件上传进度的 hook
JSON 和 ZIP 模块,前者默认启用
Windows版本支持 Apache 2.2 mod
PDO,PCRE,libsqlite,libmysql,openssl等更新与改进

最期待就是文件上传进度的 tracking 了
终于official了……

apache2.0.x -> apache2.2.x 的认证模块变化

Mars:/opt/trac# apache2ctl -M
……
auth_basic_module (shared)
authn_file_module (shared)
authz_host_module (shared)
authz_user_module (shared)
authz_svn_module (shared)
……
相对于2.0,2.2的身份和权限控制更加精细
当然这也是一大进步

刚刚升级到2.2的时候可能会不太习惯
原来的配置文件很可能出错
对于普通大众最常用的AuthType Basic + htpasswd格式密码文件来说
以下模块是需要加载的
auth_basic,用于basic方式认证
authn_file,提供基于文件的认证方式,其他还有dbm,dbd,ldap等。
在配置中加入AuthBasicProvider file启用这个module
由于这也是默认的Basic认证方式
所以也可以不写这行配置,和2.0配置文件兼容
authz_user,Require valid-user这样的配置需要这个module
加载了这些module之后基本就可以和以前一样工作了

authn是认证支持模块
共有authn_alias,authz_anon,authz_dbd,authz_dbm,authz_default,authz_file六个模块
具体用法可以查看官方网站的解释

authz是授权支持模块
共有authz_dbm,authz_default,authz_groupfile,authz_host,authz_owner,authz_user六个模块

authnz是认证和授权做在一起,只有一个authnz_ldap
auth_basic,然后用AuthBasicProvider ldap调用

另外,授权支持模块中
authz_host提供了Order allow,deny的基于主机名,IP或者环境变量认证
Order Allow,Deny
Allow from 10.10.1.0/24, feuvan.net
Deny from all

至于那个authz_svn是给svn认证用的。。
不知道是什么的就忽略我说的话吧
我就是在升级的时候svn和trac出错才来折腾的

Apache2 越来越高级配置越来越复杂
难怪那么多轻量级的应用转向 lighttpd 了
期待 lighttpd 1.5

xiaonei5q?

在Myspace即将入侵之际
我在水木社区看到xiaonei和5q联姻的消息
还有whois记录为证
我也查询了一下
Registrant:
Chen, Joseph
ATTN: XIAONEI.COM
c/o Network Solutions
P.O. Box 447
Herndon, VA. 20172-0447
Domain Name: XIAONEI.COM
Administrative Contact, Technical Contact:
Chen, Joseph [email protected]
CIAC
ATTN: XIAONEI.COM
c/o Network Solutions
P.O. Box 447
Herndon, VA 20172-0447
570-708-8780
Record expires on 18-Nov-2007.
Record created on 23-Oct-2006.
Database last updated on 24-Oct-2006 00:46:35 EDT.

有人说Joseph Chen就是陈一舟
但我怎么觉得像是networksolutionsprivateregistration的职员呢

不过如果联姻的事情是真的
10.24这天真的发生了很多事情
Firefox 2.0
Fedora Core 6
xiaonei5q

网站迁移到新IP

北京光环新网

最大的坏处是这对于教育网不是免费IP

好处是比原先铁通的还快不少

zzxy.feuvan.net 网页代理服务暂停
telnet串联到proxy.zzxy.org:26123继续运行

feuvan.net 提速,感谢杜总

[feuvan@sns1 feuvan]$ ping feuvan.net
PING feuvan.net (222.35.4.57) 56(84) bytes of data.
64 bytes from 222.35.4.57: icmp_seq=1 ttl=52 time=5.61 ms
64 bytes from 222.35.4.57: icmp_seq=2 ttl=52 time=5.78 ms
64 bytes from 222.35.4.57: icmp_seq=3 ttl=52 time=6.80 ms
64 bytes from 222.35.4.57: icmp_seq=4 ttl=52 time=7.13 ms
64 bytes from 222.35.4.57: icmp_seq=5 ttl=52 time=5.90 ms

铁通
C:\Documents and Settings\feuvan>ping feuvan.net
Pinging feuvan.net [222.35.4.57] with 32 bytes of data:
Reply from 222.35.4.57: bytes=32 time=2ms TTL=60
Reply from 222.35.4.57: bytes=32 time=3ms TTL=60
Reply from 222.35.4.57: bytes=32 time=3ms TTL=60
Reply from 222.35.4.57: bytes=32 time=2ms TTL=60

网通
feuvan@fvn:~$ ping feuvan.net
PING feuvan.net (222.35.4.57) 56(84) bytes of data.
64 bytes from 222.35.4.57: icmp_seq=1 ttl=50 time=29.8 ms
64 bytes from 222.35.4.57: icmp_seq=2 ttl=50 time=23.6 ms
64 bytes from 222.35.4.57: icmp_seq=3 ttl=50 time=16.8 ms
64 bytes from 222.35.4.57: icmp_seq=4 ttl=50 time=19.6 ms