如鹏网 大学生计算机学习社区

CowNew开源团队

http://www.cownew.com 邮件请联系 about521 at 163.com

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  363 随笔 :: 2 文章 :: 808 评论 :: 0 Trackbacks

#

SWT中调用Automation的方式 这篇文章中我们介绍了SWT中通过Automation访问IE的方式,但是只是简单的URL导航,没有自动填表单、自动提交等功能。我们对其进行了升级,采用了新的操作方式,充分利用了SWT对OLE的支持,裁减掉大量代码。现在可以实现自动填表单、自动提交等功能。不过暂时还无法响应IE的事件。
核心代码如下:

package test;

import org.eclipse.swt.SWTException;
import org.eclipse.swt.internal.ole.win32.COM;
import org.eclipse.swt.internal.ole.win32.GUID;
import org.eclipse.swt.internal.ole.win32.IUnknown;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleClientSite;
import org.eclipse.swt.widgets.Composite;

/**
 *
 * @author 杨中科
 *
 */
public class AutomationClientSite extends OleClientSite
{
 public AutomationClientSite(Composite parent, int style, String progId)
 {
  super(parent, style);
  try
  {
   appClsid = getClassID(progId);
   if (appClsid == null)
    OLE.error(OLE.ERROR_INVALID_CLASSID);

   //使用CoCreateInstance创建一个进程外Automation服务器
   int[] address = new int[1];
   int result = COM.CoCreateInstance(getClassID(progId), 0,
     COM.CLSCTX_INPROC_SERVER | COM.CLSCTX_LOCAL_SERVER,
     COM.IIDIUnknown, address);
   if (result != COM.S_OK)
    OLE.error(OLE.ERROR_CANNOT_CREATE_OBJECT, result);

   objIUnknown = new IUnknown(address[0]);

  } catch (SWTException e)
  {
   dispose();
   disposeCOMInterfaces();
   throw e;
  }
 }

 protected GUID getClassID(String progId)
 {
  GUID guid = new GUID();
  // create a null terminated array of char
  char[] buffer = null;
  if (progId != null)
  {
   int count = progId.length();
   buffer = new char[count + 1];
   progId.getChars(0, count, buffer, 0);
  }
  if (COM.CLSIDFromProgID(buffer, guid) != COM.S_OK)
  {
   int result = COM.CLSIDFromString(buffer, guid);
   if (result != COM.S_OK)
    OLE.error(result);
  }
  return guid;
 }

}
public class OleUtils
{
 public static int getIdOfName(OleAutomation auto, String name)
 {
  int[] ret = auto.getIDsOfNames(new String[]{name});
  return ret[0];
 }
 
 public static void setProperty(OleAutomation auto, String name,Variant value)
 {
  int id = getIdOfName(auto, name);
  auto.setProperty(id, new Variant[]{value});
 }
 
 public static Variant getProperty(OleAutomation auto, String name)
 {
  int id = getIdOfName(auto, name);
  return auto.getProperty(id);
 }
 
 public static Variant invoke(OleAutomation auto, String name)
 {
  return invoke(auto,name,new Variant[0]);
 }
 
 public static Variant invoke(OleAutomation auto, String name,Variant... params)
 {
  int id = getIdOfName(auto, name);
  return auto.invoke(id,params);
 }
}



package test;

import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.Variant;

/**
 *
 * @author 杨中科
 *
 */
public class HtmlElement
{
 private OleAutomation auto;

 public HtmlElement(OleAutomation auto)
 {
  this.auto = auto;
 }

 protected OleAutomation getOleAutomation()
 {
  return auto;
 }

 public void setProperty(String name, Variant value)
 {
  OleUtils.setProperty(auto, name, value);
 }

 public Variant getPropertyAsVariant(String name)
 {
  Variant value = OleUtils.getProperty(auto, name);
  return value;
 }

 public void setProperty(String name, int value)
 {
  OleUtils.setProperty(auto, name, new Variant(value));
 }

 public int getPropertyAsInt(String name)
 {
  Variant value = OleUtils.getProperty(auto, name);
  return value.getInt();
 }

 public void setProperty(String name, boolean value)
 {
  OleUtils.setProperty(auto, name, new Variant(value));
 }

