在.NET中使用Internet Explorer Control的一个Bug

这两天在做一个项目,主要是在Windows Form中嵌一个IE,访问一个网站,基于某些理由,不允许用户下载、上传及打印。

关于禁止下载,我查看了一个Inteernet Explorer的SDK,发现了FileDownload事件,根据SDK中的描述,该事件的作用是:“Fires to indicate that a file download is about to occur. If a file download dialog is to be displayed, this event is fired prior to the display of the dialog.”,正对我的需求。

可是无论我如何实验,那个“打开、保存”的对话框仍然持续出现,所以我感觉有问题,于是我到KB上查了一下,发现了这原来是Internet Explorer Control在通过.NET导入的时候出现的一个Bug。根据KB中的描述,这个Bug只发生在VS.NET 2002当中。不过我发现在VS.NET 2003当中仍然继续出现,所以我想,开发组的人员可能并没有弥补该Bug,十分遗憾。

对此Bug感兴趣的朋友可以参考KB中的文章:325204。非MVP请访问http://support.microsoft.com, MVP请访问http://mvp.support.microsoft.com。我想大部分人员知道如何通过KB索引号来查找KB文章了,我在这儿就不再叙述了。这篇KB还详细介绍了如何解决此问题,不过并不对我胃口,因为按照他介绍的Step By Step,我是得到FileDownload事件,但其它事件就丢失了。

不知道哪位朋友知道在使用VS.NET导入COM控件的时候,如何得到它产生的中间文件,即那个C#的源代码,我想在那个基础上修改,然后再编译。如果请知道,请在此加评论。

另外,关于如何屏蔽上传功能,我现在还没有很好的想法,我现在在BeforeNavigate2事件中,通过分析e.PostData是否含有“filename=”字段来禁止上传,但仍然会弹出那个对话框,使用户有权访问该机器上的文件,如何通过某种方案来使该对话框不出现?请大家帮我出出主意,即使非常变态的也可以,比如FindWindow,然后KillWindow,或者通过修改注册表中的某个健值而禁止打印。

.Text及BlogX汉化源代码现在免费提供

由于很多人向开心索要博客堂的汉化源代码,所以开心现在决定把.Text及BlogX的汉化源代码进行公开下载。

所有使用本源代码的人员请遵循以下协议:

  1. 本人不负责回答任何关于安装及维护的问题,所有安装及维护问题请直接到相应网站或者论坛中进行解决;
  2. 请遵守.Text及BlogX原有的License,任何违反规定的人员均与本人无关,建议最好不要修改掉它们的版权文字信息;
  3. 我们鼓励大家在运营时标明“开心就好提供汉化”,并且强烈建议在首页显著位置增加博客堂的链接,把博客堂推荐给您的成员;
  4. 大家可以自由散播该汉化版本软件,但请保持该软件的完整性,在散播时请标明开心就好提供汉化,并且将本协议捆绑撒播;
  5. 如果发现任何汉化问题,欢迎与开心就好联系,邮件:[email protected],但开心不保证会所有邮件都回复。

下载地址: http://210.82.112.46/projects.rar

 

一个项目的策划

最近接了一个项目,要求如下:

1.使用C#编写,Windows Application,在WinForm中嵌入一个IE浏览器,显示一个已经使用JSP编写好的网页;

2.运行此程序的计算机的输入配置为触摸屏、轨迹球、数字键盘,操作系统为Windows 2000 Professional;

3.要求用户可以使用拼音输入法、五笔输入法,所以需要一个软健盘,为了安全起见,不能使用系统自带的输入法,而只能由程序提供一个输入法,通过按键事件传递给后台的输入法;

4.由于是公用计算机,所以当IE中有打印、下载、上传等行为时,系统应该自动屏蔽此功能,不允许这些情况发生,尤其是上传,因为此时可以会浏览硬盘中的内容;

5.为了保证此程序的正常运行,应该有一个监护进程在系统间常驻,防止程序意外崩溃。监护进程的作用是如果应用不响应,则自动关闭并且重启一个新的进程。

6.此应用一周内完成所有编码。

大家帮我想想,以上这些要求该如何实现才好?也可以只对某一方面提供自己的建议及意见。

MSDN本地化计划

微软总部决定加大MSDN本地化的力度,而我们计划提升中国MSDN的地位,希望他能成为英语,日文和德文之后,第四大语系的MSDN本地站。按我们的计划新的MSDN中文可能超过德文成为第三。但是现在时间有限,我们很难在一个时间内本地化所有的文档,同时我们也很难保证我们选的文章是开发人员喜欢的,所以需要MVP和整个社区的帮忙。我希望有更多人知道,让它成为一个众人皆知的事情。

详情请查阅http://blog.joycode.com/joy/posts/2432.aspx

欢迎大家多提宝贵意见!!!!

关于VS.NET 2003

VS.NET系列是我用过的最好的开发工具,我想这也是绝大多数开发人员的感受。即使是在Java阵营的同志们,其实对.NET阵营的开发工具也是很羡慕的,无论他们抨击其它的多么厉害。

不过,VS.NET中的Visual Sourcesafe也是令人不能容忍的,在VS.NET套件中,就VSS一直没有任何改观,包括其界面,甚至连图标都是很古老的那种。最主要的是其功能,现在还是使用文件共享方式,导致了病毒滋生,不信可以问问使用VSS协同开发的公司,基本上VSS服务器上的病毒是最多的,因为很多病毒都是在局域网的共享目录中传染的。

