【问题标题】:Implementing external Yoctopuce DLL in Excel VBA在 Excel VBA 中实现外部 Yoctopuce DLL
【发布时间】:2018-09-04 07:44:43
【问题描述】:

我使用的是 Windows 10(64 位)和 Excel 2016(32 位),想在 VBA 中实现对 Yocto-4-20mA-Tx 模块 (https://www.yoctopuce.com/EN/products/usb-actuators/yocto-4-20ma-tx) 的控制。

根据文档,DLL 是用 C 语言编写的,以下是三个基本功能。

int yapiInitAPI(int connection_type, char *errmsg);
int yapiUpdateDeviceList(int forceupdate, char *errmsg);
int yapiHTTPRequest(char *device, char *request, char *buffer, int buffsize, int *fullsize, char *errmsg);

我已阅读(但可能未完全理解)以下内容:

我尝试在 VBA 模块中实现第一个函数 (yapiInitAPI)。 DLL 位于应用程序文件夹中

Option Explicit
Private Declare Function yapiInitAPI Lib "yapi" (ByVal connection_type As Long, ByVal errmsg As String) As Long

Sub myInit()
Dim nReturn As Long
Dim sError As String

nReturn = yapiInitAPI(1, sError)

MsgBox sError
MsgBox nReturn

End Sub

运行这个结果

“运行时错误‘49’:错误的 DLL 调用约定”

在 yapiInitAPI(1, sError) 行上。

这里有一些问题:

  1. 所有 DLL 都可以在 VBA 中实现还是必须遵循标准?
  2. 我认为我实现为“ByVal errmsg As String”的“char *errmsg”是个问题,应该如何在 VBA 中将“char *”翻译成?
  3. 当我从 yoctopuce 下载 DLL 时,我得到了 32 位和 64 位的两个版本,我应该使用一个特定的版本吗?如果是这样,这取决于我的操作系统还是 Office 版本?
  4. 我将 DLL 放在我的应用程序文件夹中(即存储 .xlsm 的位置),如果我将它放在 Windows-System32 中(并从应用程序文件夹中删除它),则可以在 VBA 中使用“Lib 'yapi'”访问它抱怨找不到文件。这不应该是一样的吗?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    文档还提到“yapi.dll 中的每个入口点都是重复的。您会发现一个常规 C-decl 版本和一个 Visual Basic 6 兼容版本,前缀为 vb6_。”: -)

    您必须为调用者应用程序和 DLL 使用相同的 32/64 位架构。

    【讨论】:

    • 那么VBA会自动选择一个入口点兼容VB6的吗?我认为这也适用于 VBA?
    • 不,入口点不是自动选择的,你必须使用正确的。例如,如果您使用标准 C 调用约定的语言中的 DLL,则必须使用 yapiInitAPI,如果您使用 VB6 或 VBA 中的 DLL,则必须使用 vb6_yapiInitAPI。你在这里似乎有点过头了。您是否考虑过将 Yoctopuce 命令行库与 VBA shell 命令一起使用?如果您不必经常打电话,它会容易得多。无论如何,不​​要犹豫直接联系 Yoctopuce 支持,他们是好人,我知道因为我在那里工作:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2011-09-14
    相关资源
    最近更新 更多