轉自:http://blog.163.com/wm_at163/blog/static/13217349020114166447941/
Jacob的使用方法:
1.在工程中導入 jacob.jar 這個包。
2.把 jacob.dll 拷貝到 jdk\bin或者C:\WINDOWS\system32目錄下。
以上的兩個文件您可以到網上http://danadler.com/jacob/ 下載的1.9的版本
jacob.jar 與 jacob.dll 版本一致。
3.注冊ocx控件
l 先把***.ocx控件放入c:\windows\system32 文件夾下
l 在cmd命令行下,輸入regsvr32 ***.ocx命令進行注冊
異常解決:
1.java.lang.UnsatisfiedLinkError: no jacobin java.library.path
原因是:沒有把 jacob.dll 拷貝到 jdk\bin或者C:\WINDOWS\system32目錄下
2.Exception in thread "main" com.jacob.com.ComFailException: Can't get object clsid from progid
原因是:regsvr32 ***.ocx命令進行注冊后 ,獲取的progid有誤;
3.
Exception in thread "main"com.jacob.com.ComFailException: A COM exception has beenencountered:
At Invoke of: LoadFile
Description:災難性故障
at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:858)
at com.jacob.com.Dispatch.callN(Dispatch.java:455)
at com.jacob.com.Dispatch.call(Dispatch.java:544)
at com.lv.office.AIPToTest.jacob(AIPToTest.java:24)
at com.lv.office.AIPToTest.main(AIPToTest.java:14)
原因是:
在OCX控件中,重寫COleControl.IsInvokeAllowed (DISPID)方法,即在控件的CMyNameCtrl中增加一個方法
BOOL CMyNameCtrl::IsInvokeAllowed (DISPID)
{
return TRUE;
}
用這個方法的理由是:
這個錯誤是由ActiveX結構設計造成的。
在Ole4.0版本之前,外部程序是可以直接調用OCX中方法的。Ole4.0之后,每次調用控件中的方法,系統會自動檢查是否允許調用,即運行COleControl.IsInvokeAllowed (DISPID)
該方法檢查控件是否正確的初始化或者是否通過持久存儲接口正確加載,如果兩個條件有一個滿足,即返回TRUE,否則返回FALSE。
當控件在MFC中使用時,很多細節,如初始化,都被過濾了,這樣,大多數用戶都不會遇到這個問題。但是,當我們從C、C++的dll中調用控件時,不滿足上述條件,該方法返回FALSE,這時候再調用任何控件方法,都會出現上述異常。
-------------------還有就是
At Invoke of: LoadFile(LoadFile可能是其他內容)
Description:災難性故障(災難性故障可能是亂碼)
-----------------是你的jdk版本和jacob版本不一致的原因(個人看法)-