【问题标题】:How can I retrieve a char* parameter from a C DLL file, by using VB6如何使用 VB6 从 C DLL 文件中检索 char* 参数
【发布时间】:2013-08-31 12:16:09
【问题描述】:

在我的项目中,我必须对芯片进行解码,首先使用 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)

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

【问题讨论】:

  • 您确定没有硬件问题吗?
  • 是的,没有硬件问题,因为我已经用 C 验证了解码并且看到 LED 闪烁。

标签: string api dll vb6 function-call


【解决方案1】:

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

有一个related answer 解释了如何访问字符串参数。

尝试替代方案:

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

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

【讨论】:

  • 错误:类型不匹配:数组类型或由用户预期定义
【解决方案2】:

您的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 函数参考中记录。

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

【讨论】:

  • 我尝试做与 CData 相同的事情,并为“头部、数字和地址”缓冲,但仍然没有积极的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2011-07-17
  • 1970-01-01
  • 2018-03-17
  • 2011-05-01
相关资源
最近更新 更多