【发布时间】: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 的确切位置?我的代码有什么错误以及如何解决?
【问题讨论】: