Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
1

Различные хэндлы

05.04.2018, 18:04. Показов 744. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как известно все хэндлы, которые используются в win api есть не что иное как указатели на void.
Почему же несмотря на это иногда требуется приведение одного хэндла к другому?
Например при заполнении структуры оконного класса встречается такая инструкция:

C++
1
wcex.hbrBackground = static_cast<HBRUSH>(GetStockObject(LTGRAY_BRUSH));
ну или такая:

C++
1
wcex.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
Ведь если и тот и другой хэндл есть void *, то вроде по всем канонам C++ явное преобразование вообщем то не нужно.

Тем не менее, вот такая инструкция уже не работает:

C++
1
wcex.hbrBackground = GetStockObject(LTGRAY_BRUSH);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.04.2018, 18:04
Ответы с готовыми решениями:

Хэндлы hProcess и hThread
Объясните, пожалуйста, для чего в программе используются хэндлы процесса и потока (hProcess,...

Как получить хэндлы системного процесса?
Добрый день. Пытаюсь получить handle какого-нибудь системного процесса. Нашел в инете пример,...

Хэндлы у Fire Monkey
Ребяты!... Хелп ми sos!.. Нужно узнать позицию прокрутки в ListBox, нашёл способ через Хэндл...

Хэндлы или потоки в C++11
Здравствуйте. Помогите новичку выполнить данную задачку на C++11: 1. Написать программу,...

4
Эксперт С++
3574 / 2828 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
06.04.2018, 11:24 2
Цитата Сообщение от Просто Саша Посмотреть сообщение
Как известно все хэндлы, которые используются в win api есть не что иное как указатели на void.
это с чего вы так решили?

это
C++
1
2
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
DECLARE_HANDLE (HWND);
тоже по вашему void?
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
06.04.2018, 16:11  [ТС] 3
Цитата Сообщение от _lunar_ Посмотреть сообщение
это с чего вы так решили?
А можно не вопросом.
Если знаете, то ответьте более конкретно и понятно.
Из Вашего ответа пока ничего не понятно.

Добавлено через 2 часа 52 минуты
Понятно, ответить слабо.
Но кое что я понял.
На самом деле хэндлы - это указатели на некие структуры, определенный в win api.
Их единственное назначение быть переданными тем или иным системным функциям.
Через хэндлы нельзя получать доступ к полям структуры, на которые они указывают.
Одним словом, это даже не совсем указатели, а скорее некая единообразная форма представления того, что имеется в программе.
Конечно, возникает масса вопросов по тому как одни из них пребразовываются в другие, и тем более иногда допускается преобразование целых значений в хэндлы, как например:

C++
1
wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
Совершенно непонятно, как целое число преобразовывается в некое подобие указателя.
0
Эксперт С++
3574 / 2828 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
07.04.2018, 12:45 4
Цитата Сообщение от Просто Саша Посмотреть сообщение
Понятно, ответить слабо.
с такими комментариями вам никто отвечать не будет.
а мысль, о том, что я всё это время не заходил на форум вам в голову приходила?
или я что тут должен сидеть днями и ночам и мониторить ваши вопросы?

Цитата Сообщение от Просто Саша Посмотреть сообщение
На самом деле хэндлы - это указатели на некие структуры, определенный в win api.
WinAPI здесь не причём.
если утрировать WinAPI это обертка над NativeAPI, которая в свою очередь обертка над системными вызовами.
по сути все системные вызовы это сервисные таблицы, а хендлы это не указатели, а индексы в этих таблицах.
хендл может быть как адресом на структуру или объект ядра, так и чем-то другим (void в данном случае служит просто типом передачи данных).
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
07.04.2018, 13:15  [ТС] 5
Цитата Сообщение от _lunar_ Посмотреть сообщение
WinAPI здесь не причём.
если утрировать WinAPI это обертка над NativeAPI, которая в свою очередь обертка над системными вызовами.
по сути все системные вызовы это сервисные таблицы, а хендлы это не указатели, а индексы в этих таблицах.
хендл может быть как адресом на структуру или объект ядра, так и чем-то другим (void в данном случае служит просто типом передачи данных).
Ну хорошо допустим, что это так.
Но правила работы с этими штуками (как то, например, правила преобразования одних хэндлов к другим и тому подобное) должны же где-то быть, или Microsoft забила на это?
0
07.04.2018, 13:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2018, 13:15
Помогаю со студенческими работами здесь

Delphi xe7 multi-device Form , хэндлы окон и работа с ними
Писал прогу для послания нажатий клавиш в неактивое окно в delphi xe4. По аналогии стал писать...

Составить алгоритм решения ребуса РАДАР = (Р + А + Д)4 (различные буквы обозначают различные цифры, старшая — не 0).
27. Составить алгоритм решения ребуса РАДАР = (Р + А + Д)4 (различные буквы обозначают различные...

Составить алгоритм решения ребуса РАДАР=(Р+А+Д)^4 (различные буквы означают различные цифры, старшая - не 0).
я знаю что на С++ это должно быть так... void main () { char g ; CharToOem (&quot;\nРешение...

Составить три блочные цветовые схемы, используя различные цветовые стили дизайна и различные композиции
Составить три блочные цветовые схемы, используя различные цветовые стили дизайна и различные...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru