Считать данные за ИЕ

Тема в разделе "WASM.WIN32", создана пользователем zerd, 8 окт 2006.

  1. zerd

    zerd New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    5
    Нужно получить ответ на запрос за ИЕ. Я делаю так:

    Код (Text):
    1. res:=InternetQueryDataAvailable(hRequest,len,dwFlags,dwContext);
    2. repeat
    3.  
    4. if (len<>0)and(res) then
    5. begin
    6. InternetReadFile(hRequest,pmem,len,bytes);
    7. //MessageBox(0,pmem,nil,0);
    8. memSize:=memSize+bytes;
    9. pMem:=Pointer(DWORD(pmem)+bytes);
    10. end else
    11. sleep(50);
    12.  
    13.  
    14. res:=InternetQueryDataAvailable(hRequest,len,dwFlags,dwContext);
    15. until (len=0)and(res);
    Но ИЕ все время зависает, но если поставить MessageBox после вызова InternetReadFile, то все работает как надо. Пробывал ставить всякие задержки вместо MessageBox, но ничего не помогает...
     
  2. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    InternetReadFile(hRequest,pmem,len,bytes);
    bytes - это указатель на переменную, принимающую кол-во считаных байт.
    нужно так:
    InternetReadFile(hRequest,pmem,len,&bytes);
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Sickle
    Это вобщето Delphi.
     
  4. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    n0name
    точно :) а там переменную не адресом передавать нужно?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Sickle
    Где как, если она в прототипе объявлена, как var, то нет, а если в прототипе объявлена как указатель, PDWORD, то соответсвенно нужно передавать адрес, через @
     
  6. zerd

    zerd New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    5
    Ну так может кто-то знает почему с MessageBox все работает, а если поставить вместо него задержку, то нет? В чем разница?
    Еще я заметил что если в самом начале поставить задержку секунды 2, то в 50% все работает.
    Я проследил, при зависании res=true, len=0, но при первом выполнении цикла получается считать некоторое количество байт всегда.
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну у меня так всё работало
    Код (Text):
    1.        result := GetMemory(1024);
    2.        Ptr := 0;
    3.        while true do
    4.         begin
    5.          if not InternetQueryDataAvailable(hPage, bw, 0, 0) then break;
    6.          if bw = 0 then break;
    7.          ReallocMemory(result, Ptr + bw);
    8.          Len^ := Ptr + bw;
    9.          if not InternetReadFile(hPage, Pointer(Cardinal(result) + Ptr), bw, bw) then break;
    10.          if bw = 0 then break;
    11.          Ptr := Ptr + bw;
    12.         end
     
  8. zerd

    zerd New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    5
    n0name
    Это будет работать только в синхронном режими, а ИЕ работает в асинхронном.