Smartcard 获得;名称“;SCardGetCardTypeProviderName()智能卡的

Smartcard 获得;名称“;SCardGetCardTypeProviderName()智能卡的,smartcard,winscard,Smartcard,Winscard,为了从CryptAcquireContext()获取加密上下文,我需要知道插槽中当前智能卡的提供商名称 根据文档,SCardGetCardTypeProviderName()将执行此操作,但param 2是卡名,我看不出如何以非交互方式确定该名称。我所看到的所有文档/示例要么为名称编码,要么依赖于显示UI的SCardUIDlgSelectCard() 类似地,阅读周围的SCardLocateCards(),虽然它需要一个智能卡名称列表(我从SCardListCards()中填充),但它似乎没有传

为了从
CryptAcquireContext()
获取加密上下文,我需要知道插槽中当前智能卡的提供商名称

根据文档,
SCardGetCardTypeProviderName()
将执行此操作,但param 2是卡名,我看不出如何以非交互方式确定该名称。我所看到的所有文档/示例要么为名称编码,要么依赖于显示UI的
SCardUIDlgSelectCard()

类似地,阅读周围的
SCardLocateCards()
,虽然它需要一个智能卡名称列表(我从
SCardListCards()
中填充),但它似乎没有传回任何标识插入的智能卡名称的内容


我怀疑我遗漏了一些明显的东西,但我看不到什么。

我遗漏了一些东西。
SCardLocateCards
作为结构的一部分返回智能卡的ATR,然后可以在
SCardListCards
中使用:

SCARD_READERSTATE smartcardState[MAXIMUM_SMARTCARD_READERS];

result = SCardLocateCards (context, cardsList, smartcardState, readerCount);
if (result == SCARD_S_SUCCESS) {
    int i;
    for (i = 0; i < readerCount; i++)
    {
        if (SCARD_STATE_ATRMATCH & smartcardState[i].dwEventState) {
            break;
        }
    }

    result = SCardListCards (NULL, smartcardState[i].rgbAtr, NULL, NULL, cardName, &count);
    if (result == SCARD_S_SUCCESS) {
        // Cardname for CryptAquireContext in cardName
    }
}
SCARD_读卡器状态智能卡状态[最大智能卡读卡器];
结果=SCardLocateCards(上下文、卡片列表、smartcardState、readerCount);
如果(结果==SCARD\U S\U SUCCESS){
int i;
对于(i=0;i
如果有人有更好的前进路线,请告诉我——从我所看到的情况来看,我认为这是唯一的办法