Luk*_*ane 10 java embed swt ms-office
我正在尝试使用以下代码使用SWT将Office 2007/2010应用程序嵌入Java应用程序中:
import java.awt.Canvas;
import javax.swing.JFrame;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.ole.win32.*;
import org.eclipse.swt.widgets.*;
public class EmbeddingTest extends Canvas {
private void initOleViewer(String target) {
Display display = new Display();
Shell shell = SWT_AWT.new_Shell(display, this);
shell.setLayout(new FillLayout());
OleFrame oleFrame = new OleFrame(shell, SWT.NONE);
OleControlSite oleControlSite = new OleControlSite(oleFrame, SWT.NONE, "Word.Document");
oleControlSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);
OleAutomation word = new OleAutomation(oleControlSite);
int[] applicationId = word.getIDsOfNames(new String[]{"Application"});
Variant property = word.getProperty(applicationId[0]);
OleAutomation application = property.getAutomation();
int[] documentId = application.getIDsOfNames(new String[]{"Documents"});
property = application.getProperty(documentId[0]);
OleAutomation documents = property.getAutomation();
shell.open();
Variant[] arguments = new Variant[] { new Variant(target) };
int[] automationIDs = documents.getIDsOfNames(new String[]{"Open", "FileName"});
documents.invokeNoReply(automationIDs[0], arguments, new int[]{automationIDs[1]});
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
public static void main(String[] args) {
JFrame jFrame = new JFrame("Embedding Test");
jFrame.setVisible(true);
EmbeddingTest viewer = new EmbeddingTest();
jFrame.add(viewer);
jFrame.setSize(600, 600);
viewer.initOleViewer(args[0]);
}
}
Run Code Online (Sandbox Code Playgroud)
当我不尝试在文档对象上调用"打开"时,Word在应用程序中成功嵌入,但整个文件菜单被禁用.当我调用'打开'时,应用程序崩溃并出现以下错误(DISP_E_EXCEPTION):
Run Code Online (Sandbox Code Playgroud)Exception in thread "main" org.eclipse.swt.SWTException: Action can not be performed. result = -2147352567 at org.eclipse.swt.ole.win32.OLE.error(Unknown Source) at org.eclipse.swt.ole.win32.OleAutomation.invokeNoReply(Unknown Source) at EmbeddingTest.initOleViewer(EmbeddingTest.java:68) at EmbeddingTest.main(EmbeddingTest.java:88)
分别查询'Open'和'FileName'的ID会为'FileName'返回null,因此它不正确.我也试过没有命名参数没有任何成功:
documents.invokeNoReply(automationIDs[0], arguments);
Run Code Online (Sandbox Code Playgroud)
为什么不进行任何错误处理、结果检查或断言?请记住,这getIDsOfNames(..)将默默地失败并返回null无法识别的名称的值。
documents.getLastError()尝试在捕获有问题的异常后打印 的值。
| 归档时间: |
|
| 查看次数: |
4145 次 |
| 最近记录: |