当然,我听说下一版就开始支持TCP/IP协议了,感觉前景无限美好,尤其是在下一版中,可能存储方式也会有改观,如果直接与Yukon结合起来,那是多么美好的事情呀?

明天是最后一天

明天最后一天在微软中国工作了。

项目进行了两周,豆腐感觉很不可思议,在两周的时间内完成一个原型开发,感觉速度快了一点。我想一想的确也挺快的。

这个项目使用的技术包括.NET Web Service+.NET Web Application+BizTalk 2004 Server,由于BizTalk 2004 Server在我们开发的过程中(甚至直到现在),一直还是Beta阶段,在这两周内,我们就换了三个Build,所以需要逐渐的熟悉。毕竟与Biztalk 2002 Server改变了太多。

项目组只有两个成员,即我与阿斌同志,阿斌是MS内部的Biztalk专家,所以在分工上,是由他负责Biztalk的开发的,而我主要负责.NET Web Service+.NET Web Application的开发。使用.NET Web Service模拟外部业务模块接口,而.NET Web Application模拟前台界面,然后使用BizTalk来将这些外部模块进行串联,组织一个完整的工作流程。

总结一下,开发周期比原来预定的多了一天,而且每天基本上都要加班到晚上九点钟以后,有时候还到半夜十二点,周末也一直在加班(阿斌同志比我要累多了)。不过开发周期基本上还算控制住了,基本上在两周多一些完成了。在刚进入项目的时候,我们本来还认为可能会需要一个月左右。

当然,也有一些经验需要汲取的,就是在刚开工的时候,我们把太多考虑放在了技术上面,过早的进入了代码实施阶段,其实在第一周所编写的代码被废弃了好多。因为我们随着我们的代码编写过程,才逐渐的发现了一些原来不甚清晰的业务逻辑,而不停的修改接口,直至上周六用UML序列图方式确定了最后的调用关系,整个开发才算步入正轨。

在此,开心向阿斌以及其他微软中对开心予以各种帮助的朋友表示衷心的感谢!对小马哥及小马哥的那位MCT朋友的推荐表示感谢!对所有阅读开心Blog的人表示感谢! (似乎有点过于官面文章了,开心请吃饭吧!)

Smart Client培训资料下载

小气的神小马哥 之托,现在将 小气的神 培训的资料提供下载。下载地址为,请大家自由下载,不过由于空间及带宽原因,不一定能够保留在什么时候的。http://210.82.112.46/download.zip

总共大小差不多是80M左右,大家量力而行,另外下载后,请把后缀名改为.exe,是一个自解压的文件。我个人在家里面试验的时候,诺顿企业版报警说这个文件有病毒,所以请大家一定要小心!

主要内容是 小气的神 在香港培训时所获得的资料。相信对那些有志于在Smart Client上进行.NET开发的人员是有很大帮助的。

Anders Hejlsberg语录

刚刚在http://www.artima.com/intv/handcuffs.html看到了这段话,我感觉这可能是中国程序员的一个比较明显的通病,贴在这儿,希望对大家帮助,最重要的是,提醒自己,不要再犯同样的错误。

If you ask beginning programmers to write a calendar control, they often think to themselves, “Oh, I’m going to write the world’s best calendar control! It’s going to be polymorphic with respect to the kind of calendar. It will have displayers, and mungers, and this, that, and the other.” They need to ship a calendar application in two months. They put all this infrastructure into place in the control, and then spend two days writing a crappy calendar application on top of it. They’ll think, “In the next version of the application, I’m going to do so much more.”

Once they start thinking about how they’re actually going to implement all of these other concretizations of their abstract design, however, it turns out that their design is completely wrong. And now they’ve painted themself into a corner, and they have to throw the whole thing out. I have seen that over and over. I’m a strong believer in being minimalistic. Unless you actually are going to solve the general problem, don’t try and put in place a framework for solving a specific one, because you don’t know what that framework should look like.

汉语编程第一人

    /// <summary>
    /// 控制信息类:用以生成工单中控制信息节点
    /// </summary>
    public class 控制信息类
    {
        public 控制信息类()
        {

        }
        private string m工单编号;
        public string 工单编号
        {
            get
            {
                return this.m工单编号;
            }
            set
            {
                this.m工单编号=value;
            }
        }
        private string m工单等级;
        public string 工单等级
        {
            get
            {
                return this.m工单等级;
            }
            set
            {
                this.m工单等级=value;
            }
        }
        private string m工单状态;
        public string 工单状态
        {
            get
            {
                return this.m工单状态;
            }
            set
            {
                this.m工单状态=value;
            }
        }
        private string m竣工时间;
        public string 竣工时间
        {
            get
            {
                return this.m竣工时间;
            }
            set
            {
                this.m竣工时间=value;
            }
        }
        private string m开装时间;
        public string 开装时间
        {
            get
            {
                return this.m开装时间;
            }
            set
            {
                this.m开装时间=value;
            }
        }
        private string m工单时限;
        public string 工单时限
        {
            get
            {
                return this.m工单时限;
            }
            set
            {
                this.m工单时限=value;
            }
        }
        private string m所属受理编码;
        public string 所属受理编码
        {
            get
            {
                return this.m所属受理编码;
            }
            set
            {
                this.m所属受理编码=value;
            }
        }
    }