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

Can't get exact position of BSTR data in VARIANT struct

我在从 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"。如果我用 4 减去 wide,我将得到所需的数据。

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

问题:

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

BSTR 不是 wchar_t*。它可能看起来很相似,但事实并非如此。更重要的是,wchar_t* 绝对不是 BSTR。 BSTR 具有结构,一个 header 位于 pointed-to 值的 前面 ,因此真正的 BSTR 开始几个字节 before 地址。见 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. To extract the BSTR from VARIANT correctly I would use a _variant_t Extractor 这样的编译器支持。让编译器处理细节。