0

在我的项目中,我必须对芯片进行解码,首先使用 C++ 编译器和 DLL 文件进行解码。幸运的是,使用 C++ 进行的解码验证已经完成并且可以正常工作。

导入的C dll函数如下:

short int  Byte_read(BOOL Mode,int cm, char* tet, char* stat, char* adr, char* nbr, char* data);

但不幸的是,我用 VB6 和相同的 DLL 文件进行的测试解码不起作用。我做了几次测试,仍然无法读取芯片。我需要能够使用 VB6 进行解码,但无法理解故障出在哪里,或者我是否缺少有关如何实现此目的的任何说明?

没有功能的VB6代码如下:

Const DATA_ARRAY = 129

Private Sub Command2_Click() 


Dim x As Long
Dim CData(DATA_ARRAY) As Byte 
Dim buffer(3) As Byte 

x= lire(True, 1, "2", buffer, "00", "09", CData)

请与我核对代码是否正确,谢谢您帮助我并为我提供服务对我很重要。

4

2 回答 2

0

你的declare似乎还可以。问题在于实际参数声明。这些字节数组被强制转换Strings 并被传递ByVal,因此返回的任何内容都会在调用后被丢弃。

对于输出字符串参数来获取任何数据,这些必须由调用者像这样分配

Dim CData       As String
Dim buffer      As String
...

CData = String$(DATA_ARRAY + 1, 0)
buffer = String$(3 + 1, 0)
retour_byte_read = Byte_read(True, 1, "2", buffer, "00", "09", CData)
CData = Left$(CData, InStr(CData, Chr$(0)) - 1)
buffer = Left$(buffer, InStr(buffer, Chr$(0)) - 1)

Debug.Print CData, buffer

请注意,调用者有责任为“最坏”情况分配足够的空间——这必须在 C 函数参考中记录。

另请注意,ByValVB6 声明中的字符串未传递ByVal——这是一种将字符串参数标记为char*类型 (ANSI) 的技巧。VB6 在调用函数之前进行 unicode -> ANSI 转换,在函数调用之后进行反向 ANSI -> unicode,因此您在输出字符串参数中会得到一个不错的“VB 字符串”。

于 2013-09-02T09:03:51.137 回答
0

的一些参数Byte_read是字符数组而不是字符串。

有一个相关的答案解释了如何访问字符串参数。

尝试作为替代方案:

Private Declare Function Byte_read Lib "RFID_VC_VB1.dll" ( _ 
ByVal Mode As Long, _ 
ByVal nCom As Long, _
ByRef head() As byte, _ 
ByRef status() As byte, _ 
ByRef adresse() As byte, _ 
ByRef number() As byte, _ 
ByRef Data() As byte) As Long

您必须将字符串映射到字节数组。利用最后一个字节为零的事实。

于 2013-08-31T15:22:39.823 回答