#include "Shlwapi.h"
STDMETHODIMP CWebOCWindow::BeforeNavigate2(IDispatch *pDisp, VARIANT *URL, 
VARIANT *Flags, VARIANT *TargetFrameName, 
VARIANT *PostData, VARIANT *Headers, 
VARIANT_BOOL *Cancel) 
{
         if (PostData != NULL && PostData->vt == (VT_VARIANT|VT_BYREF) && PostData->pvarVal->vt != VT_EMPTY )
{

char *szTemp = NULL, *szPostData = NULL;
long plLbound, plUbound;

SAFEARRAY *parrTemp = PostData -> pvarVal->parray;
SafeArrayAccessData(parrTemp , (void HUGEP **) &szTemp);

SafeArrayGetLBound(parrTemp , 1, &plLbound);
SafeArrayGetUBound(parrTemp , 1, &plUbound);

szPostData = new char[plUbound - plLbound + 2];
         StrCpyN(szPostData, szTemp, plUbound - plLbound + 1);
szPostData[plUbound-plLbound] = '\0';
SafeArrayUnaccessData(parrTemp);

MessageBox(szPostData);

delete[] szPostData;
}
return S_OK;
}其实我是想把 WebBrowser 中 BeforeNavigate2 事件中的 PostData 解析出来,
找不到 Delphi 代码,但是找到了 VC++ 代码(这是 MSDN 上的代码)。哪位高手帮转一下?

解决方案 »

  1.   

    http://www.developpez.net/forums/showthread.php?t=157835
      

  2.   

    var
      index, lowVal, highVal, vType: integer;
      oleArray: PSafeArray;
      oleObj: oleVariant;
      tmp: string;
    begin
      if (not (VarIsType(PostData, VT_NULL)) and (VarIsType(PostData, VT_VARIANT) or
        VarIsType(PostData, VT_BYREF))) and
        (not VarIsType(PostData, VT_EMPTY)) then
      begin
        index := VarArrayDimCount(PostData);
        lowVal := VarArrayLowBound(PostData, index);
        highVal := VarArrayHighBound(PostData, index);
        oleArray := TVariantArg(PostData).pArray;    for index := lowVal to highVal do
        begin
          SafeArrayGetElement(oleArray, index, oleObj);
          tmp := tmp + VarToStr(oleObj);
        end;
        ShowMessage(tmp);
      end;
      

  3.   

    pbcao 的不错。使用方便简单明了。