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, он выходит из строя.
Процесс такой:
- Первый раз: подключитесь к Wacom и отправьте первый экран.
- Ждите ответа пользователя
- Когда пользователь ответит на вопрос на первом экране, wacom вернется
контроль. - Я обрабатываю ответ пользователя и отключаюсь от Wacom. При отключении я очищаю экран wacom, но он не работает.
- Второй раз: я пытаюсь отправить второй экран в 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 очищается правильно, и я могу продолжить отправку следующего экрана без проблем.