c++ - 将 BSTR 从 C++ DLL 函数传递到 VB6 应用程序

标签 c++ vb6 bstr

我的 VB6 应用程序中有这段代码:

Private Declare Function FileGetParentFolder Lib "Z-FileIO.dll" _
(ByVal path As String) As String

Output.AddItem FileGetParentFolder(FileText.Text)

Output 是一个列表,FileText 是一个包含文件路径的文本字段。我的 C++ DLL 包含此函数:

extern "C" BSTR ZFILEIO_API FileGetParentFolder(Path p)
{
    try {
        return SysAllocString(boost::filesystem::path(p).parent_path().c_str());
    } catch (...) {
        return SysAllocString(L"");
    }
}

其中 Path 类型定义为 LPCSTR。该参数完美地进入了我的 DLL,但无论我尝试传回什么,VB6 应用程序都只显示垃圾。我用 SysAllocStringByteLength 尝试了几种不同的方法,将 SysAllocString 参数转换为 LPCWSTR 和其他变体。要么,我只看到字符串的第一个字母,要么只看到带点的 Y,而不是真正的字符串。有谁知道创建有效 BSTR 并将其从 C++ 传递到 VB6 的真正方法是什么?

最佳答案

希望这会为您指明正确的方向。从内存中...

VB6 在内部使用 COM BSTR(2 字节宽的字符串),但在与外部 DLL 通信时,它使用单字节或多字节字符串。 (可能是 UTF-8,但我记不太清了。)您的 LPCSTR 路径类型定义是一个 ANSI 字符串,这就是您可以正确接收它的原因。您生成的返回值是一个宽字符字符串,但 VB 需要一个 ANSI 字符串。在返回之前,您需要使用 WideCharToMultiByte 转换返回值。

VB 进行这种隐式转换似乎有点奇怪,但事实就是如此。 (据我所知。)

关于c++ - 将 BSTR 从 C++ DLL 函数传递到 VB6 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6134666/

相关文章:

c++ - 为什么这个 C++ STL 代码编译失败

c++ - 逻辑/算术移位越少位越快吗?

vb6 - 程序执行是否需要 .OCA 文件?

c# - 在 C# 中使用 VB6 类

vb.net - VB6 类型的等效项

com - VBScript "Type Mismatch"问题与 "[in, out] BSTR * "参数

C++ STL 映射 : issues with BSTR

c++ - Node 原生插件 : Convert string argument to UTF-8 in worker thread

c++ - 如何在多个函数中使用结构

c++ - _bstr_t 内存泄漏