Событие элемента управления .NET не работает в COM на Windows Embedded для POS - PullRequest
0 голосов
/ 06 августа 2009

У меня есть InteropUserControl в сборке .NET, который отлично работает в других операционных системах, таких как Windows XP и Windows 2000. Моя компания продает оборудование вместе с разрабатываемым нами программным обеспечением, и мы получаем различные типы сенсорных экранов «все в одном». рабочие станции. Некоторые Все продукты одной конкретной марки, установленные с Windows Embedded для торговых точек, демонстрируют странную проблему.

На InteropUserControl я выставляю событие следующим образом:

[ComVisible( true )]
[Guid( OrdCtl.EventsId )]
[InterfaceType( ComInterfaceType.InterfaceIsIDispatch )]
public interface __IControlEvents {
    [DispId( 1 )]
    void ItemSelected( int someid1, int someid2 );
}

И делегат события, и главный элемент управления (включая его создание) выглядят так:

[ComVisible( false )]
public delegate void ItemSelectedEventHandler( int someid1, int someid2 );

[Guid( MyControl.ClassId )]
[ClassInterface( ClassInterfaceType.None )]
[ComSourceInterfaces( "MyInteropControl.__IControlEvents" )]
[ComClass( MyControl.ClassId, MyControl.InterfaceId, MyControl.EventsId )]
public partial class MyControl : UserControl, _IMyControl {
    public const string ClassId = "... guid ...";
    public const string InterfaceId = "... guid ...";
    public const string EventsId = "... guid ...";

    public event ItemSelectedEventHandler ItemSelected;

    void OnItemSelected( int someid1, int someid2 ) {
        var del = this.ItemSelected;

        if ( del != null ) {
            del( someid1, someid2 );
        }
    }

    ...
}

Этот элемент управления используется в приложении VB6, и обработчик событий там также, как и следовало ожидать:

Private Sub MyControl_ItemSelected(ByVal someid1 As Long, ByVal someid2 As Long)
    'react to item selection event
End Sub

Однако, если машина демонстрирует некорректное поведение, событие ItemSelected в коде элемента управления равно null и поэтому не может быть вызвано. Поэтому я знаю , когда это не сработает, и вместо этого мог бы использовать обходной путь.

Событие корректно работает в Windows XP и Windows 2000, с .NET 2.0 Framework или .NET 3.5 Framework (проект нацелен на 2.0). У меня была одна машина с XP, демонстрирующая такое же поведение, но у нее была неудачная установка .NET 3.5. Переустановка .NET исправила эту машину. Я думал, что это было причиной, поэтому я решил переустановить на неисправных машинах.

На одной из неисправных машин с Embedded for POS я запустил установку 2.0 (ОС не поддерживается 3.5) и выбрал Repair. Это не решило проблему. Завтра утром я планирую попробовать удалить и переустановить компьютер, чтобы быть уверенным. Некоторые машины с этой ОС работают нормально, некоторые нет. Я подозреваю, что техник, который выполнял настройку этих машин, сделал что-то другое на этой последней партии машин. Информация, которую мне дали, неверна. Я проверил себя, и все машины с этой странной версией Windows демонстрируют ту же проблему.

Какие вероятные (или даже просто возможные) причины могут быть связаны с ошибкой, если событие неправильно "подключено" через COM-вызываемую оболочку? Добавлено : Как заставить его работать в Windows Embedded для торговых точек?

Я также принимаю предложения об обходных путях, надеясь услышать тот, который звучит достойно.

1 Ответ

0 голосов
/ 07 августа 2009

Оказывается, существует Service Pack 3 для WEPOS . После установки .NET Framework 3.5 будет установлен. После установки события работали нормально.

Урок: убедитесь, что все обновлено.

...