 public boolean getPropertyAsBool(String name)
 {
  Variant value = OleUtils.getProperty(auto, name);
  return value.getBoolean();
 }

 public void setProperty(String name, String value)
 {
  OleUtils.setProperty(auto, name, new Variant(value));
 }

 public String getPropertyAsString(String name)
 {
  Variant value = OleUtils.getProperty(auto, name);
  return value.getString();
 }

 public HtmlElement getPropertyAsHtmlElement(String name)
 {
  Variant value = OleUtils.getProperty(auto, name);
  return new HtmlElement(value.getAutomation());
 }

 public Variant invoke(String name,Variant... params)
 {
  return OleUtils.invoke(auto, name,params);
 }

 public int invoke_Int(String name,Variant... params)
 {
  return invoke(name,params).getInt();
 }

 public boolean invoke_Bool(String name,Variant... params)
 {
  return invoke(name,params).getBoolean();
 }

 public String invoke_String(String name,Variant... params)
 {
  return invoke(name,params).getString();
 }

 public HtmlElement invoke_HtmlElement(String name,Variant... params)
 {
  return new HtmlElement(invoke(name,params).getAutomation());
 }
}




package test;

import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleClientSite;
import org.eclipse.swt.ole.win32.Variant;

/**
 * 更多方法参考MSDN“InternetExplorer Object”文档
 *
 * @author 杨中科
 *
 */
public class IEAutomation extends HtmlElement
{

 public IEAutomation(OleClientSite clientSite)
 {
  super(new OleAutomation(clientSite));
 }

 public void setVisible(boolean value)
 {
  setProperty("Visible", value);
 }

 public boolean isVisible()
 {
  return getPropertyAsBool("Visible");
 }

 public void setMenuBar(boolean value)
 {
  setProperty("MenuBar", value);
 }

 public boolean isMenuBar()
 {
  return getPropertyAsBool("MenuBar");
 }

 public void setStatusBar(boolean value)
 {
  setProperty("StatusBar", value);
 }

 public boolean isStatusBar()
 {
  return getPropertyAsBool("StatusBar");
 }
 
 public void setToolBar(boolean value)
 {
  setProperty("ToolBar", value);
 }

 public boolean isToolBar()
 {
  return getPropertyAsBool("ToolBar");
 }
 
 public int getHWND()
 {
  return getPropertyAsInt("HWND");
 }
 
 public String getReadyState()
 {
  return getPropertyAsString("ReadyState");
 }
 
 public String getLocationURL()
 {
  return getPropertyAsString("LocationURL");
 }
 
 public boolean getBusy()
 {
  return getPropertyAsBool("Busy");
 }

 public void navigate(String url)
 {
  invoke("Navigate", new Variant(url));
 }

 public HtmlElement getDocument()
 {
  return getPropertyAsHtmlElement("Document");
 }

 public String getInnerHtml()
 {
  HtmlElement document = getPropertyAsHtmlElement("Document");
  HtmlElement body = document.getPropertyAsHtmlElement("body");
  return body.getPropertyAsString("innerHtml");
 }

 public HtmlElement getElementById(String id)
 {
  HtmlElement document = getDocument();
  return document.invoke_HtmlElement("getElementById", new Variant(id));
 }

 public void quit()
 {
  invoke("Quit");
 }
}




