无法在 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 这样的编译器支持。让编译器处理细节。
我在从 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 这样的编译器支持。让编译器处理细节。