我在用于实验室仪器自动化的一组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中,当实例被添加为控件时,看起来我非常接近。
坚实,非常感谢!它似乎在工作。很近 :) – user1328265 2012-04-24 00:20:10