2010-05-25 72 views
1

我们正在使用黄玉签名垫。他们提供他们的API来自将要放在Winform控件上的ActiveX控件。那么,我们的项目的工作方式,我们不希望有一个形式(至少不可见)。我们只想让签名的ActiveX控件在后台获取图像。使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; 
} 

好的,所以我在标记的行出现错误。例外是

 
Exception of type 'System.Windows.Forms.AxHost+InvalidActiveXStateException' was thrown. 

我该怎么做才能解决这个问题?创建一个新的隐藏表单并将控件放在它上面以便隐藏它会更容易吗?

回答

0

事实上,它结束了,黄玉提供了一个ActiveX控件和一个.NET包装。我切换到.Net包装,它不需要被放置在窗体或任何东西。我会留下这个问题,因为如果不是那个封装器我真的在处理它。

+0

在我的公司,我们想建立一个类似的过程,但捕捉指纹代替签名。我们使用IDGem LCD 1x5阅读器来捕获指纹。它看起来像只有可用的指纹识别器API是ActiveX控件(SigID.ocx),但在他们的网站上看到.NET包装。指纹识别器是否有专门的方法? – 2011-10-12 22:58:35

0

您可能可以直接使用COM对象(它确实取决于它们如何实现控件)。通常,当您将COM对象导入到引用中时,它将创建一个包装器AxHost,但它也应该导入基本类对象。找到那个只是创建它作为任何普通的类,不要使用AxHost版本。如果似乎没有任何基类对象,则可以使用Activator以及控件的CLSID或ProgID创建对象。喜欢的东西:

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

2

是,不能以这种方式工作。 AxHost包装器需要在可用之前创建Handle。这要求它是调用Show()方法的窗体上的子控件。

您通常会从ActiveX控件获取两个互操作封装,一个AxBlah.dll包含AxHost包装器和一个包装COM接口的Blah.dll。你只需要引用Blah.dll。这样做是否是一个悬而未决的问题,许多ActiveX控件都需要一个窗口句柄来处理线程同步。

如果这样做不起作用,您需要一个主机窗体。你可以把它无形将此代码粘贴到窗体类:

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

你必须调用Application.Run()泵消息循环。

1

这是我做的(基本上都添加了无形的斧控制,然后调用它的方法):

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); 
} 
相关问题