gpt4 book ai didi

c++ - 从 VBA 中的 (c++ BSTR) 字符串中删除 chr(0)

转载 作者:行者123 更新时间:2023-11-28 01:48:40 24 4
gpt4 key购买 nike

我在 DLL 中编写了一个 C++ 函数,它将字符串导出到 VBA 程序:

BSTR _stdcall myFunc()
{
CRegKey Key;
CString sValue;
BSTR Str;

LONG nA = Key.Open(HKEY_LOCAL_MACHINE, _T("[group path goes here]"), KEY_READ);
ULONG nValueLength = 0;
LONG nB = Key.QueryStringValue(_T("[key I want to read goes here]"), NULL, &nValueLength);

if (nValueLength > 0)
{
LONG nC = Key.QueryStringValue(_T("[key I want to read goes here]"), sValue.GetBufferSetLength(nValueLength - 1), &nValueLength);
}

Str = _bstr_t(sValue.AllocSysString(), false);

return Str;

现在 Str 类似于版本号:比方说“4.10.122”。
如果我从 VBA 调用该函数,我收到的是“4 . 1 0 . 1 2 2”,其中每个字符之间的“空格”是 NULL(在 VBA 中它们是 Chr(0 )).

我不喜欢必须在我的 VBA 代码中使用 Replace 函数的想法,那么有什么方法可以在我的 C++ 代码中包含该步骤吗?

编辑:在我用来在 VBA 中调用函数的代码下方:

Private Declare Function myFunc Lib "[Path of my DLL here]" () As String

Sub Return_string()

Dim a As String

a = myFunc()

End Sub

最佳答案

远非能够帮助您满足这一特定需求,而是对这个主题感到好奇,如果我想出一个解决方案,我会从这个答案开始 https://stackoverflow.com/a/43423527/781933

更新

根据上面提到的@SimonMourier 的详细回答和进一步的阅读,你应该考虑字符串内容编码。DLL 的上下文 - 需要考虑 VBA 编码,并且还取决于 VBA 函数声明(@HansPassant 声明)。

来自 this MSDN documentation :

  • 当 VBA 用户定义函数被声明为采用字符串参数时,Excel 会以特定于语言环境的方式将提供的字符串转换为字节字符串。
  • 如果您希望向您的函数传递 Unicode 字符串,您的 VBA 用户定义函数应该接受 Variant 而不是 String 参数。

所以如果你使用:

Private Declare Function myFunc Lib "[Path of my DLL here]" () As String

需要通过 StrConv 将 UNICODE 转换为 ANSI

Dim str As String

str = StrConv(myFunc(), vbFromUnicode)

否则你应该摆脱 StrConv 但使用 DLL 导出 BSTR 声明:

Private Declare Function myFunc Lib "[Path of my DLL here]" () As Variant

关于c++ - 从 VBA 中的 (c++ BSTR) 字符串中删除 chr(0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43841211/

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