2

ラボ機器の自動化に使用される一連の ActiveX コントロールに問題があります。コンソール アプリケーションでは動作しないため、VB やフォーム アプリケーションですべて動作するようにしました。私の会社は主に python で作業しているため、主に lims の統合のために、ドライバーを python で書くことには大きな利点があります。

そのため、ironpython Windows フォーム内に ActiveX コントロールを埋め込もうとしました。フォームにコントロールを導入する 2 つの異なる方法を試しました。

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 に答える