2

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

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

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 windows 窗体中引入的,但是我无法将这些对象添加为窗体控件。

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 实际添加为控件时,我似乎非常接近。

4

1 回答 1

1

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

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

于 2012-04-24T00:06:11.437 回答