【问题标题】:Microsoft Visio OLE Automation error loggingMicrosoft Visio OLE 自动化错误日志记录
【发布时间】:2015-07-02 13:56:21
【问题描述】:

我正在使用 SWT(标准小部件工具包)提供的 OleAutomation Java API 来操作 Visio 文档。我们使用 OleAutomation 调用在自动化 API 上生成了 Java 包装器。例如:(形状删除)

/**
 * COM Id: 11
 */

public void Delete() {
    //Invoke
    Variant varInputArray[] = new Variant[0];
    Variant varResult = oleAutomation.invoke(11, varInputArray);
    for (Variant _varItr : varInputArray) {
        _varItr.dispose();
    }
    if(varResult !=null)
    {
        varResult.dispose();
    }
}

从应用程序逻辑中的某个位置调用此删除时,我遇到了一个特殊的问题。在一个页面上,我放置一个形状并调用删除。对于奇数调用,删除成功并且 varResult 返回 VT_EMPTY(1st,3rd,5th.... time call)。对于偶数调用(我将形状再次放在页面上并调用 -2nd、4th 6th 等),varResult 返回“null”,表示失败。现在我需要了解偶数呼叫出了什么问题。 Visio 自动化框架中是否有某种日志记录工具可以记录失败的原因?

【问题讨论】:

  • 我查看了 SWT 代码库中的 oleAutomation.invoke() 调用。对于失败的删除操作,会抛出描述为“当前已禁用请求的操作”的异常。有什么线索吗?

标签: java swt visio ole-automation


【解决方案1】:

尝试向后删除形状。 IE。删除形状时向后迭代集合。 这意味着,而不是:

shapes = Page.Shapes;
foreach (shape : shapes)
{
    if (xxx)
        shape.Delete()
}

试试这个

shapes = Page.Shapes;
for (int i = shapes.Count; i > 0; --i)
{
    if (xxx)
        shapes[i].Delete()
}

意味着,Visio 有一些“幼稚”的集合管理,因此在迭代集合时从集合中删除项目可能会给您带来麻烦,并且应该小心操作,就像对数组所做的那样。

或者,您可以先选择所有要删除的形状,然后一次性删除它们:

shapes = Page.shapes;
sel = Page.CreateSelection(visSelTypeEmpty);

foreach (shape : shapes)
{
    if (xxx)
        sel.Select(shape, visSelect);
}

sel.Delete();

【讨论】:

  • 我知道这种方法。在我的特殊情况下,我正在删除一个形状。这是两个形状之间的连接器形状[“conx”形状]。“conx”形状连接到触发服务器调用的两个块形状,服务器返回操作失败状态。由于失败,我在 Visio 页面上删除了这个“conx”形状。现在删除成功。现在我再次重复该操作,即将这个“conx”形状放在 Visio 页面上并将其连接到块形状。服务器再次返回失败状态,但我这次尝试删除“conx”形状失败了。
  • 好的,如果您知道这一点,那么问题可能出在其他地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多