使用范例:

 protected void 自动填表()
 {
  //"kw"为关键字输入框
  HtmlElement txtKW = ie.getElementById("kw");
  //自动填表
  txtKW.setProperty("value", "杨中科");
  HtmlElement btnSB = ie.getElementById("sb");
  //自动点击【百度一下】按钮自动提交查询
  btnSB.invoke("click");
 }
 private void automation() throws Exception
 {
  OleFrame frame = new OleFrame(composite, SWT.NONE);
  AutomationClientSite client =
   new AutomationClientSite(frame,SWT.NONE,"InternetExplorer.Application");   
 
  ie = new IEAutomation(client);
  ie.setVisible(true);
  ie.setMenuBar(false);
  ie.setToolBar(false);
  ie.setStatusBar(false);
  
  int hwnd = ie.getHWND();
  OS.SetParent(hwnd, composite.handle);
  // 窗口最大化
  OS.SendMessage(hwnd, OS.WM_SYSCOMMAND, OS.SC_MAXIMIZE, 0);
  OS.SendMessage(hwnd, OS.WM_ACTIVATE, 0, 0);
  
  ie.navigate("http://www.baidu.com");
  //等待加载完毕,正确的方式应该是在网页onComplete的时候继续执行,但是没弄明白OLE 的EventSink机制怎么搞到SWT中来
  //所以先凑合着Sleep循环检测getBusy()的值,当不busy的时候再进行后续处理
  while(ie.getBusy())
  {
   Thread.sleep(10);
  }
  msgBox(ie.getInnerHtml());
  //"sb"为【百度一下】这个按钮的id
  HtmlElement btnSB = ie.getElementById("sb");
  //取value属性
  String txt = btnSB.getPropertyAsString("value");
  msgBox("按钮上的文字:"+txt);
  msgBox("网址:"+ie.getLocationURL());
  
  composite.addDisposeListener(new DisposeListener() {
   public void widgetDisposed(DisposeEvent e)
   {
    //必须手动指定退出,否则会报异常
    ie.quit();
   }
  });
 }

posted @ 2008-06-30 21:08 CowNew开源团队 阅读(1389) | 评论 (2)编辑 收藏

时间:2008年7月5日下午13:30到17:30
  活动地点:北京清华大学(清华东门Fit楼)
  特邀咨询师: EasyJF开源团队 大峡

  活动参加对象:vifir.com的vip用户;
  参加费用:VIP免费;

  主办单:开源人网站(www.vifir.com)
  承办单位:成都蓝源信息技术有限公司 EasyJF开源团队 Cownew开源团队
  
  活动内容:
  采用开展专题讲座、问题答疑等形式,在网下开展面对面的关于前沿富客户端技术的应用及经验交流活动,主要以Ext技术的学习及应用经验交流为主。还将会根据vifir推出的一些ext应用示例,进行比较深入的分析及探讨。

  活动联系人:静水 (QQ: 970426526) 联系电话:028-86272612
  电子邮箱:970426526 at qq.com

posted @ 2008-06-30 21:01 CowNew开源团队 阅读(262) | 评论 (0)编辑 收藏

     摘要: 在SWT中提供了访问OLE的方式,不过相关的例子都是进程内OLE的例子,比如嵌入浏览器、引用ActiveX控件什么的。由于客户的需求,我们需要在程序中通过进程外Automation服务的方式访问IE浏览器。经过网上搜寻,找到一个朋友写的CComObject类可以访问Automation服务。不过经过使用发现一些错误,因此对其进行了修改,为了方便访问IE,我又封装了一个IEAutomation类,这...  阅读全文
posted @ 2008-06-23 17:04 CowNew开源团队 阅读(2233) | 评论 (1)编辑 收藏

     摘要: 《专家手记AJAX开发实战》电子版下载地址:http://www.blogjava.net/Files/huanzhugege/《专家手记AJAX开发实战》电子版.rar
  阅读全文
posted @ 2008-06-22 18:19 CowNew开源团队 阅读(2343) | 评论 (5)编辑 收藏

    在开发系统的时候经常需要嵌入外部的程序,比如将企业原有的系统集成到我们的系统中,而且要求看起来像和我们的程序一样嵌入到我们的系统中,这时就要借助于Win32了。在以前使用VC、Delphi、C#开发的使用的时候可以直接调用Win32的API来操作,好在SWT中提供了Win32API的封装,而且封装的比较好,大部分都在org.eclipse.swt.internal.win32.OS这个类中。核心原理就是调用SetParent这个API将我们的程序中的某个控件设置为被嵌套程序的父窗口。具体原理可以参考我以前写的《WPF中嵌入普通Win32程序的方法 》(http://www.blogjava.net/huanzhugege/archive/2008/04/24/195516.html)。
