2012-01-05 24 views
1

私はUSBを初めて使い、バックグラウンドタイマーの実行方法を理解してから、起動時にUSBデバイスから読み取ります。ここで私はそれが期限切れになったとき、私のタイマーや火災方法を開始するために使用していますものです:USBからタイマーを使って読む

void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    //ReadUSB(); 
} 

private void wndwMain_ContentRendered(object sender, EventArgs e) 
{ 
    USBInit(); 
    if (deviceFound) 
    { 
     System.Timers.Timer myTimer = new System.Timers.Timer(1000); 
     myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed); 
     myTimer.Start(); 
    } 
} 

今私はReadUSB()を呼び出したいが、私はEntryPointNotFound例外をスローしています。私はJan AxelsonのUSBのUSBコードを使用しています。私は遅れがUSBのために長すぎることを知っている、私はちょうどテスト目的のためにそれを入れ、私はすべてが動作していることを確認したらそれを減らすだろう。

ReadUSB()で例外:

private void ReadUSB() 
    { 
     IntPtr eventObject = IntPtr.Zero; 
     NativeOverlapped HidOverlapped = new NativeOverlapped(); 
     Byte[] inputReportBuffer = null; 
     Int32 numberOfBytesRead = 0; 
     Int32 result = 0; 
     Boolean success = false; 
     IntPtr unManagedBuffer = IntPtr.Zero; 
     IntPtr unManagedOverlapped = IntPtr.Zero; 

     Array.Resize(ref inputReportBuffer, Capabilities.InputReportByteLength); 

     eventObject = CreateEvent 
      (IntPtr.Zero, 
      false, 
      false, 
      String.Empty); 

     HidOverlapped.OffsetLow = 0; 
     HidOverlapped.OffsetHigh = 0; 
     HidOverlapped.EventHandle = eventObject; 

     unManagedBuffer = Marshal.AllocHGlobal(inputReportBuffer.Length); 
     unManagedOverlapped = Marshal.AllocHGlobal(Marshal.SizeOf(HidOverlapped)); 
     Marshal.StructureToPtr(HidOverlapped, unManagedOverlapped, false); 

     readHandle = CreateFile 
      (devicePathName, 
      GENERIC_READ, 
      FILE_SHARE_READ | FILE_SHARE_WRITE, 
      IntPtr.Zero, 
      OPEN_EXISTING, 
      FILE_FLAG_OVERLAPPED, 
      0); 

     success = ReadFile 
      (readHandle, 
      unManagedBuffer, 
      inputReportBuffer.Length, 
      ref numberOfBytesRead, 
      unManagedOverlapped); 

     // If ReadFile returned true, report is available. Otherwise, check for completion 
     if (!success) 
     { 
      result = WaitForSingleObject 
       (eventObject, 3000); 

      switch (result) 
      { 
       case WAIT_OBJECT_0: 
        success = true; 
        GetOverlappedResult 
         (readHandle, 
         unManagedOverlapped, 
         ref numberOfBytesRead, 
         false); 
        break; 
       case WAIT_TIMEOUT: 
        Cancello(readHandle); <-- Exception thrown here. 
        break; 
       default: 
        Cancello(readHandle); 
        break; 
      } 
     } 
+3

このメソッドは 'Cancello'ではなく、' CancelIo'と呼ばれます。 –

+0

@RogerLipscombe、これはそうだったようです。答えに入れて、私はそれを受け入れるでしょう。 –

+0

私は、コンパイルエラーを生成しなかったことに驚いていますか? –

答えて

1

方法のいわゆるないCancello(小文字l付き)(大文字I有する)CancelIo

関連する問題