RetVal = SCardEstablishContext(SCARD_SCOPE_SYSTEM, 0, 0, hCnTxt)
If RetVal Then RetErr
RetVal = SCardListReaderGroupsA(hCnTxt, bytReaderGroups(), lDataLen)
If RetVal Then RetErr
lDataLen = 0
RetVal = SCardListReadersA(hCnTxt, bytReaderGroups(), bytReaders(), lDataLen)
If RetVal Then RetErr

解决方案 »

  1.   

    gcj123(佛的光辉):你这样改类型都不匹配。______________________真的没有人会吗?
      

  2.   

    模块中的函数声明:
    Public RetVal As Long
    Public hCnTxt As Long
    Public Const SCARD_SCOPE_SYSTEM As Long = 2Declare Function SCardEstablishContext Lib "winscard.dll" (ByVal dwScope As Long, ByVal pvReserved1 As Long, ByVal pvReserved2 As Long, hContext As Long) As LongDeclare Function SCardReleaseContext Lib "winscard.dll" (ByVal hContext As Long) As LongDeclare Function SCardListReaderGroupsA Lib "winscard.dll" (ByVal hContext As Long,  mszGroups As string, pcchGroups As Long) As LongDeclare Function SCardListReadersA Lib "winscard.dll" (ByVal hContext As Long,  szGroups As String, mszReaders As String, pcchReaders As Long) As Long窗体中的调用:
    Dim bytReaders As string *1023
    Dim bytReaderGroups As string *1023RetVal = SCardEstablishContext(SCARD_SCOPE_SYSTEM, 0, 0, hCnTxt)
    If RetVal Then RetErr
    RetVal = SCardListReaderGroupsA(hCnTxt, bytReaderGroups, 1023)
    If RetVal Then RetErr
    lDataLen = 0
    RetVal = SCardListReadersA(hCnTxt, bytReaderGroups, bytReaders, 1023)
    If RetVal Then RetErr不好意思,仔细看了一下,察看了一下MSDN发现,你的函数声明好像都不对照我上面的改,试一下。
      

  3.   

    遗憾,还是不行。
    换一个问法。函数如下,如何在VB中声明和调用:
    typedef ULONG SCARDCONTEXT;
    typedef SCARDCONTEXT *PSCARDCONTEXT, *LPSCARDCONTEXT;
    #define SCARD_SCOPE_SYSTEM    2SCardEstablishContext(
        IN  DWORD dwScope,
        IN  LPCVOID pvReserved1,
        IN  LPCVOID pvReserved2,
        OUT LPSCARDCONTEXT phContext);SCardListReadersA(
        IN      SCARDCONTEXT hContext,
        IN      LPCSTR mszGroups,
        OUT     LPSTR mszReaders,
        IN OUT  LPDWORD pcchReaders);
      

  4.   

    另,我写了一个dll调用winscard.dll:
    long __stdcall Get_Readers(UL *hCntxt, char *pReaders, UL *RecvLen)
    {
    long Ret;
    SCARDCONTEXT hContext;
    DWORD cchReaders; Ret=SCardEstablishContext(
    SCARD_SCOPE_SYSTEM,
    NULL,
    NULL,
    &hContext);
    if (Ret!=0) return Ret; Ret=SCardListReadersA(
    hContext,
    0,
    pReaders,
    &cchReaders);
    if (Ret!=0) return Ret; *hCntxt = hContext;
    *RecvLen = cchReaders;
    return 0;};
    然后在VB中如此声明和调用,可以返回正确的字符串:
    Declare Function Get_Readers Lib "bm32.dll" (ByRef hContext As Long, ByVal ReadersName As String, ByRef RecvLen As Long) As LongDim Readers As String * 1024
    RetVal = Get_Readers(hCnTxt, Readers, RecvLen)
    而且,我试过将ReadersName声明为Byte,以Byte调用,一样可以返回正确的串。那么,我原来直接从VB调用winscard.dll错在哪里呢?
      

  5.   

    更正:
    而且,我试过将ReadersName声明为Byte,以Byte数组调用,一样可以返回正确的串。