【问题标题】:ActiveX control in ironpython windows formIronpython windows窗体中的ActiveX控件
【发布时间】:2015-01-27 10:31:58
【问题描述】:

我在使用一组用于实验室仪器自动化的 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 实际添加为控件时,我似乎非常接近。

【问题讨论】:

    标签: winforms automation activex ironpython


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多