在ironpython窗口形式的ActiveX控件

时间:2012-04-23 22:29:24

标签: winforms automation activex ironpython

我在使用一组用于实验室仪器自动化的activeX控件方面遇到了困难。我已经将它们全部用于VB,在表单应用程序中 - 因为它们不能在控制台应用程序中工作。我的公司主要使用python,因此在python中编写驱动程序会有很大的优势,主要用于lims集成。

因此,我试图将我的activeX控件嵌入到ironpython窗体中。我尝试了两种不同的方式在表单中引入我的控件:

1)在原始ocx上使用AxImp后clr引用Ax 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 个答案:

答案 0 :(得分:1)

在创建其本机句柄之前,不能使用ActiveX控件的方法。换句话说,直到你调用窗体的Show()方法之后。

确保您正确了解Winforms应用程序的基本概要,查看示例C#Winforms应用程序的Program.cs源代码文件。 Application.Run()调用是必不可少的。使用表单的Load事件(或覆盖OnLoad)作为您可以实际开始使用该控件的第一个事件。