主要代码如下:
 private void executeProg(String fileName) throws Exception
 {
  int hHeap = OS.GetProcessHeap ();
  TCHAR buffer = new TCHAR (0, fileName, true);
  int byteCount = buffer.length () * TCHAR.sizeof;
  int lpFile = OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
  OS.MoveMemory (lpFile, buffer, byteCount);
  SHELLEXECUTEINFO info = new SHELLEXECUTEINFO ();
  info.cbSize = SHELLEXECUTEINFO.sizeof;
  info.lpFile = lpFile;
  //隐藏启动
  info.nShow = OS.SW_HIDE;
  boolean result = OS.ShellExecuteEx (info);
  if (lpFile != 0) OS.HeapFree (hHeap, 0, lpFile);
  if(result==false)
   throw new Exception("启动失败!");
 }
 
 protected void startNotePad() throws Exception {
  //"notepad.exe"为待启动的程序名
  executeProg("notepad.exe");
  
  //等待NotePad.exe启动并且初始化完毕,需要根据实际情况调整sleep的时间
  Thread.sleep(1000);  
  
  //"Notepad"为被嵌套程序窗口的ClassName(Win32级别),可以使用Spy++等工具查看
  int notepadHwnd = OS.FindWindow(new TCHAR(0,"Notepad",true),null);
  
  //&~WS_BORDER去掉内嵌程序边框,这样看起来更像一个内嵌的程序。如果需要显示边框,则将这两行代码删除
  int oldStyle = OS.GetWindowLong(notepadHwnd, OS.GWL_STYLE);       
        OS.SetWindowLong(notepadHwnd, OS.GWL_STYLE, oldStyle&~OS.WS_BORDER);
       
        //composite为承载被启动程序的控件
  OS.SetParent(notepadHwnd, composite.handle);  
  //窗口最大化
  OS.SendMessage(notepadHwnd, OS.WM_SYSCOMMAND, OS.SC_MAXIMIZE, 0);
 }

全部代码在此下载:http://www.blogjava.net/Files/huanzhugege/swtwin32.zip
posted @ 2008-06-05 10:49 CowNew开源团队 阅读(3734) | 评论 (2)编辑 收藏

由CowNew开源团队的侯志松(网名:芽孢)编写的《Hibernate完全手册》已经由机械工业出版社出版。
        本书从应用程序开发的角度出发,在介绍关系数据库系统知识和面向对象方法的基础上,全面介绍对象关系映射领域的工业标准――Hibernate的基本功能、体系架构、使用方法及高级特性。全书以对象关系映射为主线,分成3个模块:第1~6章介绍对象持久化的基础以及Hibernate的基本配置和使用方法;第7~11章详细介绍如何使用Hibernate实现对象关系的映射,并讨论了使用面向对象方式查询数据的方法和技巧;第12~16章分析了Hibernate中事务、并发、缓存等高级特性,并讨论了如何整合Hibernate和成熟技术,构建企业级应用程序开发框架的技术实践。
posted @ 2008-06-04 10:16 CowNew开源团队 阅读(435) | 评论 (0)编辑 收藏

随着Web开发的不断进步,AJAX以一种新的面貌出现在了我们面前,并且迅速席卷全球,成为一种炙手可热的技术。越来越多的开发人员想快速的掌握这门技术,并把它快速应用到自己的项目中。

虽然构成AJAX的技术已经非常成熟了,但是都是以CSS、JavaScript、XML等单一形式出现的,所以相关的技术书籍都仅仅停留在孤立的介绍这些技术方面,读者无法将这些技术有机的整合起来,更无从谈起将AJAX应用到项目中。本书将尝试着打破这种局面,在书中我们对AJAX的基础知识做有重点的介绍,而且本书中将穿插各种小的案例,让读者能够在实践中快速学习到AJAX技术,并且在最后我们安排了一个实用性非常强的WebOS应用,让读者能够学了就能懂、懂了立即用。

在AJAX领域已经有一些非常好的图书出版,不过这些图书大都是用PHP、.Net等语言描述的,以Java实现的并不是很多,即使有也是浅尝辄止。不过《专家手记AJAX开发实战 》的出现改变了这一面貌。

这本书不仅用了大量篇幅介绍了流行的AJAX框架,更加可贵的是,书中用了三个章节以一个实用的WebOS为案例讲解了基于AJAX技术的Web系统的开发开发出了模拟Windows桌面、网络相册、爱墙、在线Office、网络硬盘等经典的Web2.0应用,充分展示了AJAX技术的强大。WebOS是AJAX技术登峰造极制作,跟着作者实打实的学到了一个WebOS的制作,你就是AJAX高手!!!

