在excelvba中实现外部Yoctopuce动态链接库

在excelvba中实现外部Yoctopuce动态链接库,vba,excel,Vba,Excel,我正在使用Windows 10(64位)和Excel 2016(32位),希望在VBA中实现对Yocto-4-20mA-Tx模块()的控制 根据文档,DLL是用C编写的,下面是三个基本函数 int yapiInitAPI(int connection_type, char *errmsg); int yapiUpdateDeviceList(int forceupdate, char *errmsg); int yapiHTTPRequest(char *device, char *reques

我正在使用Windows 10(64位)和Excel 2016(32位),希望在VBA中实现对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)行上

以下是一些问题:

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

  • 该文档还提到“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支持部门,他们都是好人,我知道,因为我在那里工作:-)