IWebBrowser2::Navigate2 post variant
От: OverCrash  
Дата: 10.06.04 18:40
Оценка:
Hi all
Собственно сабж.
каким таким непонятным вариантом засылается пост-дата

в мсдн написано что The post data specified by PostData is passed as a SAFEARRAY Data Type structure. The variant should be of type VT_ARRAY and point to a SAFEARRAY Data Type. The SAFEARRAY Data Type should be of element type VT_UI1, dimension one, and have an element count equal to the number of bytes of post data.

мож кусочком кода кто поделится ?
... << Rsdn@Home 1.1.4 beta 1 >>
Re: IWebBrowser2::Navigate2 post variant
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 10.06.04 22:23
Оценка:
Здравствуйте, OverCrash, Вы писали:

OC>Hi all

OC>Собственно сабж.
OC>каким таким непонятным вариантом засылается пост-дата

OC>в мсдн написано что The post data specified by PostData is passed as a SAFEARRAY Data Type structure. The variant should be of type VT_ARRAY and point to a SAFEARRAY Data Type. The SAFEARRAY Data Type should be of element type VT_UI1, dimension one, and have an element count equal to the number of bytes of post data.


OC>мож кусочком кода кто поделится ?


Могу привести для C++ Builder:
// *Method 1*
  TVariant vtEmpty;
  TVariant vtPostDataArray;
  char *str = "action=LogMeIn&username=MyName&password=MyPass";

  SAFEARRAY FAR *psa = NULL;
  SAFEARRAYBOUND sabound[48];
  sabound[0].cElements = strlen(str);
  sabound[0].lLbound = 0;
  psa = SafeArrayCreate(VT_UI1, 1, sabound);
  for(unsigned int n = 0; n < strlen(str); n++){
    SafeArrayPutElement(psa, (long*)0, (void*)str[n]);
  }
  
  vtEmpty.vt = VT_EMPTY;
  vtPostDataArray.vt = VT_ARRAY;
  vtPostDataArray.SetSAFEARRAY(psa);
// or vtPostDataArray=psa;

  TVariant vAddress = {"http://my.server/test/postresults.asp"};
  CppWebBrowser1->Navigate2(&vAddress, &vtEmpty, &vtEmpty, &vtPostDataArray, &vtEmpty);
  SafeArrayDestroy(psa);

// *Method 2*
  TVariant vtEmpty;
  char *str = "action=LogMeIn&username=MyName&password=MyPass";
  TSafeArrayDim1 dim(strlen(str));
  TSafeArrayUInt1 uint_array(dim);
  for(unsigned int n = 0; n < strlen(str); n++){
    uint_array[n]=str[n];
  }
 
  SAFEARRAY* sa = uint_array.Detach();
  SafeArrayCopy(sa, &uint_array);

  vtEmpty.vt = VT_EMPTY;
  TVariant vAddress = {"http://my.server/test/postresults.asp"};
  CppWebBrowser1->Navigate2(&vAddress, &vtEmpty, &vtEmpty, &sa, &vtEmpty);
  SafeArrayDestroy(sa);
Re[2]: IWebBrowser2::Navigate2 post variant
От: OverCrash  
Дата: 11.06.04 07:27
Оценка:
спасибо большое
... << Rsdn@Home 1.1.4 beta 1 >>
Re[3]: IWebBrowser2::Navigate2 post variant
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 11.06.04 07:33
Оценка:
Здравствуйте, OverCrash, Вы писали:

OC>спасибо большое


Да не за что Оно в на сайте Борланда валялось в коммьюнити. Долго так валялось, а тут вдруг вы спрашиваете

З.Ы. Гугль — рулит!
Re: IWebBrowser2::Navigate2 post variant
От: Аноним  
Дата: 09.11.07 18:27
Оценка:
Здравствуйте, OverCrash, Вы писали:

OC>Hi all

OC>Собственно сабж.
OC>каким таким непонятным вариантом засылается пост-дата

OC>в мсдн написано что The post data specified by PostData is passed as a SAFEARRAY Data Type structure. The variant should be of type VT_ARRAY and point to a SAFEARRAY Data Type. The SAFEARRAY Data Type should be of element type VT_UI1, dimension one, and have an element count equal to the number of bytes of post data.


OC>мож кусочком кода кто поделится ?

Ну вот как делается пост при перегрузке метода BeforeNavigate2 в CHTMLView

