【发布时间】:2019-05-10 19:31:25
【问题描述】:
近一年来,我一直在为我们公司的 Windows 10 凭据提供程序开发。
现在,我遇到了一个问题。我通常不会在论坛、博客上提问,因为大多数情况下我会找到解决方案,但这次我已经为一个问题苦苦挣扎了一个月,我找到了问题的根源。
问题本身的简要描述:凭据提供程序使用组合框,该组合框以前可以正常工作。现在,我重写了整个代码来管理一个大更新,但是一个奇怪的错误进入了系统。该错误仅在特定情况下发生。我正在我的个人笔记本电脑上开发和测试代码。
场景:
1) 笔记本电脑已插入我的显示器/电源等。
2) 我让它去睡觉。
3) 我拔掉所有电缆(包括电源)。
4) 我从睡眠中唤醒它。
然后,组合框不显示默认选择的项目,它是空的。当我放下它时,它会显示所有必要的项目。与 credprov 崩溃并重新启动相比,一切都很好。
我知道,在类似的“奇怪”场景中,在大多数情况下,内存泄漏或相关问题会导致问题。当我检查事件查看器时,它显示 c0000005,这是访问冲突。我开始调试违规的地方。然后我发现程序以非常高的索引引用组合框项目列表数组(在我的情况下实际上是向量)(超出范围可能是违规的原因)。实际的索引显然存储在“selectedComboItemIndex”变量(DWORD)中。
我很好奇它什么时候变成了这个奇怪的数字,然后我发现了一个意想不到的行为。 SetComboBoxSelectedValue 方法随机调用一次(当错误发生时),索引值非常高。我什至没有在我的代码中调用这个方法,所以我不知道为什么会调用它。即使我不下拉组合框,也会发生调用。
我给它一个机会,它可能是 credprov 本身的一个错误。你怎么看?你以前见过这个问题吗?
提前谢谢你!
【问题讨论】:
-
您的提供程序是否在睡眠/唤醒操作期间加载/卸载?
-
不,它什么也不做,而是微软官方实现的 V2 凭据提供程序。所以 LogonUI 加载它并卸载它。在我写了这个问题之后,我注意到不仅这个错误是问题所在。每次调用“SetSelected”方法两次,而不调用“SetDeselected”方法。同样,我没有在用户界面上触摸任何东西。它每次都会发生,而不仅仅是在描述的错误发生时。
-
您的提供商是否要求选择组合框项目?在任何情况下,您都必须假设默认选择索引为 0 的第一项。
-
没有。我的提供者不会从内部调用它。它仅由 LogonUI 调用。
-
在我看来,我部分解决了这个问题。我在 SetSelected 方法中创建了一个“过滤器”。我在方法外部声明了一个“selected”布尔值,并且只在“selected”布尔值为 false 时执行 SetSelected 内容。我在调用“SetDeselected”方法时和第一次调用“SetSelected”后将其设置为 false。由于我在代码中得到了这个,所以没有出现这个错误。我运行更多调试,我们会看到。
标签: authentication combobox windows-10 winlogon credential-providers