2016-09-21 7 views
1

을 작동하지 않는 등의 DLL 모습은 내가 지문에 대한 InBios (컨트롤러)를 사용하는 응용 프로그램에서 사용할 zkemkeeper SDK를를 사용하려고 잠시 동안 stucked입니다. 내가 몇 가지 이벤트를 발생 시키려고 시도하는 동안 아무 일도 일어나지 않고, 나는 MVC에서 ASP.NET MVC를 구현하기 전에 SDK 테스트 용 콘솔 응용 프로그램을 만들었습니다. 먼저이 코드를 장치에 연결 한 다음 이벤트를 추가합니다. OnAttTransactionEx 누군가가 할 수 있습니다. 내가 잘못하고있는 것을 나에게 지적해라.ZKEmkeeper : 이벤트 트리거하지

private static void Main(string[] args) 
    { 
     CZKEMClass zkem = new CZKEMClass(); 
     int idwErrorCode = 0; 
     const string ipAddr = "10.0.1.240"; 
     bool isConnected; 
     try 
     { 
      isConnected = zkem.Connect_Net(ipAddr, Convert.ToInt32(4370)); 
     } 
     catch (Exception ext) 
     { 
      Console.WriteLine("Erro: " + ext); 
      zkem.GetLastError(ref idwErrorCode); 
      if (idwErrorCode != 0) 
      { 
       zkem.GetLastError(idwErrorCode); 
      } 
      else 
      { 
       Console.WriteLine("No data from terminal returns!"); 
      } 
      throw new Exception(); 
     } 

     if (isConnected) 
     { 
      //Here you can register the realtime events that you want to be triggered(the parameters 65535 means registering all) 
      zkem.EnableDevice(1, true); 
      zkem.RegEvent(1, 65535); 
      zkem.OnAttTransactionEx += axCZKEM1_OnAttTransactionEx; 

      string sdwEnrollNumber = ""; 
      int idwVerifyMode = 0; 
      int idwInOutMode = 0; 
      int idwYear = 0; 
      int idwMonth = 0; 
      int idwDay = 0; 
      int idwHour = 0; 
      int idwMinute = 0; 
      int idwSecond = 0; 
      int idwWorkcode = 0; 

      zkem.EnableDevice(1, false); //disable the device 
      if (zkem.ReadGeneralLogData(1)) 
      { 
       //read all the attendance records to the memory 
       while (zkem.SSR_GetGeneralLogData(1, out sdwEnrollNumber, out idwVerifyMode, 
        out idwInOutMode, out idwYear, out idwMonth, out idwDay, out idwHour, 
        out idwMinute, out idwSecond, ref idwWorkcode)) 
       { 
        //get records from the memory 

        DateTime datetime = new DateTime(idwYear, idwMonth, idwDay, idwHour, idwMinute, idwSecond); 
        int unixDate = (int) datetime.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; 
        try 
        { 
         Console.WriteLine(idwInOutMode); 
         Console.WriteLine(sdwEnrollNumber); 
         Console.WriteLine(unixDate); 
        } 
        catch (Exception ex) 
        { 
         //ignored 
        } 
        try 
        { 
         Console.WriteLine("inserted: " + 
              $"{idwYear}/{idwMonth}/{idwDay} {idwHour}:{idwMinute}:{idwSecond}.000"); 
        } 
        catch (Exception ex) 
        { 
        } 
       } 
      } 
      Console.WriteLine("Fim"); 
     } 
     else 
     { 
      zkem.GetLastError(ref idwErrorCode); 
      if (idwErrorCode != 0) 
      { 
       zkem.GetLastError(idwErrorCode); 
      } 
      else 
      { 
       Console.WriteLine("No data from terminal returns!"); 
      } 
     } 
     zkem.EnableDevice(1, true); 

     Console.WriteLine("Teste"); 
     do 
     { 
      while (!Console.KeyAvailable) 
      { 
      } 
     } while (Console.ReadKey(true).Key != ConsoleKey.Escape); 
    } 

    public static void axCZKEM1_OnAttTransactionEx(string sEnrollNumber, int iIsInValid, int iAttState, 
     int iVerifyMethod, int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, int iWorkCode) 
    { 
     Console.WriteLine("Finger Recognized"); 
    } 

답변

1

당신은 STA 스레드를 사용해야합니다

여기 내 코드입니다.

Thread TT = new Thread(() => 
{ 
    CZKEMClass zkem = new CZKEMClass(); 
    Application.Run(); 
}); 
TT.IsBackground = true; 
TT.SetApartmentState(ApartmentState.STA); 
TT.Start(); 

그런 다음 이벤트를 만듭니다. ZKEM 이벤트는 STA 스레드에서 발생합니다.

+0

감사합니다. 정말 도움이되었습니다. –

+0

@WaldirDePaulaNeto 어떻게 코드에서이 코드를 사용 했습니까? – user5173426

+0

이것은'Application'이'using System.Windows.Forms; '에서 왔기 때문에 에러가 발생합니다. 어떻게 asp.net mvc에서 사용합니까? – user5173426