我有一个使用智能卡读卡器的应用。用户可能有几个相同的阅读器,SCardListReaders
返回的系统名称后缀不同,例如" OMNIKEY CardMan 5x21 0 "和" OMNIKEY CardMan 5x21 1 "。用户可以为应用设置阅读器。如果在工作期间用户将智能卡放入另一个阅读器,应用程序将不会做出反应。
问题是,我有报告说在Windows重启后,读者也可以洗牌。那个有" 0 "在之前的名称中现在可以拥有" 1 "。我对此没有任何影响。在洗牌发生后,用户必须在应用程序中再次选择阅读器,我想以某种方式解决这个问题,以便用户不必做任何事情。
首先我玩弄SCardGetAttrib
和SCARD_ATTR_VENDOR_IFD_SERIAL_NO
,但此参数不会为世界上的每个读者返回唯一字符串。例如,它可能会返回" 12345678"对于同一类型的所有读者。
我现在正在查看SetupAPI函数SetupDiGetDeviceRegistryProperty
。我可以列出所有USB设备,参数SPDRP_PHYSICAL_DEVICE_OBJECT_NAME
和SPDRP_LOCATION_PATHS
似乎是唯一的,我希望在系统中修复。如果读卡器不是USB设备,那么我就像现在一样依赖名称。问题是,我无法从读者名称中推断出我应该关注的USB设备。 SPDRP_
个参数都不会给我一个读者姓名,我需要提供给SCardConnect
的名称。
如何从读者姓名到相应HDEVINFO
我可以提供给SetupDiGetDeviceRegistryProperty
?或者,是否有另一种方法来区分相同类型的智能卡读卡器,即使在Windows重启后也是可靠的?