2012-04-23 53 views
2

我在用於實驗室儀器自動化的一組activeX控件時遇到了困難。我已經讓他們在VB中工作,在表單應用程序中 - 因爲他們不能在控制檯應用程序中工作。我的公司主要使用python,因此在使用python編寫我們的驅動程序時會有很大的優勢,主要用於限制集成。Ironpython窗體中的ActiveX控件

因此,我試圖在Ironpython窗體中嵌入我的activeX控件。我嘗試了兩種不同的方式在窗體中引入我的控件:

1)在原始ocx上使用AxImp後,使用clr引用Axe dll。然後,我將控件的實例添加爲表單控件,並嘗試從那裏運行它。它拋出System.Windows.Forms.AxHost + InvalidActiveXStateException。

import clr 
clr.AddReferenceToFileAndPath(r"C:\dlls\AxVCode3Lib.dll") 
clr.AddReferenceByPartialName("System.Windows.Forms") 

import System.Windows.Forms as Forms 
import AxVCode3Lib 

class activeXform(Forms.Form): 
    def __init__(self): 
     a = AxVCode3Lib.AxVCode3() 
     self.Controls.Add(a) 
     for i in self.Controls: 
      r = i.Initialize("serial") 
      print r 

form = activeXform() 
raw_input(">exit") 

2)使用SystemReflection和的ProgID,這將引發一個通用的「異常已被調用的目標引發異常」。以下代碼是在基本的Ironpython窗體中引入的,但是我無法將這些對象添加爲窗體控件。

import System.Type 
import System.Reflection 
import System.Array 

oType = System.Type.GetTypeFromProgID("VCODE3.VCode3Ctrl.1") 
o = System.Activator.CreateInstance(oType) 
args = System.Array[str](['serial']) 

try: 
    r = oType.InvokeMember("Initialize", System.Reflection.BindingFlags.InvokeMethod, None, o, args) 
    print r 
except Exception as e: 
    print e 

現在我懷疑這些例子都失敗了,因爲我的表單中缺少一些屬性。但是我無法弄清楚它是什麼,特別是在情況1中,當實例被添加爲控件時,看起來我非常接近。

回答

1

在創建本機句柄之前,您無法使用ActiveX控件的方法。換句話說,直到你調用窗體的Show()方法之後。

請確保您獲得Winforms應用程序的基本輪廓正確,在示例C#Winforms應用程序的Program.cs源代碼文件中查看。 Application.Run()調用是必不可少的。使用窗體的Load事件(或覆蓋OnLoad)作爲您可以真正開始使用該控件的第一個事件。

+0

堅實,非常感謝!它似乎在工作。很近 :) – user1328265 2012-04-24 00:20:10