【问题标题】:Cannot get a BSTR in VB6 dll from a referenced C++ dll无法从引用的 C++ dll 获取 VB6 dll 中的 BSTR
【发布时间】:2015-05-30 01:18:06
【问题描述】:

首先让我说 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% 正确的。

【问题讨论】:

标签: c++ dll vb6


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    为什么不使用 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;
            }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 2014-12-11
      • 2023-03-03
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      相关资源
      最近更新 更多