Работаю в 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.