String 如何使用VB6从C DLL文件中检索char*参数

String 如何使用VB6从C DLL文件中检索char*参数,string,api,dll,vb6,function-call,String,Api,Dll,Vb6,Function Call,在我的项目中,我必须解码芯片,解码首先是用C++编译器和DLL文件完成的。幸运的是,用C++完成了译码验证工作。 导入的C dll函数如下所示: short int Byte_read(BOOL Mode,int cm, char* tet, char* stat, char* adr, char* nbr, char* data); Const DATA_ARRAY = 129 Private Sub Command2_Click() Dim x As Long Dim CData

在我的项目中,我必须解码芯片,解码首先是用C++编译器和DLL文件完成的。幸运的是,用C++完成了译码验证工作。 导入的C dll函数如下所示:

short int  Byte_read(BOOL Mode,int cm, char* tet, char* stat, char* adr, char* nbr, char* data);
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)
但不幸的是,我用VB6和同一个DLL文件进行的测试解码不起作用。我已经做了几次测试,但还是看不懂芯片。我需要能够用VB6解码,但无法理解故障在哪里,或者我是否缺少有关如何实现这一点的任何说明

非功能性VB6代码如下所示:

short int  Byte_read(BOOL Mode,int cm, char* tet, char* stat, char* adr, char* nbr, char* data);
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)
请与我核对代码是否正确
感谢您的帮助,render me service对我很重要。

字节读取的一些参数是字符数组而不是字符串

有一个解释如何访问字符串参数的

作为备选方案:

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

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

您的
声明似乎正常。问题在于实际的参数声明。这些字节数组被转换为
字符串
,并且
被传递给
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函数参考中记录


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

您是否绝对肯定没有硬件问题?是,没有硬件问题,因为我已经用C验证了解码,并且看到闪烁的LED。错误:类型不匹配:数组类型或由用户Expected定义。我尝试对“head、number和address”执行与CData和bueffer相同的操作,但仍然没有正面结果。