我的VB6应用中有以下代码:
Private Declare Function FileGetParentFolder Lib "Z-FileIO.dll" _
(ByVal path As String) As String
Output.AddItem FileGetParentFolder(FileText.Text)
输出是一个列表,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的Path typedef是一个ANSI字符串,这就是为什么您可以正确接收它的原因.您生成的返回值是一个宽字符字符串,但是VB需要一个ANSI字符串.在返回值之前,您需要使用WideCharToMultiByte来转换您的返回值.
VB进行这种隐式转换似乎有些奇怪,但是事实就是这样. (就目前我所记得的.)