2012-02-05 28 views
1

我一直在嘗試執行最初看起來很平凡的任務:使用python和.NET打開WordPerfect程序。經過2周的接近成功和悲慘的失敗後,我開始懷疑所有的.NET路徑是否旨在引導程序員走向不可避免的購買真正版本的Visual Studio ...使用IronPython在NET中打開COM應用程序

這是我的基本工具:.NET版本4.030 ...; IronPython 2.7.1;帶有PyDev的Eclipse Indigo IDE; 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和import語句是由Eclipse的認可,並且整套PerfectScript命令的是內部的可用編輯器(但是,在將IronPython2.7 \ Lib \ site-packages文件夾中的WordPerfect.dll的副本放入之後)。

運行Eclipse中的腳本產生以下錯誤:

TypeError: AppMaximize() takes exactly 1 argument (0 given)

請注意,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() 
... 

爲了營造提及「的WordPerfect」在VB快遞,我只是瀏覽到的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): Retrieving the COM class factory for component with CLSID {40852D4E-0076-47CD-8C70-92E42B35E5EC} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: >0x80040154 (REGDB_E_CLASSNOTREG)).

想我也許需要把我的DLL進入GAC,我試過這個:

gacutil /i WordPerfect.dll 

給我扔了這個錯誤:

Failure adding assembly to the cache: Attempt to install an assembly without a strong name.

現在我被卡住了。

我是否需要爲這個第三方dll創建一個強命名的程序集? (我傾向於認爲這是不需要的。)

我是否錯過了python方面有關如何調用類對象的重要信息?

我錯過了某種實例/調用/咒語嗎?

爲什麼VB Express沒有與DLL的問題,我無法在Eclipse中有效地使用它?

我註定要花更多的錢購買更多的微軟產品嗎?

我對此帖子的長度表示歉意。而且,是的,使用WordPerfect仍然有很好的理由!

回答

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集成外殼+ PTVS + Iron Python中的最新代碼。

0

也許你需要調用構造函數用於PerfectScript

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

,而不是當前

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

我確實嘗試了這個路線,但是我得到錯誤:「無法創建PerfectScript的實例,因爲它是抽象的」 – 2012-02-05 18:52:22