코딩하는 나귀

C++ 코드로는 아래와 같이 읽어 올수 있다.

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;
}

C++에서는 (PostData != NULL && PostData->vt == (VT_VARIANT|VT_BYREF) && PostData->pvarVal->vt != VT_EMPTY )  이 조건이 참이면 POST이고 아니면 GET으로 구분할 수 있다.

델파이에서는 아래와 같다.

procedure TfrmMain.wbMainBeforeNavigate2(Sender: TObject;
   const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
   Headers: OleVariant; var Cancel: WordBool);
var
   i:integer;
   postStr:String;
   postAry:array of byte;
begin

if Length(PostData) > 0 then
begin
     postAry := PostData ;
     for i:=0 To Length(postAry) do
       postStr := postStr + chr(postAry[i]);
     ShowMessage(postStr);
end;

Length(PostData) 길이가 0보다 크다면 데이타가 POST로 넘어왔다고 보면 된다. 이것으로 델파이에서는
POST와 GET방식을 구분할 수 있다.

아래는 기타 PostData를 읽는 방법이다.

function VariantToString(AVar: OleVariant): string;
var
  i: integer;
  V: olevariant;
begin
  Result := '';
  if VarType(AVar) = (varVariant or varByRef) then
     V := Variant(TVarData(AVar).VPointer^)
  else V := AVar;
 
  if VarType(V) = (varByte or varArray) then
      try
        for i:=VarArrayLowBound(V,1) to VarArrayHighBound(V,1) do
           Result := Result + Chr(Byte(V[i]));
      except;
      end
    else Result := V;
end;
....
OnBeforeNavigate2
ShowMessage(VariantToString(PostData));


*참고
PostData 값을 넣는 방법

S:String
...
PostData := VarArrayCreate([1, Length(S) + 1], varByte);
System.Move(S[1], VarArrayLock(PostData)^, Length(S) + 1);
VarArrayUnlock(PostData);