2017-07-28 63 views
0

我有奇怪的問題,從VARIANT結構閱讀BSTR值。無法獲得BSTR數據的確切位置在VARIANT結構

我用下面的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值的位置:到behide的BSTR數據8個字節的位置

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點,這樣反而得到「zhttShow」串,我只得到「顯示」。如果我減去wide 4我會得到所需的數據。

貝婁是調試屏幕第二C++代碼:

enter image description here

問:

爲什麼wide沒有指向BSTR的確切位置?我的代碼中有什麼錯誤,以及如何解決它?

回答

1

A BSTR不是wchar_t*。它可能看起來相似,但不是。而更重要的是,wchar_t*絕對不是BSTR。 BSTR具有結構,頭部位於前面的指向值,所以真正的BSTR在之前的地址開始幾個字節。見BSTR Data Type

甲BSTR是由一個長度前綴,數據串,和終止子的複合數據類型。

這就是爲什麼你應該總是使用合適的BSTR特定的API。最好,使用_bstr_t之類的編譯器支持。要正確提取VARIANT的BSTR,我會使用_variant_t Extractor。讓編譯器處理細節。