【问题标题】:How to pass a char parameter to a C DLL from a VB6 application?如何将 char 参数从 VB6 应用程序传递给 C DLL?
【发布时间】:2019-05-13 12:40:24
【问题描述】:

我正在尝试在我的 VB6 应用程序中调用 C 函数。问题是该函数将简单的char 作为参数。不是 char 数组指针 (char *) 而是常规的 char

它是这样声明的:

#define FM_API extern "C" int _stdcall
FM_API NVF_SetGroupFormat(char *aMarker, char aDecSeparator, int aDigits)

如果执行成功则返回-1,否则返回0。

一开始我做了我一直在做的事情——只是宣布它就是这样。

这是我的声明:

Declare Function SetGroupFormat Lib "C:\Libs\FM_API.dll" Alias "NVF_SetGroupFormat" (ByVal lMarker As String, ByVal lDecSeparator As String, ByVal lDigits As Integer) As Integer

但它总是返回 0(失败/错误)。

我认为我传递的参数有问题。我打电话给 dll 作者寻求建议,并告诉他我如何传递我的参数。这是对该函数的调用:

Dim lSt As Integer
lSt = SetGroupFormat("=;\n", ".", 0)

作者告诉我这个调用是正确的,但他告诉我我的声明“可能”是错误的,因为我将 lDecSeparator 声明为字符串,但它应该是字符。

主要问题是 char 在 VB6 中不存在。

如何从 VB6 代码声明 char 并将其传递给基于 c 的 Dll?

【问题讨论】:

  • 双引号是一个字符串。单引号是一个字符。
  • 在需要字符的地方尝试使用 Byte。
  • @stark 在 VB6 中,如果我尝试编写类似 lSt = SetGroupFormat("=;\n", '.', 0) 的内容,则会出现语法错误。 Char 在 VB6 中甚至不能声明。 VB.Net 有 Char 但没有 VB6。如果我没记错的话,VBA 通常没有 char 类型。
  • 注意,我从问题中删除了 C++ 标签。尽管 DLL 显然恰好是用 C++ 编写的,但这与问题无关,因为 VB6 本机 DLL 导入仅通过 C ABI 接口发生。
  • Char 与 VB6 Byte 是相同的二进制表示。所以Asc("A")as byteas any.

标签: c vb6


【解决方案1】:

在 VB6 中,您可以为此目的使用固定长度的字符串:

Declare Function SetGroupFormat Lib "C:\Libs\FM_API.dll" Alias "NVF_SetGroupFormat" ( _
    ByVal lMarker As String, _
    ByVal lDecSeparator As String * 1, _
    ByVal lDigits As Integer _
) As Integer

诚然,我用VB6已经有一段时间了,我的知识有点生疏;如果上面的语法不被支持,那么下面的方法肯定会起作用:

Type SingleChar
    Value As String * 1
End Type

Declare Function SetGroupFormat Lib "C:\Libs\FM_API.dll" Alias "NVF_SetGroupFormat" ( _
    ByVal lMarker As String, _
    ByVal lDecSeparator As SingleChar, _
    ByVal lDigits As Integer _
) As Integer

您也可以使用数据类型Byte 来表示单个8 位值,相当于外部API 中的char。如果调用失败,这是由于其他原因,与参数类型无关。

【讨论】:

  • 我尝试使用 Byte 并通过了 46(ascii 点)。这是将字节作为字符传递的正确方法吗?谈到用户定义的类型,VB 编译器不允许这样传递它们。
  • @MantasDaškevičius 是的,46 或等效的&H2E 应该代表一个点字符。
  • 好吧,我会假设这个库有一些东西,并且所有带有声明的东西都很好。函数执行,所以我猜我无能为力。谢谢您的帮助。 :)
猜你喜欢
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多