Я пытался выполнить то, что изначально казалось тривиальной задачей: открыть программу WordPerfect с использованием Python и .NET.После двух недель почти успешного и жалкого сбоя я начинаю задумываться, все ли пути .NET предназначены для того, чтобы привести программиста к неизбежной покупке реальной версии Visual Studio ...
Вот мойосновные инструменты: .NET версия 4.030 ...;IronPython 2.7.1;Eclipse Indigo IDE с PyDev;WordPerfect x4 (я тоже пытался использовать x5 с теми же результатами).
Я преобразовал wpwin14.tlb в сборку .NET с помощью программы tlbimp.exe из командной строки Windows:
tlbimp wpwin14.tlb / out: NETwpwin14.dll
Программа преобразовала файл .tlb, но по некоторым причинам переименовала его в «WordPerfect.dll».
Затем я зарегистрировал сборку с помощью команды RegAsm, действующей от имени администратора компьютера:
regasm WordPerfect.dll
Я получил сообщение о том, что сборка была зарегистрирована (гдебыло зарегистрировано, неизвестно).
Затем я попытался подключиться к программе, используя следующий код:
import clr
clr.AddReference ('WordPerfect')
import WordPerfect
WP = WordPerfect.PerfectScript
WP.AppMaximize () # AppMaximize is a PerfectScript call to open the program
Ссылка clr на WordPerfect и оператор импорта были распознаны Eclipse, ивесь набор команд PerfectScript был сделан доступным внутри редактора (однако, только после помещения копии WordPerfect.dll в папку IronPython2.7 \ Lib \ site-packages).
Запуск сценария из Eclipse вызвал следующую ошибку:
TypeError: AppMaximize () принимает ровно 1 аргумент (0 дано)
Обратите внимание, что AppMaximize () не требует никаких аргументов для правильной работы.
Попытка других команд PerfectScript, таких как WPActivate () и RevealCodes (1), привела к аналогичным ошибкам, за исключением того, что команде RevealCodes (1) каким-то образом удалось включить эту функцию наВ следующий раз, когда я открыл WordPerfect из GUI вручную.
Я получил ту же ошибку при запуске сценария внутри интерпретатора IronPython и с той же возможностью импортировать класс и проверять его.
IТак сформулировал код Python, основываясь на предыдущем успешном опыте использования VB.NET в Visual Basic 2010 Express.Этот код по сути был таким:
Imports WordPerfect
Module Module1
Dim wpwin As WordPerfect.PerfectScript = New WordPerfect.PerfectScript
wpwin.AppMaximize()
...
Чтобы создать ссылку на «WordPerfect» в VB Express, я просто просмотрел тот же самый файл wpwin14.tlb в каталоге программ WordPerfect и поместил его вCOM-бокс.Затем VB Express преобразовал этот файл в пригодную для использования dll (очевидно, не используя те же методы, которые я использовал).
Затем я попробовал подход, аналогичный тому, что предлагает страница учебника IronPython (http://www.ironpython.info/index.php/Interacting_with_Excel),, которыйчтобы вызвать «ApplicationClass» внутри объекта:
import clr
clr.AddReference ('Microsoft.Office.Interop.Excel')
from Microsoft.Office.Interop import Excel
ex = Excel.ApplicationClass()
Запуск этого кода открыл Excel без жалоб.
Быстрый просмотр структуры моего импортированного класса WordPerfect с использованием dir ()обнаружил метод ApplicationClass.
Затем я попробовал следующие команды (используя интерпретатор IronPython):
import clr
clr.AddReference ('WordPerfect')
import WordPerfect as WP
WP.ApplicationClass()
Я получил еще одну ошибку, с соответствующей частью здесь:
EnvironmentError: System.Runtime.InteropServices.COMException (0x80040154): Не удалось получить фабрику класса COM для компонента с CLSID {40852D4E-0076-47CD-8C70-92E42B35E5EC} из-за следующей ошибки: 80040154 Класс не зарегистрирован (исключение изHRESULT:> 0x80040154 (REGDB_E_CLASSNOTREG)).
Думая, что, возможно, мне нужно было поставить свой DLL Into GAC, я попробовал это:
gacutil /i WordPerfect.dll
Это вызвало у меня эту ошибку:
Ошибка добавления сборки в кэш: Попытка установить сборку без строгого имени.
Теперь я застрял.
Нужно ли делать сборку со строгим именем для этой dll третьей стороны?(Я склонен думать, что в этом нет необходимости.)
Мне не хватает чего-то важного на стороне Python относительно того, как называются объекты класса?
Я пропустил какое-то заклинание создания / вызова / заклинания?
Почему у VB Express нет проблем с dll, и я не могу эффективно использовать его в Eclipse?
Обречен ли я тратить большие деньги на другие продукты Microsoft?
Я прошу прощения за длину этого поста.И да, есть все еще веские причины использовать WordPerfect!