我的.NET生活

活着便精彩!
随笔 - 41, 评论 - 680, 引用 - 66

导航

关于

标签

每月存档

最新留言

广告

【第1页/共6页,87条】
首页
前页
1
2005年04月16日

这几天在做IIS 6上Web Service (WSE 2.0)的性能测试。在这个过程中陆续发现和解决了一些问题。
其中有一个问题比较有意思。我和项目组的同事发现,不论我们用C#写的模拟客户端用多少并发量来连接Web Service,服务器端监测到的并发连接数(性能记数器中的Web Service\Current Connections)总是每客户端最高2个。这使得我们无法查看服务器在大并发量下的真切反应。
那么为什么服务器会对每客户端做出最高2个并发量的限制呢?
通过查找资料,我找到了问题的根源。原来,在HTTP 1.1 Spec中针对Persistent Connections提出了这样的Practical considerations:
Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion.
以上内容表明,为了提高HTTP响应时间以及避免产生网络堵塞,HTTP连接中的客户端不应该与服务器端建立超过2个的HTTP连接。如果有更多的请求需要,那么这些请求将被pipeline到这两个HTTP连接之中,并以异步的方式传送给服务器端。举个例子:有上百辆汽车(requests)想从天津开往北京,但是天津与北京之间最多只允许修建两条公路(HTTP connection),因此这些汽车要想从天津驶往北京的话,就只能走这两条公路。
但是,有时的确需要突破这样的限制。比如我一开始提到的性能测试,我需要用尽可能少的客户端程序来模拟尽可能多的用户访问,而不能为了模拟1000个并发量同时使用500台机器来测。那么应该怎样通过一个测试应用程序来产生指定的并发数量呢?
不难看出,为了提高单一测试应用程序所产生的并发量,就应该增加两个指标:网络客户端数量和单一客户端的HTTP连接数量。就我所知,可以通过以下两种方法来分别提高这两个指标。

方法一:使用AppDomain
在. NET中,一个AppDomain就被视为网络连接中的一个客户端,因此如果希望用一个测试应用程序模拟多个客户端,那么只须创建多个AppDomain 即可。需要注意的是,对于每一个AppDomain,最高2个的连接限额仍然存在,不同之处只是我们可以使用一个测试应用程序发送超过2个的并发请求了(现在为了模拟1000个并发量就不需要找500台测试机器了)。请看下面的代码:


AppDomain appDomain = AppDomain.CreateDomain("");
appDomain.ExecuteAssembly(@"TestClient.exe");
AppDomain.Unload(appDomain);

在这里,我通过调用AppDomain的静态方法CreateDomain创建了一个新的应用程序域,并要求该应用程序域执行一个应用程序 TestClient.exe。该应用程序将负责向服务器发送请求(最多只能建立两个连接)。你可以通过多线程的方式来驱动上述代码,使得大量应用程序域在近乎相同的时间里被创建,从而就可以模拟指定数量的客户端,并产生所希望的并发访问量。

方法二:使用配置文件
除了增加客户端数量以外,我们还可以增加单一客户端所能建立的HTTP连接数量。在.NET中实现这一目标非常容易,只需要在客户端(没错,是客户端!)的配置文件中增加以下几行即可:

<system.net>
 <connectionManagement>
  <add address="*" maxconnection="100"/>
 </connectionManagement>
</system.net>

其中,connectionManagement节点负责指定客户端与某一网络主机之间所能建立的最高连接数量。它在Machine.config文件中的默认取值就是2。我们完全可以在应用程序级的配置文件中对这一限额做出更改。address属性表明该连接限额针对的是哪一个网络地址,*表明所有的网络主机;如果写成address="
www.google.com"就表明后面的maxconnection只适用于对google的访问。
好了,现在就可以根据自己的需要来更改配置了。如果你把maxconnection的取值改成了1000,那么你的测试应用程序与服务器之间所能建立的最高连接数量就是测试用应用程序域的数量 * 1000,测吧!

posted on 2005-04-16 00:40:00 by musicland  评论(20) 阅读(7136)

 
2005年01月24日

