WordPerfect COM 自动化错误

WordPerfect COM Automation Error

在 c# .Net 4.0 中,我试图自动化 WordPerfect。

为此,我在我的项目中添加了对位于 WordPerfect 程序文件夹中的 wpwin14.tlb 文件的引用。

这具有在我的项目中创建 COM 接口的效果。

接下来我应该能够编写实例化 WordPerfect.PerfectScript 对象的代码,我可以使用该对象来自动化 WordPerfect。

但是,当我尝试实例化 WordPerfect.PerfectScript 对象时,c# 抛出错误:

"Unable to cast COM object of type 'System.__ComObject' to interface type 'WordPerfect.PerfectScript'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{C0E20006-0004-1000-0001-C0E1C0E1C0E1}' failed due to the following error: The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)."

该消息中要归零的事情(我相信)是 RPC 服务器不可用。

我已经尝试过在后台使用 WordPerfect 运行 和不使用它。我已经去我的服务并确保 RPC 服务都是 运行 并重新启动一切。

我是否可能被防火墙阻止了?这是我唯一的猜测

确保您的 WordPerfect 版本安装了所有服务包和修补程序。多年来,这一步为我解决了许多听起来很随意的问题。看起来您正在使用 X4,Corel 不再支持它,这意味着更新不再出现在其网站上。您应该是 运行 版本 14.0.0.756(SP2 加 2 个修补程序)。

我刚刚卸载了 WPX4 并重新安装,没有服务包更新。 运行 此代码给出了与 OP 相同的错误:

using System.Runtime.InteropServices;
using WordPerfect;

namespace WP14TLB
{


class Program
{
    static void Main(string[] args)
    {

        PerfectScript ps = new PerfectScript();
        ps.WPActivate();
        ps.KeyType("Hello WP World!");

        Marshal.ReleaseComObject(ps);
        ps = null;

    }
}
}

安装服务包 "magically" 解决了这个问题。

顺便说一句,为了将来参考,您也可以尝试 WPUniverse forums。有相当多的WP高手定期解答疑难问题

还有一个 link X4 更新 here:

我只是将其包装为 OLE 调用并使用 FinalReleaseComObject 清理我的 COM 对象。

这是一个简单的包装器 class 我一直在使用它来打开 Wp 文档并将它们转换为 pdf。它在我们的自动化过程中清理得很好:

public class WpInterop : IDisposable
{
    private bool _disposed;
    private PerfectScript _perfectScript;

    public PerfectScript PerfectScript
    {
        get
        {
            if (_perfectScript == null)
            {
                Type psType = Type.GetTypeFromProgID("WordPerfect.PerfectScript");
                _perfectScript = Activator.CreateInstance(psType) as PerfectScript;
            }
            return _perfectScript;
        }
    }

    protected void Dispose(bool disposing)
    {
        if (disposing)
        {
            Marshal.FinalReleaseComObject(_perfectScript);
        }
        _disposed = true;
    }

    public void Dispose()
    {
        if (_disposed == false)
        {
            GC.SuppressFinalize(this);
            Dispose(true);
        }
    }
}