我一直在尝试执行最初看起来很简单的任务:使用python和.NET打开WordPerfect程序。经过2周的近乎成功和悲惨的失败后,我开始怀疑所有.NET路径是否都旨在引导程序员不可避免地购买真正版本的Visual Studio ......
以下是我的基本工具:.NET 4.030版; IronPython 2.7.1;带有PyDev的Eclipse Indigo IDE; WordPerfect x4(我也试过使用x5,结果相同)。
我使用Windows命令行中的tlbimp.exe程序将wpwin14.tlb转换为.NET程序集:
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
Eclipse识别出对WordPerfect和import语句的clr引用,并且整个PerfectScript命令集在编辑器中可用(但是,只有在将一个WordPerfect.dll复制到IronPython2.7之后) Lib \ site-packages文件夹)。
从Eclipse运行脚本会产生以下错误:
TypeError:AppMaximize()只取1个参数(0给定)
请注意,AppMaximize()不需要任何参数才能正确运行。
尝试其他PerfectScript命令,如WPActivate()和RevealCodes(1)也会产生类似的错误,除了RevealCodes(1)命令在下次我从GUI手动打开WordPerfect时设法转动该功能。
在IronPython解释器中运行脚本时遇到了同样的错误,并且具有导入类并检查它的相同功能。
基于之前在Visual Basic 2010 Express中使用VB.NET的成功经验,我以这种方式表达了python代码。该代码基本上是这样的:
Imports WordPerfect
Module Module1
Dim wpwin As WordPerfect.PerfectScript = New WordPerfect.PerfectScript
wpwin.AppMaximize()
...
为了在VB Express中创建对“WordPerfect”的引用,我只浏览了WordPerfect程序目录中的同一个wpwin14.tlb文件并将其放入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,没有任何抱怨。
使用dir()快速查看导入的WordPerfect类的结构,发现了一个ApplicationClass方法。
然后我尝试了以下命令(使用IronPython解释器):
import clr
clr.AddReference ('WordPerfect')
import WordPerfect as WP
WP.ApplicationClass()
我收到了另一个错误,相关部分在这里:
EnvironmentError:System.Runtime.InteropServices.COMException(0x80040154):由于以下错误,检索具有CLSID {40852D4E-0076-47CD-8C70-92E42B35E5EC}的组件的COM类工厂失败:80040154未注册类(例外HRESULT:> 0x80040154(REGDB_E_CLASSNOTREG))。
想想我可能需要把我的dll放到GAC中,我试过这个:
gacutil /i WordPerfect.dll
告诉我这个错误:
将程序集添加到缓存失败:尝试安装没有强名称的程序集。
现在我被卡住了。
我是否需要为此第三方dll创建一个强名称的程序集? (我倾向于认为这不是必需的。)
我是否遗漏了关于如何调用类对象的python方面的重要内容?
我是否错过了某种实例化/调用/咒语法术?
为什么VB Express对dll没有任何问题,我无法在Eclipse中有效使用它?
我注定要花更多的钱购买更多的微软产品吗?
我为这篇文章的篇幅道歉。而且,是的,仍然有充分的理由使用WordPerfect!
答案 0 :(得分:0)
也许你需要调用PerfectScript的构造函数
WP = WordPerfect.PerfectScript()
WP.AppMaximize ()
而不是当前的
WP = WordPerfect.PerfectScript
WP.AppMaximize ()
答案 1 :(得分:0)
在不使用.NET一年后,我再次尝试,并发现要实例化的正确类是“PerfectScriptClass”,而不是“PerfectScript”,这是VB.NET中使用的类。仍然困惑,但至少它的工作原理!还需要调用构造函数方法“()”,如Nathan所指出的那样。
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集成shell + PTVS + Iron Python中的最新代码。