Событие VB6, передающее аргумент bool, всегда верный в C # - PullRequest
2 голосов
/ 23 января 2012

Моя проблема проста, у меня есть событие, объявленное в библиотеке VB6, которое передает логический аргумент:

Public Event WriteComplete(ByVal aCommsOk As Boolean, ByVal aBadPIN As Boolean)

Я много раз подключал свой код C # к этому событию, но странно, мой отдел тестированияи пара других людей заметили, что, хотя VB6 вызывает это событие с aBadPIN, установленным в false, обработчик события c # получает его как true.Это не соответствует, поэтому это одна из «тех» проблем, но я не нахожу в Интернете ничего, что могло бы сильно помочь.

Я обнаружил, что если я определяю новое событие, которое преобразует bool в байт и отправляет его, то оно преобразуется обратно в c #, это устраняет проблему на этих проблемных компьютерах.Тем не менее, я действительно не хочу этого делать, поскольку мне придется делать это для каждого отдельного bool, который маршалируется между моими библиотеками COM и .Net (а их много).

Iтакже где-то читал, что есть известная ошибка (по крайней мере, в C ++), когда нужно принудительно заставить регистр EAX равным 255 для правильного представления false, но у меня никогда не было этой проблемы раньше, и, честно говоря, не знаю, с чего начать делать это в VB6в любом случае.

Любые идеи были бы великолепны!

Обновление: ведение журнала показало, что при возникновении этой проблемы вызов, вызывающий событие, возвращает управление коду VB6, прежде чем сработает обработчик события c #.Что с этим случилось?

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

1 Ответ

3 голосов
/ 24 января 2012

Извините, что проблема не была такой простой, как побитовая логика в мире VB6.

Если проблема сводится к маршалингу, возможно ли, что библиотека взаимодействия, создаваемая .NET, каким-то образом не синхронизированас соответствующей DLL VB6?(Кроме того, вы знакомы с настройками двоичной совместимости в VB6?)

Для хихиканья я сделал следующее - пожалуйста, дайте мне знать, если этот простой набор проектов является типичной моделью для кодирования илисортировочная проблема, которую вы отслеживаете.Если эта проблема имеет маршаллинг, может быть полезно проработать ее в упрощенных версиях проектов c # и vb6, чтобы отследить ее.

С VB6 я создал простую ActiveX DLL (проект с именем LibBoolBuster) скласс с именем BoolBuster:

Public Event WriteComplete(ByVal aCommsOk As Boolean, ByVal aBadPIN As Boolean)

Public Sub DoIt(ByVal Mode As Integer)
    RaiseEvent WriteComplete(CBool(Mode And 1), CBool(Mode And 2))   
End Sub

В VS2003 (старый .NET, но все равно должен применяться) я создал простое приложение на C # для Windows, имеющее форму с четырьмя кнопками и ссылающееся на приведенную выше библиотеку ActiveX VB6.,Я сделал член в форме, которая обращается к VB6 DLL:

public LibBoolBuster.BoolBuster vb6Obj = new LibBoolBuster.BoolBuster();

DLL через Interop is LibBoolBuster;Класс BoolBuster имеет событие и член DoIt.В инициализации формы подключение события выполняется следующим образом:

vb6Obj.WriteComplete += new LibBoolBuster.__BoolBuster_WriteCompleteEventHandler(vb6Obj_WriteComplete);

Обработчик события WriteComplete является членом формы:

private void vb6Obj_WriteComplete ( System.Boolean aCommsOk  , System.Boolean aBadPIN )
{
    MessageBox.Show(aCommsOk.ToString() + ", " + aBadPIN.ToString());           
}

Каждый обработчик события нажатия кнопки делает простойвызов DoIt:

vb6Obj.DoIt(0);

(и vb6Obj.DoIt (1), vb6Obj.DoIt (2) и т. д.)

Очень простой проект: нажмите кнопку, вызывается DoIt,Событие WriteComplete происходит.Я попробовал, и все заработало, как и ожидалось.


Внимательно посмотрите на сторону VB6.Вы указали, что событие инициировано с помощью:

RaiseEvent WriteComplete(aCommsReceived, Not (aIsAcknowledged))

Убедитесь, что aIsAcknowledged имеет значение либо 0, либо -1;в противном случае вы не получите ожидаемого результата.

VB6 Булевы операторы все побитовые;то есть (не 1) приводит к -2, а не к нулю.

Кроме того, в VB6 любое ненулевое целое число будет отображаться в True при преобразовании из целого в логическое значение - только ноль становится ложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...