2012-04-23 66 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