gpt4 book ai didi

c# - 列出系统上的所有智能卡读卡器(Alcor Micro 读卡器问题)

转载 作者:行者123 更新时间:2023-11-30 12:11:12 26 4
gpt4 key购买 nike

我已经让这个软件在生产环境中运行多年,之前从未遇到过这个问题。我刚收到一台新笔记本电脑 (HP EliteBook 8470p),它内置了 Alcor Micro USB 智能卡读卡器

下面的代码将列出系统上的所有阅读器并且看起来工作正常。我们的某些系统会将 3 或 4 个读卡器插入一台计算机。它已经用十几个模型进行了测试,没有任何问题。

奇怪的是,Alcor 读卡器只有在插入智能卡时才会列出。如果我在设备管理器中查看它,它也不会显示在“智能卡读卡器”下,直到插入卡(除非我转到“查看”>“显示隐藏的设备”)。

有谁知道这是为什么,或者是否有办法确保它在我的软件中列出?

谢谢。

代码:

[DllImport("WINSCARD.DLL", EntryPoint = "SCardEstablishContext", CharSet = CharSet.Unicode, SetLastError = true)]
static internal extern uint EstablishContext(ScopeOption scope, IntPtr reserved1,
IntPtr reserved2, ref SmartcardContextSafeHandle context);

[DllImport("WINSCARD.DLL", EntryPoint = "SCardListReaders", CharSet = CharSet.Unicode, SetLastError = true)]
static internal extern uint ListReaders(SmartcardContextSafeHandle context, string groups,
string readers, ref int size);

private bool EstablishContext()
{
if ((this.HasContext))
{
return true;
}
this._lastErrorCode =
(SmartcardErrorCode)UnsafeNativeMethods.EstablishContext(ScopeOption.System,
IntPtr.Zero, IntPtr.Zero, ref this._context);
return (this._lastErrorCode == SmartcardErrorCode.None);
}

public ArrayList ListReaders()
{
ArrayList result = new ArrayList();

//Make sure a context has been established before
//retrieving the list of smartcard readers.
if (this.EstablishContext())
{
//Ask for the size of the buffer first.
int size = this.GetReaderListBufferSize();
//Allocate a string of the proper size in which
//to store the list of smartcard readers.
string readerList = new string('\0', size);
//Retrieve the list of smartcard readers.
this._lastErrorCode =
(SmartcardErrorCode)UnsafeNativeMethods.ListReaders(this._context,
null, readerList, ref size);

if ((this._lastErrorCode == SmartcardErrorCode.None))
{
//Extract each reader from the returned list.
//The readerList string will contain a multi-string of
//the reader names, i.e. they are seperated by 0x00
//characters.
string readerName = string.Empty;
for (int i = 0; i <= readerList.Length - 1; i++)
{
if ((readerList[i] == '\0'))
{
if ((readerName.Length > 0))
{
//We have a smartcard reader's name.
result.Add(readerName);
readerName = string.Empty;
}
}
else
{
//Append the found character.
readerName += new string(readerList[i], 1);
}
}
}
}
return result;
}

顺便说一句,这段代码是由其他人编写的,我猜(根据过多的评论)是在网上其他地方找到的。我对它有点熟悉,但从未深入其中。我已尝试对其进行一些调整,但根本无法列出该 Alcor 阅读器。

谢谢!

最佳答案

好吧,打开赏金后马上找到答案,感觉真的很蠢。我花了一段时间从软件的角度来看这个,然后放弃了一段时间 - 当我回来重新审视它时,我认为它可能适合悬赏。

我决定仔细查看我的 BIOS 选项,你猜怎么着?那里有一个选项,上面写着“打开智能卡读卡器电源:a) 插入卡时,b) 总是”。我将其更改为“始终”并且有效。哎呀

它不会让我删除我的问题,因为它现在有赏金,但这基本上就是我的答案。感谢您的评论/建议。

关于c# - 列出系统上的所有智能卡读卡器(Alcor Micro 读卡器问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15938725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com