2013-02-06 111 views
1

我想在C#中使用interop在SCardGetCardTypeProviderName。其中一个参数是一个参考,是应该根据所传入的卡上下文智能卡返回供应商的名称这是我使用的代码: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

在后两种情况下,而不是一个空字符串,我得到的奇怪的字符串人物,再次,让我觉得这是一个编组/翻译问题。

回答

3

声明字符串参数作为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 
); 

无需重复字符集的默认值,而这些API函数不使用Win32的最后一个错误的机制。

+0

令人惊叹!谢谢! – Random