void CMyHTMLView::BeforeNavigate2(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT*, TargetFrameName, VARIANT* PostData, VARIANT* Headers, VARIANT_BOOL* Cancel)
{
USES_CONVERSION;
CString str = CString((*Headers).bstrVal);
if (str.Find(A2W("terminal"))==-1)
{
*Cancel = VARIANT_TRUE;
char buffer[200];
if (str.GetLength()==0)
{
...
}
else
{

VARIANT* arr = (VARIANT*)(PostData->byref);

CComPtr<IWebBrowser2> browser;
if (SUCCEEDED(pDisp->QueryInterface(IID_IWebBrowser2, (void **)&browser)))
{
browser->Navigate2(URL,Flags,TargetFrameName,arr,Headers);
}
}

}
}
Re: IWebBrowser2::Navigate2 post variant
От: dkotov  
Дата: 09.11.07 22:33
Оценка:
Как-то так...

BOOL NavigateEx(IWebBrowser* pWebBrowser, CONST TCHAR* pURLToNavigate, CONST TCHAR* pPostData /* = NULL */,
VARIANT* vFLAGS /* = NULL */, VARIANT* vTargetFrameName /* = NULL */, VARIANT* vHeaders /* = NULL */)
{
...
VARIANT vPostData;
vPostData.vt = VT_NULL;

size_t stSize = _tcslen( pPostData ) * 2;
string sPostData;
sPostData.reserve( stSize + 1 );
stSize = wcstombs( (CHAR*)sPostData.c_str(), pPostData, sPostData.capacity() );
sPostData._Mysize = stSize;

vPostData.vt = VT_ARRAY;
vPostData.parray = ::SafeArrayCreateVector( VT_UI1, 0, sPostData.size() );
VOID HUGEP* pSafeData;
SafeArrayAccessData( vPostData.parray, &pSafeData );
memcpy( pSafeData, sPostData.c_str(), sPostData.size() );
SafeArrayUnaccessData( vPostData.parray );

HRESULT hResult = pWebBrowser->Navigate( (BSTR)pURLToNavigate,
vFLAGS, vTargetFrameName, &vPostData, vHeaders );

...
}

Здравствуйте, OverCrash, Вы писали:

OC>Hi all

OC>Собственно сабж.
OC>каким таким непонятным вариантом засылается пост-дата

OC>в мсдн написано что The post data specified by PostData is passed as a SAFEARRAY Data Type structure. The variant should be of type VT_ARRAY and point to a SAFEARRAY Data Type. The SAFEARRAY Data Type should be of element type VT_UI1, dimension one, and have an element count equal to the number of bytes of post data.


OC>мож кусочком кода кто поделится ?
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re: IWebBrowser2::Navigate2 post variant
От: Аноним  
Дата: 29.10.08 10:16
Оценка:
Здравствуйте, OverCrash, Вы писали:

OC>Hi all

OC>Собственно сабж.
OC>каким таким непонятным вариантом засылается пост-дата

OC>в мсдн написано что The post data specified by PostData is passed as a SAFEARRAY Data Type structure. The variant should be of type VT_ARRAY and point to a SAFEARRAY Data Type. The SAFEARRAY Data Type should be of element type VT_UI1, dimension one, and have an element count equal to the number of bytes of post data.


OC>мож кусочком кода кто поделится ?


VARIANT vFlags = {0};
VARIANT vPostData = {0};

// Test data length.
int len = 6;

// Create test data.
char* data = new char[len];

// Copy a string, including its NULL character.
memcpy(data, "hello", len);
data[2] = '\0';
// The data now contains {he\0lo\0}. There is an embedded NULL character.

// Put data into safe array.
LPSAFEARRAY psa = SafeArrayCreateVector(VT_UI1, 0, len);
if (!psa)
return;
LPSTR pPostData;
HRESULT hr=SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData,data,len);
hr = SafeArrayUnaccessData(psa);

// Package the SafeArray into a VARIANT.
V_VT(&vPostData) = VT_ARRAY | VT_UI1;
V_ARRAY(&vPostData) = psa;

// Get Headers.
VARIANT vHeaders = {0};
V_VT(&vHeaders) = VT_BSTR;

// Specify a binary Content-Type.
V_BSTR(&vHeaders) = SysAllocString(
L"Content-Type: application/octet-stream\r\n"
L"Content-Encoding: gzip\r\n");

// Navigate, and POST the data. http://myserver/myasp.asp
// is an Active Server Pages page that expects POST data.
// m_pBrowserApp is declared as IWebBrowser2*
hr = m_pBrowserApp->Navigate(L"http://myserver/myasp.asp", &vFlags,
NULL, &vPostData, &vHeaders);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.