Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/10: Рейтинг темы: голосов - 10, средняя оценка - 4.70
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

Как правильно использовать InternetCloseHandle

01.05.2020, 14:13. Показов 2516. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
я создаю переменную
C++
1
HINTERNET hsession = NULL;
потом в коде я для него вызываю
C++
1
InternetOpen
который дает ему значение.
дальше идет какой-то код который в теории может вызвать исключение после которого идет
C++
1
InternetCloseHandle(hsession);
1) Насколько важно вызывать InternetCloseHandle?;
2)Как правильно поступить в этой ситуации(если исключение сработает и код не дойдет до InternetCloseHandle)?
Я знаю что можно использовать shared_ptr и передать ему вторым параметром лямбда-функцию которая бы закрывала этот handle. Это правильное решение?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.05.2020, 14:13
Ответы с готовыми решениями:

Как правильно передать указатель на структуру, и правильно ее использовать
Я планирую сделать сортировку, но компилятор начал ругаться "Нет существует подходящей функции преобразования "Student" в...

Как правильно использовать map?
Свой код писал по примеру cut. Вот, что есть, и показываю скрин екхепшана, который выбрасывается. Кто-нибудь может помочь разобраться...

Как использовать правильно потоки
У меня есть нечто рода void DiscordJob::SendMessageThread(const char *chanel, const char *pMessage) { std::thread t(() { ...

53
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.05.2020, 15:47  [ТС]
Студворк — интернет-сервис помощи студентам
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
От того что ты будешь закрывать хэндл в деструкторе или не в деструкторе ничего принципиально не поменяется
Но если исключение сработает то деструктор вызовется , а код после исключения - нет
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.05.2020, 15:55
Цитата Сообщение от ReYalp Посмотреть сообщение
Но если исключение сработает то деструктор вызовется , а код после исключения - нет
Имеется ввиду архитектура - тебе также придётся решать вопрос с взаимоотношением классов, статическими-нестатическими переменными и т.д.

Добавлено через 4 минуты
В MFC, кстати, все эти классы уже сделаны
https://docs.microsoft.com/en-... ew=vs-2019
https://www.helloworld.ru/text... vc2/21.htm
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.05.2020, 16:08  [ТС]
oleg-m1973, вот я написал такой класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class inhandle
{
public:
    inhandle() = default;
    explicit inhandle(HINTERNET h) noexcept;
    inhandle(const inhandle&) = delete;
    inhandle(inhandle&&);
 
    ~inhandle();
 
    inhandle& operator=(const inhandle&) = delete;
    inhandle& operator=(inhandle&&);
        inhandle& operator=(HINTERNET);
 
    operator HINTERNET() const noexcept;
 
    static void SetupConnection();
    static void CloseConnection();
 
private:
    static inhandle hsession, hconnection;
 
    void AddHeaders(std::string);
    void OpenRequest(std::string, std::string);
    void SendRequest(std::string);
 
    HINTERNET handle = NULL;
};
Как по мне то это в разы удобнее, разве нет?

Добавлено через 1 минуту
hoggy, Хотелось бы и Ваше мнение узнать по этому поводу , если нужно могу скинуть все описания функций
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.05.2020, 16:13
Цитата Сообщение от ReYalp Посмотреть сообщение
Как по мне то это в разы удобнее, разве нет?
Конечно нет. Какой-то уродец получился с непонятной функциональностью.

Добавлено через 1 минуту
Покажи реализацию этого класса
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.05.2020, 16:16  [ТС]
oleg-m1973, он еще до конца не доделан но вот что-то такое
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
inhandle::inhandle(HINTERNET _handle):handle(_handle) {
}
 
 
inhandle::inhandle(inhandle&& _handle) : handle(_handle) {
 
}
 
 
inhandle::~inhandle() {
    InternetCloseHandle(handle);
}
 
 
inhandle&  inhandle::operator=(inhandle&& _handle) {
    handle = _handle;
    return *this;
}
 
 
inhandle& inhandle::operator=(HINTERNET _handle) {
    handle = _handle;
    return *this;
}
 
 
inhandle::operator HINTERNET()const noexcept {
    return handle;
}
 
 
void inhandle::SetupConnection() {
    if ((hsession = InternetOpen(L"Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)", //Initializes an application's use of the WinINet functions
        INTERNET_OPEN_TYPE_PRECONFIG,
        NULL,
        NULL,
        0)) == NULL) { //checks if it has successfully worked
                //error occured. throw an exception
    }
 
    if ((hconnection = InternetConnect(hsession,
        L"webpage",
        INTERNET_DEFAULT_HTTPS_PORT, // THIS
        L"",
        L"",
        INTERNET_SERVICE_HTTP,
        0,
        0)) == NULL) { //checks if it has successfully worked
                //error occured. throw an exception
    }
}
 
 
void inhandle::AddHeaders(std::string headers) {
    if (!HttpAddRequestHeadersA(handle, headers.data(), (DWORD)headers.length(), HTTP_ADDREQ_FLAG_ADD)) {
        //error occured. throw an exception
    }
}
 
 
void inhandle::OpenRequest(std::string verb = "GET", std::string destination = "/") {
    std::wstring wverb, wdestination;
    wverb = std::wstring(verb.begin(), verb.end());
    wdestination = std::wstring(destination.begin(), destination.end()); //convert string to wstring
 
    handle = HttpOpenRequest(
        hconnection,
        wverb.c_str(),
        wdestination.c_str(),
        NULL,
        NULL,
        NULL,
        INTERNET_FLAG_SECURE,
        0);
 
    if (handle == NULL) {  //checks if it has successfully worked
        //error occured. throw an exception
    }
}
 
 
void inhandle::SendRequest(std::string opt = "") {
    if (opt.empty()) {
        while (!HttpSendRequest(handle, 0, 0, 0, 0)) {
            printf("HttpSendRequest error : (%lu)\n", GetLastError());
            InternetErrorDlg(
                GetDesktopWindow(),
                handle,
                ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,
                FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
                FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
                FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
                NULL);
        }
    }
    else {
        while (!HttpSendRequest(handle, 0, 0, (LPVOID)opt.data(), opt.length())) {
            printf("HttpSendRequest error : (%lu)\n", GetLastError());
            InternetErrorDlg(
                GetDesktopWindow(),
                handle,
                ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,
                FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
                FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
                FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
                NULL);
        }
    }
}
 
 
void inhandle::CloseConnection() {
    InternetCloseHandle(hsession);
    InternetCloseHandle(hconnection);
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.05.2020, 16:18
Чем, например h.OpenRequest(....) удобнее, чем HttpOpenRequest(h, .....)?

Добавлено через 1 минуту
Цитата Сообщение от ReYalp Посмотреть сообщение
void inhandle::SetupConnection() {
Зачем эта функция в классе inhandle, какая у этого цель?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.05.2020, 16:21  [ТС]
oleg-m1973, создать хендл с помощью которого в будущем можно будет создавать запросы
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.05.2020, 16:21
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void inhandle::swap(inhandle &src) noexcept
{
    std::swap(handle, src.handle)
}
 
inhandle&  inhandle::operator=(inhandle&& _handle) noexcept
{
    _handle.swap(*this);
    return *this;
}
 
inhandle &inhandle::operator=(HINTERNET _handle) noexcept
{
    ::InternetCloseHanle(handle);
    handle = _handle;
    return *this;
}
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.05.2020, 16:23  [ТС]
ну насколько я придумал то логика такая что setupconnection вызывается всего раз и дальше будет возможность создавать запросы на основе hconnection

Добавлено через 54 секунды
oleg-m1973, на операторы и конструкторы не смотрите , я их доделаю
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.05.2020, 16:24
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, создать хендл с помощью которого в будущем можно будет создавать запросы
Ты предполагаешь что все твои программы будут работать только с одной сессией и одним коннектом?
И кто будет вызывать CloseConnection? Зачем тебе смарт поинтер, если его надо чистить вручную?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.05.2020, 16:27  [ТС]
oleg-m1973, а зачем функция swap если можно закрыть текущий хендл и переместить с помощью std::move Новый?
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
void inhandle::swap(inhandle &src) noexcept
{
std::swap(handle, src.handle)
}
Добавлено через 33 секунды
oleg-m1973, да, этот класс строится для работы только с одним сайтом(сервером)

Добавлено через 1 минуту
oleg-m1973, ну насчет closeconnection еще не знаю , возможно он и не нужен, эти объекты и так удалятся при завершении программы
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.05.2020, 16:27
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, да, этот класс строится для работы только с одним сайтом(сервером)
Нет, это класс для работы с любыми WinInet-хэндлами. Не надо в него пихать логику конкретной утилитки, он тебе ещё потом пригодится.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.05.2020, 16:28  [ТС]
oleg-m1973, SetupConnection и CloseConnection будет вызывать main в начале запуска всей программы
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.05.2020, 16:29
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, ну насчет closeconnection еще не знаю , возможно он и не нужен, эти объекты и так удалятся при завершении программы
Нужен. И inhandle как раз предназначен для решения этой задачи - закрытия хэндлов. Всё остальное делается по-другому.
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, а зачем функция swap если можно закрыть текущий хендл и переместить с помощью std::move Новый?
Я тебе там ещё оператор присваивания показал
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.05.2020, 16:32  [ТС]
oleg-m1973, просто сейчас задача у моего проекта это работать только с одним сайтом , я согласен что лучше строить "универсальные" классы, только как тогда правильно сделать hconnection и hsession чтобы их можно было использовать и с другими сайтами? статическими они точно быть не могут тогда, а создвать для каждого хендла новые не очень правильно

Добавлено через 1 минуту
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Я тебе там ещё оператор присваивания показал
почему нельзя handle = std::move(_handle);
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.05.2020, 16:34
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, SetupConnection и CloseConnection будет вызывать main в начале запуска всей программы
Ну так объяви переменные, нестатические и вызывай
C++
1
2
inhandle hInet(::InternetOpen(......));
inhandle hCnn(::InternetOpen(hInet, ......));
Добавлено через 1 минуту
Цитата Сообщение от ReYalp Посмотреть сообщение
почему нельзя handle = std::move(_handle);
Это то же самое, что handle = _handl.handle, std::move не обменивает значения
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.05.2020, 16:36  [ТС]
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну так объяви переменные, нестатические и вызывай
но если я объявлю их нестатичекими то они будут доступны только одному объекту

Добавлено через 1 минуту
просто для меня логика такова что один объект - один запрос , дальше удаляется
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.05.2020, 16:37
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, просто сейчас задача у моего проекта это работать только с одним сайтом , я согласен что лучше строить "универсальные" классы, только как тогда правильно сделать hconnection и hsession чтобы их можно было использовать и с другими сайтами? статическими они точно быть не могут тогда, а создвать для каждого хендла новые не очень правильно
Ты уже сделал универсальный класс. Не надо впихивать в него какой-то ненужный и кривой код.
И - тебе там не нужны никакие статические переменные

Добавлено через 25 секунд
Цитата Сообщение от ReYalp Посмотреть сообщение
но если я объявлю их нестатичекими то они будут доступны только одному объекту
Какому именно?

Добавлено через 16 секунд
Покажи этот объект
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.05.2020, 16:37  [ТС]
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это то же самое, что handle = _handl.handle, std::move не обменивает значения
а зачем там вообще обмен значений? Там же rvalue ссылка , объект и так скорее всего умрет , зачем ему еще значение присваивать?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.05.2020, 16:38
Цитата Сообщение от ReYalp Посмотреть сообщение
а зачем там вообще обмен значений? Там же rvalue ссылка , объект и так скорее всего умрет , зачем ему еще значение присваивать?
Потому что старый хэндл надо тоже закрыть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.05.2020, 16:38

Как правильно использовать struct?
Написал небольшую, глупенькую программку, но столкнулся с проблемой заполнения структуры. Если kube.size вводит, то kube.color программа...

Как правильно использовать потоки?
Тему про потоки прочёл. Так же ознакомился с классом mutex. И вот есть некий вопрос: как правильно использовать синхронизацию потоков в...

Как правильно использовать cin.get?
cin.get и cin.getline - одно и то же? Мне нужно задание полностью с указателями сделать, но я не понимаю как использовать при этом...

Как правильно использовать оператор else?
Подскажите пожалуйста, как правильно применить оператор else в задаче...у меня она не работает, приходится лишний раз прописывать код с...

Как правильно использовать цикл?
Задача с экспонентами. Нужно найти следующее: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru