2013-02-06 110 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