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

| 我的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进行这种隐式转换似乎有些奇怪,但这就是事实。 (就目前我所记得的。)     
如果坚持使用功能签名,则必须为VB6准备一个自定义的typelib,其中包括
[dllname(\"Z-FileIO.dll\")]
module ZFileIO
{
    [entry(\"FileGetParentFolder\")]
    BSTR FileGetParentFolder ([in] LPWSTR path);
};
在ѭ8的参数类型中,ѭ9auto自动转换为ANSI字符串,即
LPSTR
。传递/接收unicode字符串(
LPWSTR
BSTR
)的唯一方法是使用typelib API函数声明。 除此之外,您始终可以在声明中使用
As Long
参数,并期望
LPWSTR
,但是在每次调用API函数时,使用者都必须将字符串包装在
StrPtr
中。     

要回复问题请先登录注册