昨天不经意间在网上找到了这么一款软件——SphereXP (http://www.hamar.sk/sphere/),应用它可以把自己桌面变成一个3D的球体空间,而自己正处于这个球体的中心。桌面所有的应用程序、图标文件等都变成了3D空间中的一分子,可以随便移动、旋转、拉伸。一时间自己的桌面竟然变得异常丰富,甚至还多了几分神秘!而自己那不分昼夜的“用电脑体验”也变得“爽”起来,因为我发现坐在电脑面前除了要面对大量待解决的问题之外,竟然还多出了一个奇异的世界,工作的时候还可以在天地间转来转去,像上帝一样给万物(应用程序)安排生息,一种乐趣不由得油然而生。我甚至想,如果谁能写一个CS的桌面环境,每天打开电脑就像进入了CS世界,在A门打开Visual Studio,到B院里写代码,写累了就到处涂鸭发泄一番……嘿嘿!

 

其实我想,这种软件和其它的桌面装饰工具软件一样,都属于创意有余、而实用性不足。有些软件很花哨,乍一看效果非常酷,但用长了以后就会产生审美疲劳,经不住长时间的使用;而另一些则干脆把简单问题复杂化。比如说我用过一个Alt-Tab的替代软件,一按Alt-Tab后就会跳出一个非常绚的界面,把桌面上所有应用程序的缩略图显示在上面,非常容易辨认。可是即使为了移动到相邻的应用程序,我也要再按一下方向键,或者点击鼠标,相比之下,还不如传统地只按一下Alt-Tab方便。

 

不过,这一类软件的价值也是不可忽视的,那就是带给我们一种全新的体验,让我们在routine之中也能获得一丝不经意的快乐,带来一种灵感。而这种快乐和灵感是无法完全用经济性和易用性来衡量的(这可只是我个人在特定情况下的看法,千万别推而广之说我是反对软件易用性的哦)。有的时候,甚至一张简单的壁纸或者一套全新的桌面主题都能让我浮想联篇,从而激发出某种灵感来。这让我想起了前段时间北京的MVP和微软Visual Studio产品组的一次座谈,有一位MVP就提出了希望能有一些与开发相关的壁纸或者主题,能够让他从中获得一些启示。我想有这样需求的肯定不止他一位吧。

 

当然,除了软件和桌面环境之外,我想还有很多事物能帮我们驱散疲劳,带来灵感。比如说在工作台上放一盏台灯,在温馨的桔黄色中体会那种安静的感觉。或者在身边放一个小书架,把自己喜欢的书放在上面,让它们陪着自己一起工作、学习,就像好朋友陪在身边一样。另外,在为解决问题而凝思苦想的时候,品一口绿茶有时也能让自己从看待问题的惯性思维中解脱出来,而灵感也或许就从中迸发出来。经常看Channel9 (http://channel9.msdn.com) 的朋友们肯定会发现,微软总部员工的办公室就是这方面的最好例子。每个人都可以按自己的喜好来布置自己的办公室,有的看上去像个温暖的小家,有的看上去则像个画室,还有的甚至把大型游戏机搬到办公室来,在工作累了的时候就叮叮当当一番。然而不论怎样,他们都把身边的环境布置得最舒适、最有创意,同时最重要的,最能激发出他们工作的热情。

posted on 2005-01-24 18:20:00 by musicland  评论(15) 阅读(5258)

 
2004年11月07日

最近,我所在的团队利用业余时间在帮北邮举办的“北京邮电大学微软移动开发大赛”做技术支持。和同学们做了几次交流之后,我们发现大多数同学还对Windows Mobile开发了解甚少,他们非常希望能找到一条方便、可行的入门途径。因此我昨晚写了一篇介绍如何搭建Windows Mobile开发环境的文章,主要目的是帮助北邮参加移动开发大赛的同学们(以及所有想了解Windows Mobile开发的朋友们)熟悉和建立Windows Mobile开发环境。文章在这里

posted on 2004-11-07 04:54:00 by musicland  评论(13) 阅读(5367)

 

内容简介

本文描述了如何搭建典型的Windows Mobile开发环境。介绍了相应的IDESDK及辅助开发工具的安装及常用配置,并对Windows Mobile下一代开发环境的发展前景做出展望。本文适合初次接触Windows Mobile开发的开发人员。

Windows Mobile开发简介

Windows Mobile是微软公司操作系统产品线上重要的一环。与Windows 9x/NT/XP/2003相比,Windows Mobile作为完整产品线出现在公众面前的时间非常短,但它的发展却异常迅速,而在这一发展过程中,开发人员提供了绝对关键的推动力。现在,越来越多的开发人员(特别是.NET开发人员)希望能尽快进入Windows Mobile的开发领域,而他们所面临的首要问题,除了熟悉Windows Mobile平台特性之外,便是如何搭建适合的开发环境。因此,本文就将从如何搭建一个Windows Mobile开发环境入手,对Windows Mobile平台的开发特性进行概要描述,以期帮助开发人员迅速进入Windows Mobile开发领域。

在展开本文的内容之前需要说明的一点是,Windows Mobile平台开发主要包含以下两方面内容:

l         平台级开发

l         应用级开发

因为Windows Mobile平台构建于微软的Windows CE系列操作系统之上(当前正式商用版本为Windows CE .NET 4.21),而Windows CE操作系统具有非常良好的模块化特性,因此开发人员,特别是手机设备厂商,可以通过微软提供的Platform BuildereMbedded Visual C++(以下简称为eVC)非常方便地定制自己所需的操作系统。这对应的是上面所说的平台级开发。

然而,绝大多数的开发人员并不需要去构建一个全新的、个性化的系统,他们只需要关心如何构建能够运行在Windows Mobile设备上的应用程序。为此,微软按主要智能设备自身硬件设备特性的不同以及用户体验的差异,定制出了Windows CE .NET 4.x系列操作系统的两个主要分支,分别安装在不同的Windows Mobile硬件设备中,从而也就构成了我们通常所说的Pocket PCSmartphone。以下内容中的Windows Mobile开发,除特指之外,均表示Pocket PC/Smartphone开发。

本文中提供的大量开发工具,除单独标出的以外,均可在http://msdn.microsoft.com/mobility/downloads/default.aspx下载。

迅速搭建开发环境

为了进行Windows Mobile开发,我们需要搭建相应的开发环境。所幸的是,这一环境搭建起来非常简单。

安装Visual Studio .NET 2003

为了降低Windows Mobile的开发难度,提高开发人员的开发效率,微软把.NET Framework移植到了Windows Mobile设备上,针对Windows Mobile设备及Windows CE .NET操作系统设计了.NET Compact Framework(以下简称.NET CF)。而Visual Studio .NET 2003正是开发.NET CF应用程序的最佳IDE。在Visual Studio .NET 2003的安装中默认集成了.NET CF 1.0,同时提供了Pocket PC 2002的开发模板,可以直接用来开发Pocket PC 2002应用程序。

您也可以选择Visual Studio 2005作为开发工具,目前最高版本为Beta 1 Refresh。在Visual Studio 2005中,默认提供了Pocket PC/Smartphone 2003 SE(第二版)的开发模板,同时将Pocket PC 2003 SE开发使用.NET CF版本升级到2.0 (beta)

安装eVC (可选)

以上环境已经完全可以基于.NET CF开发Windows Mobile应用程序。但如果您想使用C/C++语言来进行native开发,或者想在Windows Mobile设备上开发COM组件及应用,那么可以选择eVC作为开发工具。目前eVC的最高版本为4.0 + SP4,请确保安装了最新的补丁包。

也许您会问:既然已经有了Visual Studio .NET环境,为什么还要使用eVC作为开发工具呢?这主要是因为,当前的.NET CF功能相对而言还很不完整,有很多Windows CE .NET操作系统的核心功能没有被封装入.NET CF,如:加密/解密、网络底层通讯、COM互操作、RAPI等等。为了完成上述操作,我们或者使用平台调用(P/Invoke)以托管方式开发,或者使用eVC直接针对系统底层进行native开发。对于COM互操作,目前.NET CF还不提供COM互操作(Interop)机制,只能使用eVC进行C/C++ COM开发。好消息是,在.NET CF 2.0中将提供功能强大的COM互操作特性支持,同时也将在Visual C++ 2005环境中同时提供managednative开发功能,这样所有的开发工作将完全整合在Visual Studio 2005同一环境中。

安装Pocket PC/Smartphone 2003 SDK

为了开发Pocket PC 2003Smartphone 2003应用程序,您还需要安装Pocket PC 2003 SDKSmartphone 2003 SDK。值得注意的是,这两款SDK中所包含的模拟器均为英语环境,如果您想使用简体中文环境的模拟器,请去微软网站上单独下载。

如果您使用Visual Studio 2005开发Windows Mobile应用程序,则不需要单独安装相应的SDK,因为SDK已经被默认集成至了Visual Studio 2005环境中。

SQL Server CE (可选)

这是Pocket PC上推荐使用的嵌入式数据库产品,它与SQL Server桌面版之间可以实现良好的数据同步及互操作,目前正式版的最新版本为2.0。在SQL Server 2005 Beta 2测试版中,包含有SQL Server CE 2.0的升级版本SQL Server 2005 Mobile Edition——不过该版本目前只支持Pocket PC 2003系统。预计SQL Server Mobile Edition在下一个版本中才能提供对Smartphone的支持。

ActiveSync环境搭建

在完成了上述开发环境的搭建之后,您就可以在Visual Studio .NET中开发和调试应用程序,并在设备/模拟器中进行部署。但是,如果您还需要进一步执行下述操作,那么请按本节所述继续搭建ActiveSync环境。可能的执行操作包括(但不限于):

l         向设备/模拟器中复制文件

l         从设备/模拟器中删除文件

l         与设备/模拟器同步数据

l         开发和调试包含RAPI (Remote API)功能的应用

l         ……

安装ActiveSync

ActiveSync是一款管理Windows Mobile设备连接、与PC进行数据同步的工具。如果您开发时使用的是真实设备,则最好事先安装ActiveSync使之与PC机连接。如果您使用的是模拟器,则除了安装ActiveSync以外,还需要安装下述工具。

安装Connect Emulator with ActiveSync

如果您使用的是模拟器软件,除了安装ActiveSync外,还必须安装Connect Emulator with ActiveSync这款工具软件。它将使您可以直接通过ActiveSync连接到模拟器上。

辅助工具介绍

除了上述基本开发工具以外,在Windows Mobile开发社区中还存在着大量的辅助工具,包括应用程序框架、工具、控件等等。其中有一些由于定位准确、制作优良、使用方便,已经成为Windows Mobile开发不可或缺的好助手。以下列出其中的一部分,更多的还存在于Windows Mobile开发者社区及互联网上,等待着您去发现。

OpenNETCF.org Smart Device Framework

由几位长年活跃于Windows Mobile开发者社区的MVP共同开发的OpenNETCF.org Smart Device Framework (以下简称为SDF),几天前刚刚获得了Pocket PC Magazine评出的2004年度最佳.NET开发框架大奖。熟悉SDF的开发者都会认为,对于这一奖项,OpenNETCF的确当之无愧,因为SDF几乎已经成了Windows Mobile开发者不可或缺的工具。他们对.NET CF的不足给出了及时的弥补,在SDF中,您可以找到ConfigurationXML Serialization NotificationInterop ServicesWSE 2.0等一系列.NET CF当前版本尚未提供的功能,以及诸如ListBoxEx等优秀的控件。更值得一提的是,SDF是一项完全免费的开源项目。这几位MVP为整个Windows Mobile开发者社区所做的贡献也许真的无法用金钱来衡量。

下载地址:http://www.opennetcf.org

Windows Mobile Developer Power Toys

这是微软继Pocket PC/Smartphone 2003 SDK之后为开发人员提供的另一套开发辅助工具集。其中包含不少非常值得一用的优秀工具,如:

l         ActiveSync Remote Display:把连接在PC上的智能设备影像通过PC屏幕放大显示

l         CECopy:以命令行的方式向所连接的智能设备传输文件

l         Hopper:用于Pocket PC 2003的用户输入压力测试工具

l         PPC Command Shell:用于Pocket PC 2003的命令行工具

l         TypeIt:用于Smartphone 2003的辅助文字输入工具

l         ……

Mobile Application Development Toolkit 2004

这是微软近期推出的Windows Mobile开发工具及资料集,其中包含上述所有产品及工具,以及一系列相关的文档、教程及参考资料。

结束语

好了,对于如何搭建Windows Mobile的开发环境就介绍到这里了。可以肯定地说,随着微软公司支持力度的增加和Windows Mobile开发者社区的成熟,Windows Mobile开发将面临越来越有利的良好环境。

posted on 2004-11-07 04:36:00 by musicland  评论(109) 阅读(77423)

 
2004年10月21日

在平时用电脑的过程中,我喜欢隔段时间就把鼠标左右调换一下,一来是想让自己一侧的肩、手臂、手腕能得到休息,尽量避免因长期固定姿势使用鼠标而带来的身体不适,另一方面也因为我本来就是个左撇子,喜欢尝试给两只手均等的做事机会。

当然,自从我给电脑同时接上左右两只鼠标以后,来回调换鼠标是避免了(据我所知,有在电脑上接三四只鼠标的,真是厉害!),但系统对于鼠标左右键的安排却不听我的调换,还要费力地去控制面板中设置一番,非常麻烦。因此我想,何不写几行代码,让鼠标左右键能在最短的时间内左右切换呢?这主意不错!OK,马上到MSDN里查找一番,十几分钟写出了下面这个小程序。

文章请见这里

posted on 2004-10-21 16:10:00 by musicland  评论(10) 阅读(3684)

 

在平时用电脑的过程中,我喜欢隔段时间就把鼠标左右调换一下,一来是想让自己一侧的肩、手臂、手腕能得到休息,尽量避免因长期固定姿势使用鼠标而带来的身体不适,另一方面也因为我本来就是个左撇子,喜欢尝试给两只手均等的做事机会。

当然,自从我给电脑同时接上左右两只鼠标以后,来回调换鼠标是避免了(据我所知,有在电脑上接三四只鼠标的,真是厉害!),但系统对于鼠标左右键的安排却不听我的调换,还要费力地去控制面板中设置一番,非常麻烦。因此我想,何不写几行代码,让鼠标左右键能在最短的时间内左右切换呢?这主意不错!OK,马上到MSDN里查找一番,十几分钟写出了下面这个小程序。

1. SwapMouseButton

根据MSDN所述,可以通过调用SwapMouseButton这一API来实现鼠标左右键功能互换,Windows控制面板中的相关设置也是通过调用该API来实现的。该API存在于user32.dll文件中,它的原型是:

BOOL SwapMouseButton(
   BOOL fSwap
);

我们可以在.NET工程中通过P/Invoke轻松声明对该API的调用。我写的调用声明如下:

// P/Invoke declarations
[DllImport("user32.dll")]
private extern static bool SwapMouseButton(bool fSwap);

其中,fSwap是唯一需要传入的参数,当它的值为true时,系统会把鼠标左右键功能进行互换(即换成左手鼠标);当它的值为false时,系统会把鼠标左右键功能还原为默认状态(即右手鼠标)。因此,当我想使用左手鼠标时,只需向SwapMouseButton方法传入一个true变量即可实现,非常方便。

2. SystemParametersInfo

除了调用SwapMouseButton来实现鼠标左右值功能切换之外,Windows还提供了另外一个实现同样效果的API:SystemParametersInfo。根据MSDN,该API的原型是:

BOOL SystemParametersInfo(
UINT uiAction,
UINT uiParam,
PVOID pvParam,
UINT fWinIni
);

用C#可以进行如下声明:

[DllImport("user32.dll")]
private extern static int SystemParametersInfo(uint uiAction, uint
uiParam, IntPtr pvParam, uint fWinIni);

其中,uiAction指定一个需要获取的系统参数,如屏幕大小、分辨率、鼠标配置等,如果传入参数SPI_SETMOUSEBUTTONSWAP就可以用来设置鼠标功能切换;当向uiParam参数传入正值时,系统就会把鼠标左右键功能进行互换(即换成左手鼠标),当向uiParam传入0时,系统还会把鼠标功能还原成默认状态(即还原为右手鼠标)。

由此,我们需要在uiAction位置传入SPI_SETMOUSEBUTTONSWAP。不过很明显,SPI_SETMOUSEBUTTONSWAP只是C语言中#define编译预定义指令所定义出的一个常量,我们必须在C#代码中对它进行重新定义。OK,打开Winuser.h头文件,在其中搜索SPI_SETMOUSEBUTTONSWAP,找到如下定义(位于8623行):

#define SPI_SETMOUSEBUTTONSWAP  33

可见,SPI_SETMOUSEBUTTONSWAP定义的是整型值33,这样我们就可以在C#中做出如下定义:

private const uint SPI_SETMOUSEBUTTONSWAP = 33;

3. GetSystemMetrics

通过上述两种方法,我们都可以轻松地实现鼠标功能切换了。不过,在每次切换之前,如果我们的应用程序能够获知系统当前的鼠标设 置,那么就可以决定该向哪个(相反)方向进行切换,从而给使用者带来一种更好的用户体验。那么该怎样才能获知当前系统的鼠标设置呢?GetSystemMetrics可以解决这一问题。

根据MSDN,GetSystemMetrics的原型是:

int GetSystemMetrics(
int nIndex
);

其中nIndex参数有SM_SWAPBUTTON值可选,SM_SWAPBUTTON在Winuser.h头文件中的定义是:

#define SM_SWAPBUTTON  23

我们可以在C#中如此定义SM_SWAPBUTTON:

private const int SM_SWAPBUTTON = 23;

声明GetSystemMetrics:

[DllImport("user32.dll")]
private extern static int GetSystemMetrics(int nIndex);  // Updated 04.10.22. Many thanks to JGTM'2004 [MVP]

当GetSystemMetrics返回0时,表明当前系统鼠标设为默认状态(右手鼠标),否则表明鼠标已被设为左手鼠标。这样,我们就可以在切换鼠标状态之前获知系统的当前鼠标状态,从而可以做出相反方向的切换了。

OK,把上述几点连起来,就可以轻松写成一个能快速切换鼠标功能键的小程序了。我把这个小程序放在系统托盘里,只需单击一下它的图标就能在左手和右手鼠标之间进行快速切换,同时通过图标的方向变化来指示当前的鼠标状态。这样我就再也不必为切换鼠标的事而头疼了:)

posted on 2004-10-21 16:07:00 by musicland  评论(18) 阅读(8161)

 
2004年09月26日

 

 

在用.NET CF开发Smartphone/Pocket PC应用时,我们经常需要给应用程序增加提醒功能,比如在下午两点时提醒用户去开会,或者在手持设备和PC通过ActiveSync连接时提醒用户同步某项重要数据。目前,实现提醒功能主要有以下几种方式:

  1. Windows CE .NET提供了CeSetUserNotification(CE 2.11版本及以后又增加了CeSetUserNotificationEx)这一API,可用于创建或修改提醒。该方法适用于SmartphonePocket PC
  2. Windows CE .NET还提供了另外一条APISHNotificationAdd,也可以完成提醒的工作。该提醒是以Pocket PC中的气泡方式显示的,在Smartphone上不予处理。
  3. Windows CE .NET中内置了Pocket Outlook,并提供了POOM (Pocket Outlook Object Model)以便二次开发。该方法适用于SmartphonePocket PC

 

全文请见这里: http://blog.joycode.com/musicland/articles/34511.aspx

 

posted on 2004-09-26 13:25:00 by musicland  评论(11) 阅读(4454)

 

在用.NET CF开发Smartphone/Pocket PC应用时,我们经常需要给应用程序增加提醒功能,比如在下午两点时提醒用户去开会,或者在手持设备和PC通过ActiveSync连接时提醒用户同步某项重要数据。目前,实现提醒功能主要有以下几种方式:

 

  1. Windows CE .NET提供了CeSetUserNotification(CE 2.11版本及以后又增加了CeSetUserNotificationEx)这一API,可用于创建或修改提醒。该方法适用于SmartphonePocket PC
  2. Windows CE .NET还提供了另外一条APISHNotificationAdd,也可以完成提醒的工作。该提醒是以Pocket PC中的气泡方式显示的,在Smartphone上不予处理。
  3. Windows CE .NET中内置了Pocket Outlook,并提供了POOM (Pocket Outlook Object Model)以便二次开发。该方法适用于SmartphonePocket PC

 

以上三种方法在开发时,均不同程度地要用到平台调用 (Platform Invoke) COM互操作,这对开发人员的技术要求非常高,同时也不利于提高开发速度。因此,适当的封装是非常有必要的。幸运的是,目前OpenNETCF.org (http://www.opennetcf.org) 已经完成了前两项的工作,在由OpenNETCF开发并免费发放的SDF (Smart Device Framework) 中已经把上述前两项API封装为managed API,从而极大地减少了开发人员的二次开发难度。同时,InTheHand公司 (http://www.inthehand.com) 也提供了一款非常棒的组件——Pocket Outlook,用managed code封装了底层的COM互操作,从而使开发人员从细琐的底层细节摆脱出来。不过,InTheHand这款组件只免费提供测试版,如需要在商业环境中使用还需支付费用。

 

下面我就通过一系列实例来说明上面几种方法的应用。

 

1. OpenNETCF.Win32.Notify

OpenNetCF.orgSDF中的OpenNETCF.Win32.Notify命名空间下封装了CESetUserNotification(以及相应的一套API),使用后只需要短短几行代码就能实现简单的提醒功能,如下例,可以在Smartphone/ Pocket PC 2003上设置一个1分钟后弹出的提醒对话框(需要增加对OpenNETCF.dll的引用):

 

UserNotification notification = new UserNotification();

notification.Action = NotificationAction.Dialog;

notification.Title = "我的提醒";

notification.Text = "别忘了锻炼!";

 

Notify.SetUserNotification("", DateTime.Now.AddMinutes(1), notification);

 

实现效果如下:

 

 

1: Smartphone上应用OpenNETCF.Win32.Notify的效果

 

 

2: Pocket PC上应用OpenNETCF.Win32.Notify的效果

 

如果想修改某项提醒,只需调用Notify.GetUserNotificationHandles返回所有当前系统存储着的提醒的句柄(handle),然后根据其中特定的句柄调用Notify.GetUserNotification就可获得相应的提醒对象,调用Notify.SetUserNotification)来修改该提醒。比如下例,就把刚才设置的提醒内容做了更改:

 

// 获取提醒对象 (UserNotificationInfoHeader类型)

UserNotificationInfoHeader infoHeader =? Notify.GetUserNotification(handle);

// 取出UserNotification部分并做更改

UserNotification notification = infoHeader.UserNotification;

if (notification != null)

{

notification.Text = "别忘了开会!";

Notify.SetUserNotification(handle,"", DateTime.Now.AddSeconds(18), notification);

}

 

2. OpenNETCF.Notification

以上方法对Smartphone 2003Pocket PC 2003同样生效。而对于Pocket PC 2003而言,还有另外一种设置提醒的方式——弹出气泡。该方法对应的操作系统APISHNotificationAdd,在SDF中该API被封装在OpenNETCF.Notification命名空间下。下述代码演示了这种用法(需要增加对OpenNETCF.Notification.dll的引用):

 

Notification notification = new Notification();

notification.Duration = 10;

notification.Flags = NotificationFlags.ForceMessage;

notification.HTML = "Hello Windows Mobile";

notification.Title = "Hi";

 

NotificationEngine engine = new NotificationEngine(OpenNETCF.Security.Cryptography.NativeMethods.Guid.NewGuid());

engine.Add(notification);

 

注意,这里是通过调用NotificationEngine.Add()方法来把一个气泡提醒增加到拖盘(tray)中。

 

 

3: Pocket PC上应用NotificationEngine.Add的效果

 

同样,我们可以通过调用NotificationEngine.Remove来删除某项提醒,NotificationEngine.Update来更新提醒,NotificationEngine.GetData方法来获取提醒内容。它们所封装的系统API分别是SHNotificationRemoveSHNotificationUpdateSHNotificationGetData

 

3. InTheHand.PocketOutlook

 

通过InTheHand封装好的PocketOutlook dll,我们可以非常方便地利用Pocket Outlook所提供的强大功能。比如下面的例子演示如何通过几行代码来在本机的Pocket Outlook中增加一项约会,你可以利用类似的方法来增加联系人、日程信息等等(需要增加对InTheHand.Interop.dllInTheHand.PocketOutlook.dll的引用):

 

using (OutlookApplication oApp = new OutlookApplication())

{

using (Appointment oAptmt = oApp.CreateAppointment())

{

oAptmt.Subject = "提醒";

oAptmt.Body = "别忘了锻炼!";

oAptmt.Start = DateTime.Now.AddHours(1);

oAptmt.BusyStatus = BusyStatus.OutOfOffice;

oAptmt.Save();

}

}

 

实现效果如下:

 

 

4: Smartphone上应用Pocket Outlook增加约会

 

 

5: Pocket PC上应用Pocket Outlook增加约会

 

 

posted on 2004-09-26 13:17:00 by musicland  评论(24) 阅读(14876)

 
2004年08月17日

最近写了一个Smartphone 2003应用程序安装工具,可以在很大程度上简化Smartphone 2003应用程序的打包和安装。它的原理非常简单,就是调用CabWizSP.exe生成CAB包(需要手动写inf文件),然后调用一个第三方的ezsetup.exe工具来生成安装文件,在建立与Smartphone(真机or模拟器)连接之后执行自动安装。

 

以下是这款工具的部分运行界面及描述:

 

 

程序主界面。大多数情况下,用户只需选取一个安装信息文件(.inf)再点击”Generate”就可以了。

 

 

安装文件生成成功的提示。

 

 

应用程序配置界面。如果需要进一步的配置(比如配置Prexml/PostXml/Platform等),用户可以在主界面点击”Options…”进入这里。

 

因为这工具主要是在目前所在的项目组里用,所以我在保证所需功能完整的前提下,尽可能地做了简化。本想再写一个inf文件的可视化开发界面,但在用的过程中发现inf配置虽然相对复杂,但大部分内容都可以基于现有配置文件做少量更改实现,所以也就放弃了进一步开发的想法。

 

大家如果对Smartphone部署感兴趣,可以参考下面这篇文章:

Smartphone 2003 Application Deployment Demystified

posted on 2004-08-17 19:31:00 by musicland  评论(12) 阅读(6941)

 
2004年06月17日
今天在做一个VSTO (Visual Studio Tools for Office)的示例时遇到了点儿麻烦,一开始百思不得其解,后来找到问题的根源之后发现蛮有意思的,写出来和大家分享一下。笑脸

posted on 2004-06-17 21:50:00 by musicland  评论(12) 阅读(4228)

 

今天在做一个VSTO (Visual Studio Tools for Office)的示例时遇到了点儿麻烦,一开始百思不得其解,后来找到问题的根源之后发现蛮有意思的,写出来和大家分享一下。

?

问题是这样的,我想在Word文档中通过Linked Assembly使用System.Xml命名空间中的功能,最简单的就是用XmlDocument载入整篇XML文档,然后再通过XPath查询取得所需的数据。这个在.NET开发时也经常遇到(是不是太小儿科了?),所以我就随手写了份XML文档作读取的测试,这份文档的内容如下:

?

?????

?????

?

XML文档的正确性先不说,我接着又在VSTO项目中增加一个辅助类用来读取这份xml文档并取出其中所有book的信息,然后在code behind文件里 (ThisDocument.cs)调用这个辅助类及相应方法来获取这些信息,然后在指定位置创建表格进行显示。OK,一切好像都进行得很顺利,可当Word文档运行时就是无法读出XML信息,也没有任何错误提示。这是怎么回事?

?

为了找到错误,我打开VS.NET的调试器,根据应用程序的运行,发现每当运行到下面这行代码之后,代码执行马上结束:

?

doc.LoadXml(this._fileFullPath);

?

怎么,无法正确读入XML文档?难道XML语法有误?这么一想,我再回过头仔细检查一下上面那份XML文档的代码,果然发现了问题——属性值应该包含在括号里,id=1应该写成id=”1”

?

看来错误应该找到了(而且是个低级错误),可是为什么Word在运行的时候一点儿错误的提示都没有呢?带着这问题又查了查帮助文档,果然有解答:

?

When you are developing Visual Studio Tools for Office projects you will find that if an exception occurs, it will not be shown in the Office application and execution of your code will simply end at that point. This can make it difficult to find and resolve bugs.

?

原来Word(以及Excel)在运行与之关联的.NET assembly时,一旦运行出错不会给出任何提示,从而也就出现了我上文中所提到的那种情况——应用程序运行非常“顺利”,但指定功能却无影无踪了。

?

文中还给出了两种解决办法:

?

You should include exception handling code in your projects to notify users of any issues. However, when debugging you can set the debug options to notify you of errors: in the Exceptions dialog box, change the When the exception is thrown option to Break into the debugger. Using this setting may result in you being notified that msosec.dll is not found. This error is not directly associated with your code and you can continue past it.

?

简而言之,我们可以通过手动增加错误例程处理(比如try… catch)来捕捉出错的迹象,另外也可以像上面英文资料中提示的那样,更改“异常”对话框(在“调试”-“异常”菜单中)中的相应设置,来达到出错时返回调试器的作用(必须是在调试状态下才可以)。这样,就可以在开发VSTO应用时即时捕捉到异常,并能尽早解决问题。

?

posted on 2004-06-17 21:46:00 by musicland  评论(5) 阅读(3496)

 
2004年06月12日

昨天把收到的Longhorn (build: 4074)装在自己的开发机器上,算是迟迟地体会了一把Longhorn的威力。

因为还没有下载完SDK,所以我的体会仅限于Longhorn所提供给最终用户(以及管理人员)的一些新特性,其中比较让我感兴趣的就是IE中的新增功能——Download Manager。

其实类似的工具早已经在其它的游览器中提供了,也有一些第三方的很棒的工具,比如Flashget等。我个人感觉,IE所提供的Download Manager最主要的目标不是提供一套完整的下载以及下载过程/文件管理工具,而是直接针对IE本身进行一种Add-on嵌入,帮助用户对下载过程和下载文件进行简单的管理,比如设定和修改下载优先级(High/Background/Suspended),提供安全警告,显示下载进度,断点续传等等。同时,Download Manager让用户可以很方便地定位已经下载的文件,而此前经常会发生用户下载完以后却找不到文件的情形。另外,在下载提示对话框中就已经显示了即将要下载的文件的大小,而在原来,只有真正去下载该文件才能看到文件大小的提示。

从整体上来看,Download Manager对用户的下载过程起到了很有必要的帮助。虽然我们很可能还要寻找一些专业下载工具的支援,但至少在系统自身里已经提供了这样的辅助功能。我想这样的进步本身就已经让人感到由衷的高兴了,呵呵。

BTW:用过微软的File Transfer Manager (通常在MSDN/MCT下载站点中提供)的人能一眼就看出,Download Manager与前者如出一辙,可能它们走的是同一条技术路线吧。笑脸

下载提示对话框,可以显示要下载的文件的大小

Download管理界面

Download Manager的设置选项,这里和File Transfer Manager几乎一模一样

posted on 2004-06-12 13:01:00 by musicland  评论(17) 阅读(5120)

 
2004年06月11日

前天,我开发机器上的POP3/SMTP服务出了问题,一时无法解决,于是就在MSN Messenger上找严诺(Nuo Yan)求助。因为问题涉及的面比较广,文字沟通很难说清楚,所以我邀请他进行了一次远程协助(Remote Assistance)。

首先是发现MSN Messenger中的远程协助功能失效,软件提示要安装最新版本的Windows Messenger。于是下载安装Windows Messenger 5.0,重新登陆,终于进入了远程协助的界面。

我请严诺直接控制我的本机(他在汕头,我在北京),他用最快的速度排除了我DNS设置中的一个问题(该问题来自于我的Server 2003一开始设置为动态获取IP和DNS地址,该机器同时是Domain Controller和DNS Server),然后检查POP3/SMTP中的设置。在这个过程中遇到了一串怪问题,最后SMTP的management console竟然在Inetmgr里失踪了,以致最后的时间几乎完全花在寻找SMTP management console上。

整个过程大概持续了一个半小时,SMTP management console还是找不见,不过随后当我按http://support.microsoft.com/default.aspx?scid=kb;en-us;323350这篇文章中给出的方法对本机POP3/SMTP服务进行测试的时候,竟然发现邮件已经收发自如了,这更让我觉得奇怪,难道SMTP management console的失踪是个bug?还是我的操作有误?

不过,我真的要在这儿再次感谢严诺的无私帮助,特别是后来他对我问题的解答更让我受益:

musicland: 你说我有没有必要找时间学一学Windows Server 2003方面的知识呢?

Nuo Yan: 非常有必要,对系统的了解会有助于开发的。马骐老师就是两方面都很精通。

(因为Windows Messenger中没有聊天记录存储功能,所以以上对话内容是我凭印象记忆的笑脸

posted on 2004-06-11 12:27:00 by musicland  评论(33) 阅读(19568)

 
2004年04月16日

这几天,连我身边不做技术的朋友都给我发来邮件,说“你好像很久没更新你的blog了”。

 

是啊,这段间隔真的很长。在这段时间里,我经历了太多的伤痛,经历了太多的意外,整个人的心态已经很难再恢复平静,很难再去埋下头来认认真真地写代码,仔仔细细地写文章了。

 

身在上海的朋友们(in or out of 博客堂)可能对前段时间发生在浦东华丰路的一次天然气事故的报道还有印象。没错,事故的三位受害人就是我的朋友。他们最小的才23岁!整个一段时间,我都在上海为他们送行,陪其中一位朋友的父母,让他们能慢慢恢复过来。在那段日子里,我没写过一行代码,没看过一篇技术文章,因为自己真的不在状态。

 

现在发现,人的心态真的是决定一切。当一个人沉浸在痛苦之中时,他很难再去做工作或生活上的努力;而当他终日斗志昂场、干劲十足的时候,没有什么克服不了的困难。我身边以及MSN上的朋友都知道,我平日里是属于后者的,什么困难都敢去拼。现在,我真的应该好好地把自己的心情带出来,让自己迅速重返原来的状态,重返博客堂。

posted on 2004-04-16 08:43:00 by musicland  评论(19) 阅读(5616)

 
2004年03月19日

MyMSDNTVLibrary是我以前写的一个小型WinForms项目,当时的想法是为初学者们演示如何创建一个简单但却完整的小项目。今天我又把这个小项目翻出来,通过应用Factory Method模式,使该项目可以支持多种不同的数据源(Access/ SQL Server ...)。大家如果感兴趣可以看我写的这篇文章

 

目前我增加了对Access和SQL Server的支持,对其它数据源的支持也可以很容易增加。

 

BTW:不知大家对MCT领域是否关注,我昨天看到正在进行“2004年微软金牌认证讲师”评选。在其中列出的MCT名单中就有我们博客堂的马骐,一位有着四年授课经验的资深MCT(同时也是我的好老师、引路人);此外还有我们博客堂长期以来的好朋友李争(上次聚会时站在我旁边的那个高个子:)。如果大家也和我同样欣赏和佩服这二位MCT的话,那么请支持他们!

posted on 2004-03-19 12:05:00 by musicland  评论(14) 阅读(5021)

 
【第1页/共6页,87条】
首页
前页
1

Powered by: Joycode.MVC引擎 0.5.1.0