.NET Compact Framework通过托管Win32代码获得HtmlDocument

.NET Compact Framework通过托管Win32代码获得HtmlDocument

2010/2/15 18:08:00来源:本站整理作者:我要评论(0)

.NET Compact Framework通过托管Win32代码获得HtmlDocument:

  问题引入:   

  有过CF的项目经验的朋友一定常常遇到与BS后台对接的问题,HTML在BS系统中有着得天独厚的条件,他能够直接被用作界面显示,并且能够被C#代码和Javascript操作,因此在一些应用中BS系统可能采取在数据库中存储HTML表单的设计,例如一些表单可视化设计控件(Table Designer)生成的就是HTML,直接存储HTML的好处在于绕过了解析HTML DOM的复杂性,可是在前端与之对接的Mobile应用程序中就带来的问题,当我的.NET CF程序读取到包含HTML的字段后就显得很尴尬了,用正则表达式解析HTML生成WinFom界面显然不切实际,然而.NET CF似乎只为我们提供了这么一条路,因为如果用WebBroswer(以下简称WB)控件直接显示HTML,很有可能因为HTML的规格不适合PDA屏幕而使得用户体验非常糟糕,一个常见的问题就是HTML FORM的宽度超出了Mobile设备屏幕范围,而使得WB出现横向滚动条,这还不是问题的关键,关键在于你将HTML交给了WB控件之后你就没有任何控制权了,WebBrowser类为我们提供的唯一和HTML交互手段是一个叫DocumentText的属性,遗憾的是该属性是SetOnly的,也就是说只有Set访问器,那么获取表单中输入的数值就不可能了。这个问题在Full Framework(以下简称FF)中是不存在的,因为FF中的WebBroswer类为我们提供了Document属性,它返回类型为HtmlDocument的HTML DOM结构,借助该属性可以轻松的完成HTML交互任务。对于上述问题我的思路还是使用HTML DOM模型来和HTML交互,如果您使用过WebBroswer.Document属性来操作HTML,那么您应该知道HtmlDocument只不过是封装了COM接口IHTMLDocument2的对象而已,他的大部分功能都是COM中提供的,那么CF里这个接口要怎么引入呢?这就是本文要解决的问题.

  解决之道:

  解决上述问题并不需要造原子弹的技术,不过阅读以下内容之前您需要具备Windows COM知识和.NET Compact Framework中P/Invoke基础知识,这里不需要您了解Data layout,但至少您要知道C++中的char*封送为string,不过作为CF开发者,我建议您还是深入学习P/Invoke,如果您没有这些知识那么我推荐您先阅读以下文章:

  http://msdn.microsoft.com/en-us/library/aa446529.aspx

  http://msdn.microsoft.com/en-us/library/k3f1t3ct(VS.80).aspx

  http://msdn.microsoft.com/en-us/library/aa446497.aspx

  当您已经掌握了这些知识那么恭喜您,您可能不需要把我的文章全部看完就能够做我们要做的事了。

  既然CF中的WebBrowser控件没有提供我们对HtmlDocument的访问,那么我们来看看EVC中的HTML Control(以下简称HC)吧。

  我一开始翻阅了大量Window Mobile SDK的文档,甚至在帮助文档中的HTML Control API Messages主题也找不到任何Message能够取得HC内部的HTML,最后在一个国外的C++开发论坛中找到了一些线索,其实在Mobile API中其实是可以访问HtmlDocument模型的,有这么一个Message可以返回HC的HTML Document对象,那就是DTM_DOCUMENTDISPATCH,有趣的是我们在SDK文档中输入DTM_DOCUMENTDISPATCH可以找到帮助页面,并且下方有HTML Control API Messages主题的链接,可是HTML Control API Messages帮助主题并没有介绍DTM_DOCUMENTDISPATCH消息,我们来看看DTM_DOCUMENTDISPATCH的描述吧: 

  The DTM_DOCUMENTDISPATCH message is sent by an application to the HTML viewer control to request a reference to its IDispatch interface.

  Syntax
DTM_DOCUMENTDISPATCH
wParam = 0;
lParam = (LPARAM)(IDispatch*) ppDisp;
ParameterswParam Not used. pDisp [out] Reference to the HTML viewer control's IDispatch interface. Return Values

  Returns the HTML viewer control's IDispatch pointer. Use it to call QueryInterface(IID_IPIEHTMLDocument, (void**)&pHTMLDocument) to retrieve the HTML viewer control's IPIEHTMLDocument interface.

阅读本文后您有什么感想? 已有 人给出评价!

  • 0 囧
      囧
  • 0 恶心
      恶心
  • 0 期待
      期待
  • 0
      难过
  • 0 不错
      不错
  • 0 关注
      关注
  • 最新评论
  • 热门评论
共有评论(0)条 查看全部评论
高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲

注:您的评论需要经过审核才会显示出来