gpt4 book ai didi

c - 调用用 C 编写的 DDL 函数时,Excel VBA 脚本崩溃,该函数返回字符串 BSTR

转载 作者:太空宇宙 更新时间:2023-11-04 04:31:14 24 4
gpt4 key购买 nike

我正在使用 Code::Blocks 在 C 中编写一个 DLL,我打算在 Winbatch 脚本中使用它,但目前我正在使用 Excel VBA 对其进行测试。VBA 脚本运行 DLL getVersion() 函数时 Excel 崩溃。在网上找了几天,没有找到合适的解决办法。

C代码是这样的

#define MQTTPUB_VERSION "V3.1.1Test"
DLL_EXPORT BSTR __stdcall WINAPI getVersion(void)
{
return MQTTPUB_VERSION ;
}

VBA代码是这样的

Public Declare Function mqttPubMsg Lib "mqttPubMsg.dll" _
(ByVal MQTT_ADDRESS As String, ByVal MQTT_CLIENTID As String, ByVal MQTT_TOPIC As String, ByVal MQTT_PAYLOAD As String) As Long
Public Declare Function getVersion Lib "mqttPubMsg.dll" () As String
Sub Test_DDL_mqttPubMsg()
'
' to test mqttPubMsg.DLL used in Visual Basic (VBA)
'
Dim DLLVersion As String * 35
Dim WorkDir As String
DLLVersion = Space(35)
WorkDir = ThisWorkbook.Path
ChDir WorkDir

If Dir(WorkDir & "\mqttPubMsg.dll", vbDirectory) = vbNullString Then
MsgBox "DLL not found"
Else
On Error GoTo DLLError
DLLVersion = getVersion() 'Excel crashes on executing this statement
End If
MsgBox ("Version DDL: " & DLLVersion)
Exit Sub
DLLError:
MsgBox ("DDL error")
End Sub

调用 DLL 和 getVersion() 函数的 C 程序工作正常。

此运行时错误的可能原因以及解决方法。

提前致谢。

最佳答案

我最近没有进行 Windows 编程,也没有现成的开发环境来进行试验,但这里有一些想法。

这里最有可能的问题是 getVersion() 返回 BSTR,当返回类型声明为 字符串。现在,BSTR 应该在内存中以 4 字节长度的前缀开头,参见 https://msdn.microsoft.com/en-us/library/windows/desktop/ms221069%28v=vs.85%29.aspx . getVersion() 只是返回指向字符串第一个字符“V”的指针,当 VBA 试图将“V”之前的前 4 个字节解释为长度时,这是一场灾难。 ..

以下是我看到的一些可能的解决方案:

  • 使用 SysAllocString() 函数构造一个 BSTRgetVersion() 按照上述引用文章中的建议。
  • 通过引用将 DLLVersion 字符串传递给 getVersion() 并查看如果你能以某种方式将它填充到 getVersion() 中。请记住你在这里处理 Unicode。

出于好奇可以玩的其他一些东西:

  • 验证 DLL 函数实际上可以从 VBA 调用;让getVersion() 返回 void 并查看是否只是调用该函数崩溃 Excel。如果是,那么问题就更深了。
  • getVersion()返回一个整数,看看能不能取进去你的 VBA 代码。
  • getVersion()接受一个整数作为参数,传递给它一个从 VBA 中提取整数,并查看 C 代码是否可以得到正确的值。
  • 在你的 C 代码中有一个足够大的全局字符数组,把(Unicode!)版本字符串从数组中的偏移量 4 开始,以及用(我认为是小端)整数填充第一个 4 个字节表示不包括 NULL 的 Unicode 字符串的长度终结者。使getVersion()返回指向buf + 4的指针,其中 buf 是全局字符数组。

抱歉,我对此内存犹新,我无法提供更具体的建议,但希望这会有所帮助。

关于c - 调用用 C 编写的 DDL 函数时,Excel VBA 脚本崩溃,该函数返回字符串 BSTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36018442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com