Не завершается процесс, использующий WinInet
От: qLost Удмуртия  
Дата: 22.08.06 11:10
Оценка:
Работаю в BCB6, хотя, считаю, что это не принципиально, т.к. не использую VCL и RTL. Только то, что даёт винда. Даже RTL-овские функции типа malloc, memcpy, strcat и т.п. заменяю на виндовые или свои аналоги. Т.е. пользуюсь технологией описанной здесь или здесь. Плюс, заменители RTL-функций взял из библиотеки FAR'а здесь.

Пример:
#include "..\FarHeaders\crt.hpp"
#include <windows.h>
#include <wininet.h>
#pragma hdrstop

void main() {
 HINTERNET hInternet, hConnect, hRequest;

 hInternet=InternetOpen("HTTP Agent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
 if (hInternet) {
  hConnect=InternetConnect(hInternet, "informer.gismeteo.ru", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
  if (hConnect) {
   hRequest=HttpOpenRequest(hConnect, "GET", "/rss/28411.xml", NULL, NULL, NULL, INTERNET_FLAG_HYPERLINK|INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_RELOAD|INTERNET_FLAG_IGNORE_CERT_CN_INVALID|INTERNET_FLAG_IGNORE_CERT_DATE_INVALID|INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS, NULL);
   if (hRequest) {
    if (HttpSendRequest(hRequest, NULL, 0, NULL, 0)) {
     unsigned long status=0, size=sizeof(status);
     HttpQueryInfo(hRequest, HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_STATUS_CODE, &status, &size, NULL);
     if (status==200) {
      char buf[1024];
      HANDLE f=CreateFile("resp.xml", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
      while (InternetReadFile(hRequest, buf, 1024, &size) && size>0)
       WriteFile(f, buf, size, &size, NULL);
      CloseHandle(f);
     }
    }
    InternetCloseHandle(hRequest);
   }
   InternetCloseHandle(hConnect);
  }
  InternetCloseHandle(hInternet);
 }
}


В итоге после отработки HTTP-запроса процесс так и остаётся висеть. В Билдере его можно снять по Ctrl-F2, в консоли по Ctrl-Break.
При этом. Если скомпилить это же самое с родными библиотеками BCB, то процесс не подвисает. Очевидно, BCB подчищает за собой какой-то мусор, но какой?..
Единственное найденное решение ExitProcess() не подходит, т.к. код может использоваться в dll.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.