荣士电子 >> FAQ >> 关于VB调用VC编写的包指针参数的动态库函数的提醒
关于VB调用VC编写的包指针参数的动态库函数的提醒
荣士电子 2009-3-13 12:06:59

VB 在调用VC编写的动态库时常常会出现“调用约定错误”,原因VC和VB在机制上的不同。我们在声明和定义方面下点功夫,仍然可以搞定。

例如读卡动态库函数的VC声明如下:
unsigned char __stdcall piccreadex(unsigned char ctrlword,unsigned char *serial,unsigned char area,unsigned char keyA1B0,unsigned char *picckey,unsigned char *piccdata0_2)

相应的VB声明如下:
Private Declaer Function piccreadex Lib "OUR_MIFARE.dll"(ByVal ctrlword As Byte, ByVal serial As Long, ByVal area As Byte, ByVal keyA1B0 As Byte, ByVal picckey As Long, ByVal piccdata0_2 As Long) As Byte

初步一看,可能发现为什么VB声明VC的指针不是用byref,而是用一个long来表示地址。实际上在VB6上也就这样才能搞定(微软似乎在vb.net做了改进,用byref就行了,合理了很多)。

以下是使用中的代码:


Private Sub Command1_Click()
'轻松读卡
'技术支持:
'网站:

Dim status As Byte '存放返回值

Dim myareano As Byte '区号
Dim authmode As Byte '密码类型,用A密码或B密码
Dim myctrlword As Byte '控制字
Dim mypicckey(0 To 5) As Byte '密码
Dim mypiccserial(0 To 3) As Byte '卡序列号
Dim mypiccdata(0 To 47) As Byte '卡数据缓冲

控制字指定,控制字的含义请查看本公司网站提供的动态库说明
myctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY

'指定区号
myareano = 8 '指定为第8区
'批定密码模式
authmode = 1 '大于0表示用A密码认证,推荐用A密码认证

'指定密码
mypicckey(0) = &HFF
mypicckey(1) = &HFF
mypicckey(2) = &HFF
mypicckey(3) = &HFF
mypicckey(4) = &HFF
mypicckey(5) = &HFF

status = piccreadex(myctrlword, VarPtr(mypiccserial(0)), myareano, authmode, VarPtr(mypicckey(0)), VarPtr(mypiccdata(0)))
'在下面设定断点,然后查看mypiccserial、mypiccdata,
'调用完 piccreadex函数可读出卡序列号到 mypiccserial,读出卡数据到mypiccdata,
'开发人员根据自己的需要处理mypiccserial、mypiccdata 中的数据了。
'处理返回函数

Select Case status

    Case 0:
   
        MsgBox "操作成功"
       
    Case 8:
   
        MsgBox "请将卡放在感应区"
       
    Case 21 '没有动态库
        MsgBox "找不到动态库ICUSB.DLL请将ICUSB.DLL拷贝到VB安装后的目录VB98下"
   
    Case Else
        MsgBox "异常"

End Select


请注意,传入指针请用VarPtr。

 

最新经典工程案例