API is written in C++typedef unsigned short MFSTATUS; // known as a WORD - 16 bits for sureMIFAREAPI_API MFSTATUS MIFAREAPICC MF_ReadCardBlock( DWORD dwBlkAdr, DWORD dwRdrKey, DWORD dwKeyAB, DWORD dwRspBufSz, BYTE *pRspBuf );
这样对吗?
 Declare Function MF_ReadCard Lib "MifareAPI.dll" Alias "MF_ReadCardBlock" (ByVal BlkAdr As Long, ByVal RdrKey As Long, ByVal KeyAB As Long, ByVal BuffSize As Long, ByRef buffer As Byte()) As Short
谢谢

解决方案 »

  1.   

    正确的声明如下:
    Declare Function MF_ReadCard Lib "MifareAPI.dll" Alias "MF_ReadCardBlock" (ByVal BlkAdr As Long, ByVal RdrKey As Long, ByVal KeyAB As Long, ByVal BuffSize As Long, ByVal lpBuffer As Long) As Short
    调用时lpBuffer参数为varptr(bytArray(0))
      

  2.   

    所以我用的时候应该先
    定义 Dim bufferSize as long = 64
     然后 DIM buffer(64) AS BYTE
    DIM retVal as ShortretVal = MF_ReadCard(0,0,0,64,varptr(bytArray(0)) 对吗?
      

  3.   

    对,不过buffer应定义为63,因为VB数组的默认下标是0。
      

  4.   

    哦,我用的是VB.NET 还是这样用吗, 找不到VarPtr 这个function啊
      

  5.   

    网上找的:
    Public Function VarPtr(ByVal e As Object) As Integer
        Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned)
        Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32
        GC.Free()
        Return GC2
    End Function
      

  6.   

    也可以将声明改为byref Buffer as byte
      

  7.   

    .Net 里好像可以直接pass by reference了吧。所以就没有VarPtr这个东西了。
      

  8.   

    网上说还有这个可以调用
    Private Declare Function VarPtr Lib "msvbvm60.dll" Alias "VarPtr" (ByVal lpObject As Object) As Long
      

  9.   


    这个API无须声明,直接使用。