使用IronPython在.NET中打开COM应用程序

时间:2012-02-05 06:26:18

标签: ironpython com-interop

我一直在尝试执行最初看起来很简单的任务:使用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!

2 个答案:

答案 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中的最新代码。