如鵬網 大學生計算機學習社區

          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開源團隊 閱讀(1410) | 評論 (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開源團隊 閱讀(271) | 評論 (0)編輯 收藏

               摘要: 在SWT中提供了訪問OLE的方式,不過相關的例子都是進程內OLE的例子,比如嵌入瀏覽器、引用ActiveX控件什么的。由于客戶的需求,我們需要在程序中通過進程外Automation服務的方式訪問IE瀏覽器。經過網上搜尋,找到一個朋友寫的CComObject類可以訪問Automation服務。不過經過使用發現一些錯誤,因此對其進行了修改,為了方便訪問IE,我又封裝了一個IEAutomation類,這...  閱讀全文
          posted @ 2008-06-23 17:04 CowNew開源團隊 閱讀(2261) | 評論 (1)編輯 收藏

               摘要: 《專家手記AJAX開發實戰》電子版下載地址:http://www.aygfsteel.com/Files/huanzhugege/《專家手記AJAX開發實戰》電子版.rar
            閱讀全文
          posted @ 2008-06-22 18:19 CowNew開源團隊 閱讀(2362) | 評論 (5)編輯 收藏

              在開發系統的時候經常需要嵌入外部的程序,比如將企業原有的系統集成到我們的系統中,而且要求看起來像和我們的程序一樣嵌入到我們的系統中,這時就要借助于Win32了。在以前使用VC、Delphi、C#開發的使用的時候可以直接調用Win32的API來操作,好在SWT中提供了Win32API的封裝,而且封裝的比較好,大部分都在org.eclipse.swt.internal.win32.OS這個類中。核心原理就是調用SetParent這個API將我們的程序中的某個控件設置為被嵌套程序的父窗口。具體原理可以參考我以前寫的《WPF中嵌入普通Win32程序的方法 》(http://www.aygfsteel.com/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.aygfsteel.com/Files/huanzhugege/swtwin32.zip
          posted @ 2008-06-05 10:49 CowNew開源團隊 閱讀(3755) | 評論 (2)編輯 收藏

          由CowNew開源團隊的侯志松(網名:芽孢)編寫的《Hibernate完全手冊》已經由機械工業出版社出版。
                  本書從應用程序開發的角度出發,在介紹關系數據庫系統知識和面向對象方法的基礎上,全面介紹對象關系映射領域的工業標準――Hibernate的基本功能、體系架構、使用方法及高級特性。全書以對象關系映射為主線,分成3個模塊:第1~6章介紹對象持久化的基礎以及Hibernate的基本配置和使用方法;第7~11章詳細介紹如何使用Hibernate實現對象關系的映射,并討論了使用面向對象方式查詢數據的方法和技巧;第12~16章分析了Hibernate中事務、并發、緩存等高級特性,并討論了如何整合Hibernate和成熟技術,構建企業級應用程序開發框架的技術實踐。
          posted @ 2008-06-04 10:16 CowNew開源團隊 閱讀(448) | 評論 (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開源團隊 閱讀(2007) | 評論 (5)編輯 收藏

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

            舉國哀悼,也許,我們會淚流滿面,也許,我們會放聲痛哭,但任何困難都難不倒中國人民,我們終會擦干淚水,挺起脊梁,繼續前進。

          posted @ 2008-05-19 21:05 CowNew開源團隊 閱讀(238) | 評論 (0)編輯 收藏

                  今天終于把《魯賓遜歷險記》第一部看完了,看到其中說到“既然上帝都能饒恕他,我們有什么權利剝奪他的生命呢?”,我這才明白為什么電影里邊基督徒要殺一個人的時候要說“我以上帝的名義,殺了你”,既然能夠有權剝奪你生命的人只有上帝,那么我要殺了你就必須“以上帝的名義”了,也就是說這是上帝他老人家的意思。這也就是說,做一件事情必須有“名分”。看以前很多革命電影中,我們的革命戰士要槍斃叛徒的時候要說“我代表人民代表D槍斃了你”,應該這是一個意思吧。
                  朱棣要當BOSS就要打著“清君側”的旗號、洪秀全要造反就必須說自己是上帝的次子、小鬼子要發動七七事變就要找理由攻占宛平城、老美要弄死薩達姆就必須以找核武器為理由……看來無論是國內還是國外、無論是做好事還是做壞事名分都是很重要的,必須找個名分才能行動,如果哪天一個人做事不講“名分”的話估計也就是流氓透頂了吧。
          posted @ 2008-05-03 23:24 CowNew開源團隊 閱讀(410) | 評論 (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開源團隊 閱讀(893) | 評論 (2)編輯 收藏

          僅列出標題
          共30頁: First 上一頁 3 4 5 6 7 8 9 10 11 下一頁 Last 
          主站蜘蛛池模板: 天全县| 秦安县| 嘉义县| 萍乡市| 宝应县| 浏阳市| 麦盖提县| 连城县| 龙口市| 漯河市| 喀喇| 涞水县| 轮台县| 阿瓦提县| 定襄县| 赤城县| 南康市| 宿迁市| 闻喜县| 三河市| 买车| 韩城市| 辰溪县| 本溪市| 班玛县| 旺苍县| 衢州市| 松桃| 安吉县| 张掖市| 克东县| 西华县| 清水县| 嘉兴市| 那坡县| 天等县| 丹棱县| 广平县| 龙游县| 屯留县| 灌云县|