值得一提的是《专家手记AJAX开发实战 》这本书的代码质量非常高,看了作者的代码不仅能使您学到高手的代码编写习惯,更能使您掌握AJAX的高级开发技能。
    此书是CowNew开源团队第一本团队合作形式出版的图书!
    稍后会提供试读电子版给各位。

       由CowNew开源团队的侯志松(网名:芽孢)编写的《Hibernate完全手册》也已经由机械工业出版社出版。本书从应用程序开发的角度出发,在介绍关系数据库系统知识和面向对象方法的基础上,全面介绍对象关系映射领域的工业标准――Hibernate的基本功能、体系架构、使用方法及高级特性。全书以对象关系映射为主线,分成3个模块:第1~6章介绍对象持久化的基础以及Hibernate的基本配置和使用方法;第7~11章详细介绍如何使用Hibernate实现对象关系的映射,并讨论了使用面向对象方式查询数据的方法和技巧;第12~16章分析了Hibernate中事务、并发、缓存等高级特性,并讨论了如何整合Hibernate和成熟技术,构建企业级应用程序开发框架的技术实践。
posted @ 2008-06-03 16:59 CowNew开源团队 阅读(1984) | 评论 (5)编辑 收藏

向四川汶川大地震遇难同胞表示深切哀悼! 

  举国哀悼,也许,我们会泪流满面,也许,我们会放声痛哭,但任何困难都难不倒中国人民,我们终会擦干泪水,挺起脊梁,继续前进。

posted @ 2008-05-19 21:05 CowNew开源团队 阅读(228) | 评论 (0)编辑 收藏

        今天终于把《鲁宾逊历险记》第一部看完了,看到其中说到“既然上帝都能饶恕他,我们有什么权利剥夺他的生命呢?”,我这才明白为什么电影里边基督徒要杀一个人的时候要说“我以上帝的名义,杀了你”,既然能够有权剥夺你生命的人只有上帝,那么我要杀了你就必须“以上帝的名义”了,也就是说这是上帝他老人家的意思。这也就是说,做一件事情必须有“名分”。看以前很多革命电影中,我们的革命战士要枪毙叛徒的时候要说“我代表人民代表D枪毙了你”,应该这是一个意思吧。
        朱棣要当BOSS就要打着“清君侧”的旗号、洪秀全要造反就必须说自己是上帝的次子、小鬼子要发动七七事变就要找理由攻占宛平城、老美要弄死萨达姆就必须以找核武器为理由……看来无论是国内还是国外、无论是做好事还是做坏事名分都是很重要的,必须找个名分才能行动,如果哪天一个人做事不讲“名分”的话估计也就是流氓透顶了吧。
posted @ 2008-05-03 23:24 CowNew开源团队 阅读(402) | 评论 (5)编辑 收藏

ssy(*^__^*) 16:57:16
不知你做过js的语法分析没有,我正在用antlr做js的语法分析,遇到两个难题,想向您请教:
1.正则和除法的区分
2.js匿名类和组合语句的区分
杨中科 17:08:22
sorry,没做过js的语法分析  
ssy(*^__^*) 17:10:37
哦,谢谢你
杨中科 17:11:39
为什么不用mozilla的js包呢?它那里边好像提供了解析js的类,直接能拿到AST  
ssy(*^__^*) 17:12:30
好的,谢谢您提醒,我去试一下mozilla的js包
杨中科 17:13:04
你们解析JS做什么用途?  
ssy(*^__^*) 17:13:46
做安全代码分析,就是找出js代码可能存在的安全隐患
杨中科 17:14:14
哦。JS包中的Parser类可以干这个  
ssy(*^__^*) 17:14:55
嗯,我去找一下这方面的资料,还没用过js包呢,呵呵,谢谢你提示
posted @ 2008-04-25 21:13 CowNew开源团队 阅读(884) | 评论 (2)编辑 收藏

仅列出标题
共30页: First 上一页 3 4 5 6 7 8 9 10 11 下一页 Last