无法从引用的C ++ DLL中获取VB6 dll中的BSTR

时间:2015-03-26 05:03:44

标签: c++ dll vb6

首先我要说VB不是我的强项。

我正在开发一个用于VB6应用程序的DLL的C ++ DLL。

我已经成功地在VB中实例化了(C ++)类。我正在尝试使用以下语法访问类的数据成员:“vbCppObj.dataMemberName”。

我可以确认这适用于boolean和enum类型,它会调用我班级中定义的getter方法。

我也必须从(C ++)类访问一个字符串。 字符串的getter函数如下:

class MyCPPClass
{
private:
WCHAR* CPPErrorString = L"This is a string";

public:
HRESULT __stdcall get_CPPErrorString(BSTR* pVal)
{
BSTR str = ::SysAllocString(CPPErrorString);
if(str)
*pVal = str;
return S_OK;
}
};

我现在无法调试C ++ DLL。

我在VB6代码中访问此值,如下所示:

ErrorString = vbCppObj.CPPErrorString
Logger.log "[Log]:" & ErrorString

ErrorString”是VB中的String类型。执行此行时,“ErrorString”对象会显示“<Out of memory>”(当我将鼠标悬停在该对象上时)。如果我继续前进到日志代码,它会给我一个“错误14:超出字符串空间”。

另外,我在浏览器中输入了这段代码,因此可能不是100%正确。

2 个答案:

答案 0 :(得分:0)

事实证明,我必须将字符串转换为“_b_str”,然后转换为“BSTR”。这对我有用。

我之前尝试过,但我不知道为什么它当时没用。

答案 1 :(得分:-1)

为什么你不使用LPCTSTR? 我不是高级C / C ++程序员,但这应该可行

class MyCPPClass
{
    private:
        LPCTSTR CPPErrorString = "This is a string";

    public:
        HRESULT __stdcall get_CPPErrorString(LPCTSTR * pVal)
        {
            // copy the value
            *pVal = CPPErrorString;

            // return
            return S_OK;
        }
}