Неожиданное поведение поля со списком поставщика учетных данных версии 2

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

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

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

Сценарий:

1) Ноутбук подключен к моему монитору / источнику питания и т. Д.

2) Я засыпаю.

3) Отключаю все кабели (в том числе силовые).

4) Просыпаюсь ото сна.

Затем в поле со списком не отображается элемент, выбранный по умолчанию, он пуст. Когда я его раскрываю, отображаются все необходимые элементы. После того, как credprov вылетает и перезагружается, все в порядке.

Я знаю, что в подобных «странных» сценариях в большинстве случаев проблема возникает из-за утечки памяти или чего-то еще. Когда я проверяю средство просмотра событий, он показывает мне c0000005, что является нарушением доступа. Я начал отлаживать, где нарушение. Затем я обнаружил, что программа ссылается на массив списка элементов combobox (на самом деле вектор в моем случае) с очень высоким индексом (причина нарушения может быть вне диапазона). Фактический индекс, очевидно, хранится в переменной «selectedComboItemIndex» (DWORD).

Мне было любопытно, когда он изменился на это странное число, чем я обнаружил неожиданное поведение. Метод SetComboBoxSelectedValue случайным образом вызывается один раз (при возникновении ошибки) с безумно высоким значением индекса. Я даже не вызываю этот метод в своем коде, поэтому понятия не имею, почему он вызывается. Вызов происходит даже тогда, когда я не выпадаю из поля со списком.

Я даю ему шанс, что это может быть ошибка в самом credprov. Что вы думаете? Вы видели эту проблему раньше?

Заранее спасибо!


person Pethő Jonatán    schedule 09.12.2018    source источник
comment
Ваш провайдер загружается / выгружается во время сна / пробуждения?   -  person Alexander    schedule 10.12.2018
comment
Нет, это не что иное, как официальная реализация поставщика учетных данных V2 от Microsoft. Итак, LogonUI загружает его и выгружает. После того, как я написал вопрос, я заметил, что проблема не только в этой ошибке. Метод SetSelected вызывается дважды каждый раз без вызова метода SetDeselected. Опять же, я ничего не трогал в пользовательском интерфейсе. Это происходит каждый раз, а не только тогда, когда возникает описанная ошибка.   -  person Pethő Jonatán    schedule 11.12.2018
comment
Ваш провайдер запросил выбор элемента поля со списком? В любом случае вы должны предполагать, что по умолчанию выбран первый элемент с индексом 0.   -  person Alexander    schedule 11.12.2018
comment
Нет. Мой провайдер не звонит изнутри. Он вызывается только LogonUI.   -  person Pethő Jonatán    schedule 11.12.2018
comment
Вызвал ли ваш провайдер через LogonUI для некоторых методов Combo Box после возобновления / пробуждения?   -  person Alexander    schedule 11.12.2018
comment
Нет. Его можно вызвать только после того, как он был отображен на экране. (Метод SetSelected).   -  person Pethő Jonatán    schedule 11.12.2018
comment
Какие методы вашего поставщика учетных данных были успешно вызваны после пробуждения и до сбоя? Внутри какого метода у вашего провайдера бывают сбои?   -  person Alexander    schedule 12.12.2018
comment
Мне кажется, что я частично решил проблему. Я создал фильтр внутри метода SetSelected. Я объявил выбранный bool вне метода и выполняю содержимое SetSelected только тогда, когда выбранный bool имеет значение false. Я установил для него значение false при вызове метода SetDeselected и после первого вызова SetSelected. Поскольку я получил это в коде, ошибка strage не появлялась. Я провожу дополнительную отладку, и посмотрим.   -  person Pethő Jonatán    schedule 13.12.2018
comment
И, чтобы ответить на ваш вопрос, все необходимые методы успешно работали до сбоя. Включая конструктор, Initialize, SetSelected и методы, которые я вызываю из любой из трех функций.   -  person Pethő Jonatán    schedule 13.12.2018
comment
Приятно читать хорошие новости!   -  person Alexander    schedule 13.12.2018
comment
Прямо сейчас внутренний код SetSelected не запускался, несмотря на то, что он не вызывался раньше. Может что-то нарушает память и переписал bool.   -  person Pethő Jonatán    schedule 13.12.2018


Ответы (1)


Я решил проблему, перестал использовать методы «SetSelected» и «SetDeselected». Кроме того, я отфильтровал входные параметры SetComboBoxSelectedValue, чтобы принимать только действительные числа. Когда параметр индекса недействителен, я вспоминаю тот же метод с заменой параметра индекса на первый элемент (0).

person Pethő Jonatán    schedule 01.01.2019