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
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
解决方案 »
- 谁能告诉我VB中Environ函数的详细用法以及包含的参数的作用?
- OptionButton如何实现像Label中的Autosize和wordwrap功能
- 有些棘手,求高手指点 :) 关于数据库压缩的问题...
- 请教:在vb里做登录窗口时,怎么到 数据库里核对用户名和密码?
- 插上移动盘时程序得到移动盘的盘符?
- 在excel中,从一个表格复制内容到另外一个,第一个表格的内容有所改变的时候,怎么样才能实现第二个表格也随着改变呢?希望能够得到高人的指点,急用!谢谢啦!
- winsock
- 各位高手请帮忙---如何打印MSChart的图象,并实现打印预览?
- 窗体为当前窗口时才运行的代码应放在什么事件里?急!
- 网络数据库连接问题。高手请进。
- 以下一段代码,总出错,请大家帮忙解决!谢谢!
- 为什么msvbvm60.dll老出错
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发现,你的函数声明好像都不对照我上面的改,试一下。
换一个问法。函数如下,如何在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);
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错在哪里呢?
而且,我试过将ReadersName声明为Byte,以Byte数组调用,一样可以返回正确的串。