Откройте приложение COM в NET, используя IronPython - PullRequest
1 голос
/ 05 февраля 2012

Я пытался выполнить то, что изначально казалось тривиальной задачей: открыть программу 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!

Ответы [ 2 ]

0 голосов
/ 23 июля 2013

После года неиспользования .NET я попробовал еще раз и обнаружил, что правильный класс для создания экземпляра - «PerfectScriptClass», а не «PerfectScript», который является классом, используемым в VB.NET. Все еще смущен, но по крайней мере это работает! Также необходимо вызвать метод конструктора "()", как отметил Натан.

import clr
clr.AddReference ('WordPerfect')
import WordPerfect
WP = WordPerfect.PerfectScriptClass()
WP.AppMaximize ()       # AppMaximize is a PerfectScript call to open the program

Другие команды PerfectScript, похоже, также работают. Я попробовал последний код в интегрированной оболочке Visual Studio 2012 + PTVS + Iron Python.

0 голосов
/ 05 февраля 2012

Возможно, вам нужно вызвать конструктор для PerfectScript

WP = WordPerfect.PerfectScript()
WP.AppMaximize ()  

вместо текущего

WP = WordPerfect.PerfectScript
WP.AppMaximize ()  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...