我的 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/