gpt4 book ai didi

c++ - 无法在 VARIANT 结构中获取 BSTR 数据的确切位置

转载 作者:行者123 更新时间:2023-11-28 05:03:27 26 4
gpt4 key购买 nike

我在从 VARIANT 结构读取 BSTR 值时遇到奇怪的问题。

我使用以下 Javascript 代码将数据发送到 C++ 代码:

external.CppCall("zhttShow", 1, "Y");

在我的 C++ 代码的 Invoke 函数中,我尝试访问该数据:

HRESULT STDMETHODCALLTYPE WebBrowser::Invoke(_In_  DISPID dispIdMember, _In_  REFIID  riid, _In_  LCID lcid, _In_  WORD wFlags, _In_  DISPPARAMS *pp, _Out_opt_ VARIANT *pVarResult, _Out_opt_ EXCEPINFO *pExcepInfo, _Out_opt_ UINT *puArgErr)
{
if (dispIdMember == 100)
{
unsigned int k = pp->cArgs;
if (k > 0)
{
VARIANT *vVariant = &pp->rgvarg[k - 1];
if ((vVariant->vt & VT_BSTR) == VT_BSTR && vVariant->pvarVal->bstrVal)
{
wchar_t *wide = (wchar_t*)(vVariant->pvarVal->bstrVal);
// other code
}
}
}
}

在上面的代码中,wide 指向未定义的位置。如果我得到 vVariant->pvarVal->bstrVal 的指针,它指向 BSTR 值附近的位置:

VARIANT *vVariant = &pp->rgvarg[k - 1];
if ((vVariant->vt & VT_BSTR) == VT_BSTR && vVariant->pvarVal->bstrVal)
{
wchar_t *wide = (wchar_t*)(&vVariant->pvarVal->bstrVal);
// other code
}

wide 指向 BSTR 数据后面的位置 8 个字节,所以取而代之的是 "zhttShow" 字符串,我只得到"Show"。如果我将 wide 减去 4,我将得到所需的数据。

下面是第二个 C++ 代码的调试屏幕:

enter image description here

问题:

为什么 wide 不指向 BSTR 的确切位置?我的代码中有什么错误以及如何修复它?

最佳答案

BSTR 不是 wchar_t*。它可能看起来很相似,但事实并非如此。更重要的是,wchar_t* 绝对不是 BSTR。 BSTR 具有结构,一个 header 位于指向值的前面,因此真正的 BSTR 从地址 前几个字节开始。参见 BSTR Data Type :

A BSTR is a composite data type that consists of a length prefix, a data string, and a terminator.

这就是为什么您应该始终使用适当的 BSTR 特定 API。最好,使用像 _bstr_t 这样的编译器支持.要从 VARIANT 中正确提取 BSTR,我会使用 _variant_t Extractor .让编译器处理细节。

关于c++ - 无法在 VARIANT 结构中获取 BSTR 数据的确切位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45365626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com