【问题标题】:Can't get exact position of BSTR data in VARIANT struct无法在 VARIANT 结构中获取 BSTR 数据的确切位置
【发布时间】:2017-07-28 05:39:23
【问题描述】:

我从 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"字符串,我只获取“显示”。如果我将 wide 减去 4,我将得到所需的数据。

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

问题:

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

【问题讨论】:

    标签: c++ variant bstr


    【解决方案1】:

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

    BSTR 是一种复合数据类型,由长度前缀、数据字符串和终止符组成。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-19
      • 2021-08-20
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多