2010-05-25 4 views
1

우리는 Topaz Signature 패드를 사용하고 있습니다. 그들은 자신의 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

실제로 Topaz는 ActiveX 컨트롤과 .NET 래퍼를 제공합니다. .Net 래퍼로 전환 했으므로 폼이나 다른 것에 배치 할 필요가 없습니다. 나는 래퍼를 위해 실제로 다루지 않았기 때문에 나는 질문을 떠날 것이다.

+0

내 회사에서 우리는 유사한 과정을 구축, 대신 서명의 지문을 캡처 할. 우리는 IDGem LCD 1x5 리더를 사용하여 지문을 캡처합니다. 사용 가능한 지문 판독기 API는 ActiveX 컨트롤 (SigID.ocx) 인 것처럼 보이지만 웹 사이트에서 .NET 래퍼를 참조하십시오. 지문 인식 장치에 사용할 수있는 방법이 있습니까? –

0

COM 개체를 직접 사용할 수 있습니다 (실제로 컨트롤을 구현 한 방법에 따라 달라질 수 있음). 일반적으로 참조로 COM 개체를 가져올 때 래퍼 AxHost가 만들어 지지만 기본 클래스 개체도 가져와야합니다. 어떤 클래스가 AxHost 버전을 사용하지 않는지 확인하십시오. 기본 클래스 개체가없는 것처럼 보이면 Activator와 컨트롤의 CLSID 또는 ProgID를 사용하여 개체를 만들 수 있습니다. 같은 뭔가 :

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

2

그래, 이런 식으로 작동하지 않을 수 있습니다. AxHost 랩퍼는 사용하기 전에 Handle을 작성해야합니다. 어떤 Show() 메서드가 호출되는 폼에서 자식 컨트롤이 필요합니다.

일반적으로 ActiveX 컨트롤 인 AxHost 래퍼와 COM 인터페이스를 래핑하는 Blah.dll이 포함 된 AxBlah.dll에서 두 개의 interop 래퍼가 제공됩니다. 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); 
} 
관련 문제