1

トパーズ シグネチャー パッドを使用しています。Winform コントロールに配置される ActiveX コントロールの形式で API を提供します。さて、私たちのプロジェクトが機能する方法では、フォームは必要ありません (少なくとも表示されません)。署名 ActiveX コントロールがバックグラウンドで画像を取得できるようにしたいだけです。

static AxSigPlus sig = new AxSIGPLUSLib.AxSigPlus();

public static void Begin()
{
    ((System.ComponentModel.ISupportInitialize)(sig)).BeginInit();
    sig.Name = "sig";
    sig.Location = new System.Drawing.Point(0, 0);
    sig.Size = new System.Drawing.Size(0, 0);
    sig.Enabled = true;

    sig.TabletState = 1; //error here
    sig.SigCompressionMode = 0;
}

わかりましたので、マークされた行でエラーが発生します。例外は

タイプ 'System.Windows.Forms.AxHost+InvalidActiveXStateException' の例外がスローされました。

この問題を解決するにはどうすればよいですか? 新しい非表示のフォームを作成し、コントロールを非表示にする方が簡単でしょうか?

4

4 に答える 4

2

はい、この方法では機能しません。AxHost ラッパーを使用するには、Handle を作成する必要があります。Show() メソッドが呼び出されるフォームの子コントロールである必要があります。

通常、ActiveX コントロールから 2 つの相互運用ラッパーを取得します。AxHost ラッパーを含む AxBlah.dll と、COM インターフェイスをラップする Blah.dll です。Blah.dll を参照するだけで済みます。それが機能するかどうかは未解決の問題ですが、多くの ActiveX コントロールでは、スレッド同期を処理するためにウィンドウ ハンドルが必要です。

それがうまくいかない場合は、ホスト フォームが必要になります。このコードをフォーム クラスに貼り付けることで、非表示にすることができます。

    protected override void SetVisibleCore(bool value) {
        if (!IsHandleCreated) CreateHandle();
        value = false;
        base.SetVisibleCore(value);
    }

メッセージ ループをポンピングするには、 Application.Run() を呼び出す必要があります。

于 2010-05-25T19:19:04.567 に答える
1

COM オブジェクトを直接使用することもできます (コントロールの実装方法によって異なります)。通常、COM オブジェクトを参照にインポートすると、ラッパー AxHost が作成されますが、基本クラス オブジェクトもインポートする必要があります。それを見つけて、通常のクラスとして作成し、AxHost バージョンを使用しないでください。基本クラス オブジェクトがないように思われる場合は、Activator と、コントロールの CLSID または ProgID のいずれかを使用してオブジェクトを作成できます。何かのようなもの:

object o = Activator.CreateInstance(Type.GetTypeFromProgID("prog.id"))

于 2010-05-25T19:18:34.227 に答える
1

これは私がしたことです(基本的に、目に見えないAxコントロールを追加し、その後そのメソッドを呼び出しました):

using (AxRUNNERXLib.AxRunnerX crm = new AxRUNNERXLib.AxRunnerX ()) {
    Controls.Add (crm);
    crm.Visible = false;

    crm.CustomerPrefix = m_SelCall.CustomerPrefix;
    crm.LoadDefaultDescription ();
    crm.SearchByID (m_SelCall.CustomerID);
    crm.OperatorID = Form1.operatorID.ToString ();
    crm.ShowHistory ();

    Controls.Remove (crm);
}
于 2011-08-16T15:41:13.617 に答える
0

実際、Topaz は ActiveX コントロールとその周りの .Net ラッパーを提供することになりました。.Net ラッパーに切り替えましたが、フォームなどに配置する必要はありません。そのラッパーがなかったら、実際に対処していたので、質問はそのままにしておきます。

于 2010-05-25T22:00:50.887 に答える