【发布时间】:2017-05-08 06:36:00
【问题描述】:
我在 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
【问题讨论】:
-
这对于 utf-16 编码的字符串是正常的,因为 BSTR 应该是。似乎您没有在 VBA 代码中正确声明该函数。当心这个错误,
_bstr_t包装器在函数返回之前调用 SysFreeString()。完全摆脱它,SysAllocString就足够了。 -
感谢您指出错误。我刚刚写了如何从 VBA 调用该函数,但即使您对
_bstr_t进行了更正,它也会返回包含Chr(0)s 的相同字符串。 -
我不知道 VBA 需要什么样的咒语来确保它期望 BSTR 函数返回,我只看到参数类型的文档。声明函数
Unicode可能会有所帮助,但是通过调用它来测试它无数次,这样你就知道没有内存泄漏。 -
基本上还有其他方法可以将
CString导出到VBA 吗?这是我发现的唯一可行的...