首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# WinScard.SCardListReaders只应列出已连接的读取器(但它列出了所有已安装的读取器名称,这些名称现在没有连接)

C# WinScard.SCardListReaders只应列出已连接的读取器(但它列出了所有已安装的读取器名称,这些名称现在没有连接)
EN

Stack Overflow用户
提问于 2018-10-23 19:57:46
回答 2查看 4.7K关注 0票数 3

请阅读我下面的C#代码。我正在尝试获取智能卡读取器的列表,这些读卡器现在已连接到我的计算机上。但是这个函数返回过去连接过的所有智能卡读取器名称(我的意思是现在没有连接)。我只想要活动(目前)连接的读取器名称列表。我不明白问题在哪里。

我尝试了这个用C语言编写和编译的网站的exe,它只显示了连接的读取器。我比较了代码,但没有发现区别。请帮忙找个办法。

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-23 20:33:32

在没有智能卡阅读器的情况下,很难回答这个问题,尽管我在3个月前开发了这些代码。

我以前的代码基于以下内容:https://github.com/nicbedford/CardBrowser/blob/master/PCSC/PCSCReader.cs

它不能完美地工作,你必须自己去发现错误。但这确实有帮助。

在不同的windows平台上有不同的解决方案。

  1. 窗口8.1+:

https://code.msdn.microsoft.com/windowsapps/Smart-card-sample-c7d342e0#content

  1. 窗口10:

https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/SmartCard

https://learn.microsoft.com/en-us/uwp/api/windows.devices.smartcards

  1. Windows 7+:

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只需从左上角搜索该函数。

票数 1
EN

Stack Overflow用户

发布于 2018-10-24 12:00:56

我浏览了这个链接,在这个页面中,有一个提示和技巧提到,“如果您调用SCardListReaders并将hContext参数设置为null,您将得到已安装读取器的列表(而不是插入的读取器!)”。根据这一点,在我的代码中,我将hContext变量作为int,将其更改为IntPtr,使我只列出已连接的读取器。它已经解决了,现在我的代码被更改为

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52956938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档