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

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

01.05.2020, 14:13. Показов 2252. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru