EPAD Wacom: при попытке отправить экраны во второй и следующий раз происходит сбой

Я испытываю некоторые странные поведения в DLL, которая ссылается на некоторые библиотеки из Wacom Epad (модель STU-530/G). Эта DLL взаимодействует с epac wacom через его API, чтобы посылать экраны в epad, получать от него события и действовать соответственно.

Эта DLL предлагает открытый класс "MyEPADControl", который предоставляет некоторые открытые методы:

namespace My.Apps.DLL.EPAD
{
      [ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(ISignEvent)), Guid("471F7EA0-E502-4bc0-9FF7-818C3ADDA2ED"), ProgId("MyEPAD.MyEPADControl")]
      public class MyEPADControl: UserControl, ISignControl, IObjectSafety
      {
          public ConnectWacom()
          {
              // Code to connect to Wacom using Wacom API
          }

          public DisconnectWacom()
          {
            // Code to disconnect from Wacom using Wacom API 
          }
       }
}

[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComImport]
public interface IObjectSafety
{
    [PreserveSig]
    long GetInterfaceSafetyOptions(ref Guid iid, out int pdwSupportedOptions, out int pdwEnabledOptions);

    [PreserveSig]
    long SetInterfaceSafetyOptions(ref Guid iid, int dwOptionSetMask, int dwEnabledOptions);
}

[Guid("29C227A4-F0CA-4a8f-A5DF-80D453A9A7A3"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ISignControl
{
}

Теперь у меня есть приложение WPF MVVM, которое использует форму WinForms для взаимодействия с Wacom Epad через указанную выше DLL. Эта форма WinForms выглядит так:

MyWinFormEPAD.cs:

internal partial class MyWinFormEPAD : Form
{
    public MyWinFormEPAD ()
    {
        CheckForIllegalCrossThreadCalls = false;

        InitializeComponent();            
    }
}

Он состоит из формы Windows и одного элемента управления, который указывает на указанную выше DLL, как показано ниже в этом коде:

MyWinFormEPAD.Designer.cs:

partial class MyWinFormEPAD 
{
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    // Here Windows Form Designer generated code

    internal My.Apps.DLL.EPAD.MyEPADControl wacomEpadControl1;
}

Наконец, из класса в моем приложении WPF MVVM (не в классе модели представления) я выполняю следующее:

public class MyHelperControl : IDisposable  
{

    public int Execute(List<Screen> lstScreens)
    {
            // Other stuff

            using (MyWinFormEPAD myFrm = new MyWinFormEPAD())
            {
                myFrm.wacomEpadControl1.ConnectWacom();

                // Other stuff, send screens, etc, and wait wacom returns the control in order to continue with other tasks

                myFrm.wacomEpadControl1.DisconnectWacom();
            }

            // Other stuff
    }
}

Выше класса создается каждый раз, когда я хочу отправить больше экранов (они не могут быть отправлены все вместе с первыми, потому что они создаются и отправляются по требованию, в зависимости от того, что пользователь ответил на предыдущих экранах epad первым). Также выше класс создается из другого класса, скажем, MyClassCaller:

public class MyClassCaller
{
     public int PrepareAndSend()
     {
         List<Screen> lstScreens = GetFirstScreen();

         bool blnContinue = true;

         do
         {
             MyHelperControl ctrlHelper = new MyHelperControl ();
             int response = ctrlHelper.Execute(lstScreens);
             switch (response)
             {
                 case 0  : lstScreens = GetNextScreens(0);
                           break;
                 case 10 : lstScreens = GetNextScreens(1);
                           break;
                 case 20 : lstScreens = GetNextScreens(2);
                           break;
                 case 99 : blnContinue = false;
                           break;
                 default : throw new ArgumentNullException("unexpected response");
                           break; 
             }                 
         }
         while (blnContinue);

         // Other stuff here
     }
}

Моя проблема ниже: когда я впервые отправил экран в эпизод Wacom, он работает, он отображается в эпизоде. Но во второй и следующий раз я пытаюсь отправить экраны в Wacom Epad, он выходит из строя.

Процесс такой:

  1. Первый раз: подключитесь к Wacom и отправьте первый экран.
  2. Ждите ответа пользователя
  3. Когда пользователь ответит на вопрос на первом экране, wacom вернется
    контроль.
  4. Я обрабатываю ответ пользователя и отключаюсь от Wacom. При отключении я очищаю экран wacom, но он не работает.
  5. Второй раз: я пытаюсь отправить второй экран в Wacom, поэтому я пытаюсь снова подключиться к Wacom. Результат: не удается подключиться к Wacom, он не отвечает, кажется заблокированным и в результате этого через 1 секунду экран wacom автоматически очищается и сбрасывается в состояние готовности. После этого, если я пытаюсь отправить экран в Wacom, он снова работает. Такое поведение появляется после того, как я успешно отправил экран в Wacom, следующий не работает. Шаблон при отправке экранов в Wacom приведен ниже:

Экран Ок, Экран Нок, Экран Ок, Экран Нок и так далее...

Когда он пытается подключиться через:

myFrm.wacomEpadControl1.ConnectWacom();

он не обнаруживает Wacom. Для подключения я делаю ниже через wacom API:

this.IsConnected = this.axPad1.OpenConnection();

Но это не работает, и он возвращается не подключенным, и сразу же экран wacom очищается и wacom сбрасывается в нормальное состояние (Готово).

Наконец, я наблюдал странное поведение: сразу после вызова myFrm.wacomEpadControl1.DisconnectWacom(), если я показываю окно сообщений и закрываю его, экран wacom очищается правильно, и я могу продолжить отправку следующего экрана без проблем.

0 ответов

Другие вопросы по тегам