请阅读我下面的C#代码。我正在尝试获取智能卡读取器的列表,这些读卡器现在已连接到我的计算机上。但是这个函数返回过去连接过的所有智能卡读取器名称(我的意思是现在没有连接)。我只想要活动(目前)连接的读取器名称列表。我不明白问题在哪里。
我尝试了这个用C语言编写和编译的网站的exe,它只显示了连接的读取器。我比较了代码,但没有发现区别。请帮忙找个办法。
public static int GetPCSCReaders(out List<string> smartCardReaders, out string errMsg)
{
errMsg = string.Empty;
byte[] readersList = null;
smartCardReaders = new List<string>();
try
{
int hContext = 0;
int ret = SCardEstablishContext(WinSCard.SCARD_SCOPE_USER, 0, 0, ref hContext);
if (ret != 0)
{
errMsg = "WinSCard GetPCSCReader: EstablishContext Error: " + ret.ToString();
return ret;
}
int byteCnt = 0;
ret = WinSCard.SCardListReaders(hContext, null, null, ref byteCnt);
if (ret != SCARD_S_SUCCESS)
{
errMsg = "WinSCard GetPCSCReader: ListReaders Error: " + ret.ToString();
return ret;
}
readersList = new byte[byteCnt];
ret = WinSCard.SCardListReaders(hContext, null, readersList, ref byteCnt);
if (ret != SCARD_S_SUCCESS)
{
errMsg = "WinSCard GetPCSCReader: ListReaders Error: " + ret.ToString();
return ret;
}
int indx = 0;
string readerName = string.Empty;
int i = 0;
while (readersList[indx] != 0)
{
while (readersList[indx] != 0)
{
readerName = readerName + (char)readersList[indx++];
}
smartCardReaders.Add(readerName);
i++;
readerName = "";
indx++;
}
}
catch (Exception ex)
{
errMsg = ex.Message;
}
finally
{
readersList = null;
}
return 0;
}发布于 2018-10-23 20:33:32
在没有智能卡阅读器的情况下,很难回答这个问题,尽管我在3个月前开发了这些代码。
我以前的代码基于以下内容:https://github.com/nicbedford/CardBrowser/blob/master/PCSC/PCSCReader.cs
它不能完美地工作,你必须自己去发现错误。但这确实有帮助。
在不同的windows平台上有不同的解决方案。
https://code.msdn.microsoft.com/windowsapps/Smart-card-sample-c7d342e0#content
https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/SmartCard
https://learn.microsoft.com/en-us/uwp/api/windows.devices.smartcards
https://github.com/nicbedford/CardBrowser/tree/master/PCSC
https://github.com/orouit/SmartcardFramework
https://github.com/danm-de/pcsc-sharp/tree/master/src/PCSC
如果在将C++转换为C#时遇到问题,您可以在这里找到所有函数:https://www.pinvoke.net/default.aspx/winscard/SCardTransmit.html只需从左上角搜索该函数。
发布于 2018-10-24 12:00:56
我浏览了这个链接,在这个页面中,有一个提示和技巧提到,“如果您调用SCardListReaders并将hContext参数设置为null,您将得到已安装读取器的列表(而不是插入的读取器!)”。根据这一点,在我的代码中,我将hContext变量作为int,将其更改为IntPtr,使我只列出已连接的读取器。它已经解决了,现在我的代码被更改为
public static int GetPCSCReaders(out List<string> smartCardReaders, out string errMsg)
{
errMsg = string.Empty;
smartCardReaders = new List<string>();
IntPtr hContext;
try
{
int ret = SCardEstablishContext(SCARD_SCOPE_USER, IntPtr.Zero, IntPtr.Zero, out hContext);
if (ret != SCARD_S_SUCCESS)
{
errMsg = "WinSCard GetPCSCReader: EstablishContext Error: " + ret.ToString();
return ret;
}
byte[] readersList = null;
uint byteCnt = 0;
ret = SCardListReaders(hContext, null, null, ref byteCnt);
if (ret != SCARD_S_SUCCESS)
{
errMsg = "WinSCard GetPCSCReader: ListReaders Error: " + ret.ToString();
return ret;
}
readersList = new byte[byteCnt];
ret = SCardListReaders(hContext, null, readersList, ref byteCnt);
if (ret != SCARD_S_SUCCESS)
{
errMsg = "WinSCard GetPCSCReader: ListReaders Error: " + ret.ToString();
return ret;
}
int indx = 0;
string readerName = string.Empty;
int i = 0;
while (readersList[indx] != 0)
{
while (readersList[indx] != 0)
{
readerName = readerName + (char)readersList[indx++];
}
smartCardReaders.Add(readerName);
i++;
readerName = "";
indx++;
}
}
catch (Exception ex)
{
errMsg = ex.Message;
}
finally
{
}
return 0;
}https://stackoverflow.com/questions/52956938
复制相似问题