http://setting.iteye.com/blog/747295
————————————————————————————————————————————————
這幾年,做了很多word/excel/ppt方面的開發,特別是office插件/vsto/oba,和各種支持activex的ole嵌入環境下的應用。
基本上,了解了office對象模型,就可以在支持ole的環境下游刃有余的使用接口進行開發了。
不過office本身是不支持ole的,一般需要一個native的“外殼”包裹住,然后再在我們開發的環境下ole這個外殼。
例如,web頁面或一般環境中,使用dsoframer。SWT中使用OleClientSite。
這里講講OleClientSite。
windows下,SWT中(OS類)封裝了絕大部分常見的win32 api。而且SWT中的組件都是系統原生的,或是組合的,
所以調用Activex的窗口並交互成為了可能(AWT可以拿到原生窗口的句柄,也能別別扭扭的實現,純swing不是原生的,所以是拿不到的),
OleClientSite封裝了調用Activex並交互的細節。
大概的方式是:傳給OleClientSite一個Activex的progID,初始化一個Activex,並掛接到制定的composite上,
然后根據容器對Activex調用設置大小長寬。接着,通過一個OleAutomation封裝一個Activex中的原生對象的引用指針,
然后可以用getIDsOfNames根據屬性名或是方法名獲取對應id(做過mfc/atl-activex的都知道這個在IDL文件中注冊的id)。
然后可以調用OleAutomation的 getProperty/setProperty/invoke/invokeNoReply 等方法,獲取屬性或調用相應的方法。
當然返回結果可能還是原生對象,可以繼續用OleAutomation包裝,然后重復上面的過程。
SWT還提供了一個通用的類型包裝器,用來原生的幾種常見c類型和java類型的轉換:Variant。(很像vb里的那個吧)
------------------------------------- 想了解的看SWT源碼和com本質論去 -----------------------------------
附件是一個嵌入word,並定位word文檔中的字符串的例子。
ListOLE是傳遞一個OleAutomation,列出所有方法的工具類。源於網上。
txt文件夾提供了word.Application 和 word.Document對象的所有com接口方法和屬性。
運行Word.java,展示word文件:
點擊menu1,搜索定位字符串bbbbb: