Microsoft KB Archive/256195

= How To Handle Data from a Post Form When Hosting WebBrowser Control =

Article ID: 256195

Article Last Modified on 5/11/2006

-

APPLIES TO


 * Microsoft Internet Explorer 4.0 128-Bit Edition
 * Microsoft Internet Explorer 4.01 Service Pack 2
 * Microsoft Internet Explorer 4.01 Service Pack 1
 * Microsoft Internet Explorer 4.01 Service Pack 2
 * Microsoft Internet Explorer 5.0
 * Microsoft Internet Explorer 5.01
 * Microsoft Internet Explorer 5.5

-



This article was previously published under Q256195



SUMMARY
When you want to retrieve data from a POST form in Active Server Pages (ASP) pages, you can use the Request.Form collection. However, when hosting a WebBrowser control, there is no direct method to retrieve the data. You must do some conversion in the application.

This article demonstrates how to retrieve data as a string from a POST in a Microsoft Visual Basic and Visual C++ WebBrowser control application.

This article assumes you have knowledge of hosting the WebBrowser control and sink events with it.



MORE INFORMATION
You could retrieve data sent on an html page at the BeforeNavigate2 event of the WebBrowser control before the data is sent to the Web server. When an html form uses the GET method, the data are simply retrieved from the URL argument. However, when an html form uses the POST method, the data are not associated with the URL, but you can access them via the PostData argument.

The URL argument contains a string in Visual Basic (or a variant pointer to a BSTR in Visual C++). So you could directly access GET data from the URL argument. On the other hand, the PostData argument contains a SafeArray Bytes (or a variant pointer to a SAFEARRAY in Visual C++). So some conversion is necessary to retrieve the data. The following code segments show how this is done.

In Visual Basic
Private Sub ctrlWB_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)

If pDisp Is ctrlWB.object Then Dim lCount As Long Dim lLen As Long Dim strPostData As String lLen = LenB(PostData) ' Use LenB to get the byte count If lLen > 0 Then   ' If it's a post form, lLen will be > 0 For lCount = 1 To lLen strPostData = strPostData & Chr(AscB(MidB(PostData, lCount, 1))) ' Use MidB to get 1 byte at a time Next MsgBox strPostData End If   End If

End Sub

In Visual 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; }
 * 1) include "Shlwapi.h"

