Помогите с перехватом POST
От: multipasport  
Дата: 28.03.06 13:04
Оценка:
Есть 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;
}
Re: Помогите с перехватом POST
От: algol Россия about:blank
Дата: 30.03.06 10:33
Оценка:
Здравствуйте, 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;
    }
Re[2]: Помогите с перехватом POST
От: multipasport  
Дата: 03.04.06 08:06
Оценка:
Спсибо за ответ, я видел похожий код на форуме.
Сейчас у меня после SafeArrayAccessData(parrTemp, (void HUGEP **) &szTemp);
валится ie. Проблема с SafeArrayGetLBound(parrTemp, 1, &plLbound);
Что делаю не так?
Re[2]: Помогите с перехватом POST
От: Аноним  
Дата: 03.11.06 06:29
Оценка:
Здравствуйте, 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".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.