SCardGetCardTypeProviderName返回空结果
本文关键字:结果 返回 SCardGetCardTypeProviderName | 更新日期: 2023-09-27 17:57:56
我正在尝试使用C#中的interop来使用SCardGetCardTypeProviderName。其中一个参数是引用,它应该根据传入的卡上下文返回智能卡提供商的名称
IntPtr hSC = { value comes from call using SCardEstablishContext }
string cardName = { value comes from SCardUIDlgSelectCard }
int providerNameLength = 256;
string providerName = string.Empty; //doesn't matter how I initialize this
[DllImport("winscard.dll", CharSet = CharSet.Ansi, SetLastError = true)]
public static extern Int32 SCardGetCardTypeProviderName(IntPtr hContext, string szCardName, uint dwProviderId, ref string szProvider, ref int pcchProvider);
int lReturn = SCardGetCardTypeProviderName(hSC, cardName, SCARD_PROVIDER_CSP, ref providerName, ref providerNameLength);
但是providerName总是空的,而providerNameLength变为43,这让我觉得这是一个编组问题。但我已经尝试将providerName编组为:
- LPWStr
- LPTStr
- LPStr
在后两者的情况下,我得到的不是一个空字符串,而是一系列奇怪的字符,再次让我认为这是一个编组/翻译问题。
将字符串参数声明为StringBuilder:
[DllImport("winscard.dll"]
public static extern int SCardGetCardTypeProviderName(
IntPtr hContext,
string szCardName,
uint dwProviderId,
StringBuilder szProvider,
ref int pcchProvider
);
....
StringBuilder providerName = new StringBuilder(providerNameLength);
int lReturn = SCardGetCardTypeProviderName(
hSC,
cardName,
SCARD_PROVIDER_CSP,
providerName,
ref providerNameLength
);
无需重复CharSet的默认值,并且这些API函数不使用Win32最后一次错误机制。