Есть BHO.
В нем ловлю BEFORENAVIGATE2. Это работает. GetPOST() запускается. Подскажите последовательность действий в GetPOST() для получения PostData.
HRESULT CMy::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr){
if (!pDispParams) return E_INVALIDARG;
if (dispidMember == DISPID_BEFORENAVIGATE2) GetPOST();
return S_OK;
}
Здравствуйте, multipasport, Вы писали:
M>Есть BHO.
M>В нем ловлю BEFORENAVIGATE2. Это работает. GetPOST() запускается. Подскажите последовательность действий в GetPOST() для получения PostData.
Где-то так:
VARIANT* PostData = &pDispParams->rgvarg[2];
if (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);
// Используем szPostData, например
// MessageBox(szPostData);
delete[] szPostData;
}
Спсибо за ответ, я видел похожий код на форуме.
Сейчас у меня после SafeArrayAccessData(parrTemp, (void HUGEP **) &szTemp);
валится ie. Проблема с SafeArrayGetLBound(parrTemp, 1, &plLbound);
Что делаю не так?
Здравствуйте, algol, Вы писали:
M>>Есть BHO.
M>>В нем ловлю BEFORENAVIGATE2. Это работает. GetPOST() запускается. Подскажите последовательность действий в GetPOST() для получения PostData.
A>Где-то так:
A>A> VARIANT* PostData = &pDispParams->rgvarg[2];
A> if (PostData->vt == (VT_VARIANT|VT_BYREF) && PostData->pvarVal->vt != VT_EMPTY )
A> {
A> char *szTemp = NULL, *szPostData = NULL;
A> long plLbound, plUbound;
A> SAFEARRAY *parrTemp = PostData->pvarVal->parray;
A> SafeArrayAccessData(parrTemp, (void HUGEP **) &szTemp);
A> SafeArrayGetLBound(parrTemp, 1, &plLbound);
A> SafeArrayGetUBound(parrTemp, 1, &plUbound);
A> szPostData = new char[plUbound - plLbound + 2];
A> StrCpyN(szPostData, szTemp, plUbound - plLbound + 1);
A> szPostData[plUbound-plLbound] = '\0';
A> SafeArrayUnaccessData(parrTemp);
A> // Используем szPostData, например
A> // MessageBox(szPostData);
A> delete[] szPostData;
A> }
A>
Спасибо за код. Мне он тоже пригодился. Однако столкнулся с проблемой. При перехвате PostData с рускими символами (например: log=русский) выходит log=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9
Как его переделать в обычный UrlEncoding?

С одной стороны данные похожи на его реализацию, но получается каждый символ кодируется двумя "%D1%80".