无法从引用的 C++ dll 获取 VB6 dll 中的 BSTR
Cannot get a BSTR in VB6 dll from a referenced C++ dll
让我先说 VB 不是我的强项。
我正在开发要在 VB6 应用程序的 dll 中使用的 C++ dll。
我已经在 VB 中成功实例化了 (C++) classes。我正在尝试使用以下语法访问 class 的数据成员:“vbCppObj.dataMemberName
”。
我可以确认这适用于布尔和枚举类型,并且它会调用我的 class.
中定义的 getter 方法
我还必须从 (C++) class 访问字符串。
字符串的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 中的字符串类型。当此行执行时,“ErrorString
”对象显示“<Out of memory>
”(当我将鼠标悬停在它上面时)。如果我更进一步,到日志代码,它会给我一个 "Error 14: Out of string space".
此外,我在浏览器中输入了这段代码,所以它可能不是 100% 正确。
为什么不使用 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;
}
}
事实证明,我必须将字符串转换为“_b_str”,然后再转换为 "BSTR"。那对我有用。
之前试过了,不知道为什么当时不行。
让我先说 VB 不是我的强项。
我正在开发要在 VB6 应用程序的 dll 中使用的 C++ dll。
我已经在 VB 中成功实例化了 (C++) classes。我正在尝试使用以下语法访问 class 的数据成员:“vbCppObj.dataMemberName
”。
我可以确认这适用于布尔和枚举类型,并且它会调用我的 class.
中定义的 getter 方法我还必须从 (C++) class 访问字符串。 字符串的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 中的字符串类型。当此行执行时,“ErrorString
”对象显示“<Out of memory>
”(当我将鼠标悬停在它上面时)。如果我更进一步,到日志代码,它会给我一个 "Error 14: Out of string space".
此外,我在浏览器中输入了这段代码,所以它可能不是 100% 正确。
为什么不使用 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;
}
}
事实证明,我必须将字符串转换为“_b_str”,然后再转换为 "BSTR"。那对我有用。
之前试过了,不知道为什么当时不行。