В С # .Net 4.0 я пытаюсь автоматизировать WordPerfect.

Для этого я добавляю в свой проект ссылку на файл wpwin14.tlb, который находится в папке программы WordPerfect.

Это привело к созданию COM-интерфейсов в моем проекте.

Затем я смогу написать код, создающий экземпляр объекта WordPerfect.PerfectScript, который я могу использовать для автоматизации WordPerfect.

Однако, когда я пытаюсь создать экземпляр объекта WordPerfect.PerfectScript, C # выдает ошибку:

«Невозможно преобразовать COM-объект типа 'System .__ ComObject' к типу интерфейса 'WordPerfect.PerfectScript'. Эта операция завершилась неудачно из-за вызова QueryInterface компонента COM для интерфейса с IID '{C0E20006-0004-1000-0001-C0E1C0E1C0E1} 'не удалось из-за следующей ошибки: сервер RPC недоступен (исключение из HRESULT: 0x800706BA). "

Главное в этом сообщении (я верю) заключается в том, что сервер RPC недоступен.

Я пробовал это с WordPerfect, работающим в фоновом режиме и без него. И я пошел к своим службам и убедился, что все службы RPC работают, и все перезапустил.

Возможно ли, что меня заблокирует брандмауэр? Это моя единственная слабая догадка

0
Chad 6 Мар 2015 в 00:14

2 ответа

Лучший ответ

Я просто оборачиваю его как вызов OLE и очищаю свой COM-объект с помощью FinalReleaseComObject.

Вот простой класс-оболочка, который я использовал для открытия документов 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);
        }
    }
}
1
AlexB 9 Мар 2015 в 15:31

Убедитесь, что в вашей версии 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;

    }
}
}

Установка пакетов обновлений «волшебным образом» устранила проблему.

Кстати, для справки в будущем вы также можете попробовать форумы WPUniverse. Есть немало экспертов по WP, которые регулярно отвечают на сложные вопросы.

Здесь также есть ссылка на обновления X4 здесь:

0
Ric Gaudet 7 Мар 2015 в 03:26