Хэндл

  • Автор темы -
  • Дата начала

Гость
#1
Всем добрый вечер! Раньше я как-то этим не очень интересовался, но сейчас возник вопрос - если HANDLE - это указатель на void, то на что именно он указывает? И как можно создать свой хэндл (если это возможно) и связать с ним какие-либо данные. Спасибо за все ответы.
 
I

ierofant

Гость
#2
Это нестандартный тип, напиши конкретную библиотеку из которой ты его берёшь.
 

grigsoft

Well-Known Member
15.11.2005
735
0
#3
ierofant, речь о Windows, видимо.
За handle скрыты внутренние структуры, о которых знать необязательно. Кое-чего описано у рихтера в последнем издании.
 

Гость
#4
Кое-чего описано у рихтера в последнем издании.
Я не знаю, кто такой Рихтер. И где же скачать это последнее издание?
Да, в данном случае речь о Windows.
За handle скрыты внутренние структуры.
А я могу скрыть свои структуры за handle?
 

grigsoft

Well-Known Member
15.11.2005
735
0
#5
рихтер - это библия для разработчиков под Win.

Скрыть свои? Кто ж мешает?
было:
C++:
struct CBook
{ 
char author[100];
char title[100];
int nPages;
BOOL bRead;
};
CBook * CreateBook(char* author, char* title);
void DeleteBook(CBook*);
void MarkBookAsRead(CBook* book);
стало:
C++:
HANDLE CreateBook(char* author, char* title);
void DeleteBook(HANDLE);
void MarkBookAsRead(HANDLE);
С той же самой целью - не дать пользователям библиотеки копаться во внутренностях твоей структуры.
НО - все это сделано для АПИ с его С-интерфейсом, С++ дает достаточно встроенных средств для той же цели:
C++:
struct CBook
{ 
CBook(char* author, char* title);
void MarkBookAsRead();
private:
char author[100];
char title[100];
int nPages;
BOOL bRead;
};
Так что смысла особого нет так извращаться.
 

Гость
#6
Спасибо, grigsoft!
А как сделать что-то вроде регистраци класса окна:
C++:
WNDCLASS wc;
// Заполняем структуру...
wc.lpszClassName = "My Class"; // Задаём имя класса
RegisterClass (&wc); // Засунем класс в недра Windows.
HWND hwnd = CreateWindow ("My Class", ...); // А потом укажем имя класса, и Windows сам его найдёт.
Только со своей структурой? Тут уже задача гораздо сложнее.
С++ дает достаточно встроенных средств для той же цели
А если я на С пишу?
 

grigsoft

Well-Known Member
15.11.2005
735
0
#7
Хендл - это просто заглушка типа, не более того - он не помогает и не мешает программировать. А как это сделать, если бы CreateWindow возвращал просто указатель на структуру окно? Вот точто также. Или я не понял что требуется?
Ну для С - да, вполне себе метод. Но надо понимать что за ним стоит, для кода выше с хендлами будет:
C++:
// реализация
struct CBook
{ 
char author[100];
char title[100];
int nPages;
BOOL bRead;
};

HANDLE CreateBook(char* author, char* title)
{
CBook* pBook = new CBook();
//...
return (HANDLE)pBook;
}
void DeleteBook(HANDLE h)
{
CBook* pBook = (CBook*)h;
delete pBook;
}
void MarkBookAsRead(HANDLE h)
{
CBook* pBook = (CBook*)h;
if (pBook)
pBook->bRead = 1;
}
Для вас - это нормальная структура, для пользователя - просто хендл.

К слову, реально в Win handle для многих объектов не указывает напрямую на область памяти, а лишь нумерует объекты из специальной таблицы для процесса.
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#8
Всем выше оставленным комментаторам просто поражаюсь. Есть желание поставить всем минус, но я сам по-себе добрый и минусы без особой причины не ставлю.

Партизан
HANDLE определен как:
C++:
typedef PVOID HANDLE;
C++:
typedef HANDLE HBITMAP;
C++:
typedef HANDLE HWND;
и т.д. и т.п..
Все остальные хэндлы определены по такому же принципу, т.е. они являются типом PVOID.
Тип PVOID, в свою очередь, определяется как:
C++:
typedef void * PVOID;
Т.е.: хэндл - это просто указатель на какой-то тип (обычно структура), и каждая функция знает указатель на что она получает (именно для этого тип HANDLE и разделили на несколько подхэндлов с разными названиями).
По-сути, названия типов хэндлов роли не играют никакой.

Я вот только что придумал свой хэндл:
C++:
typedef void * HPITYPROGRAMMER;
ierofant От тебя ждал большего.
grigsoft Какие классы!? Ты о чем вообще??

Даже мне за вас стыдно...
 
R

Rififi

Гость
#9
Партизан

если HANDLE - это указатель на void, то на что именно он указывает?

хэндл - это уникальный идентификатор, по которому система получает доступ к недокументированным структурам, например используя функцию ObReferenceObjectByHandle

И как можно создать свой хэндл (если это возможно) и связать с ним какие-либо данные

для этого надо быть разработчиком ядра Windows
 

Гость
#11
Или я не понял что требуется?
Видимо, да. Я, наверно, не очень понятно объяснил. Я же в функцию CreateWindow никакого указателя не посылал (только имя класса окна), но структуру WNDCLASS (по имени класса) в памяти эта функция нашла. Вот это мне и надо реализовать. Посмотрите код:
Код:
struct OBJECT
{
LPCTSTR lpszName;
int n1, n2;
}

void RegisterObject (OBJECT *pObj)
{
// Регистрируем объект...
}

HOBJ RealizeObject (LPCTSTR lpszObjName, ...)
{
// Реализуем объект и возвращаем его хэндл.
// Заметьте, что явный указатель на структуру в эту функцию не посылался.
}
// Функции RegisterObject и RealizeObject мне и надо реализовать!

void main (void)
{
OBJECT myObj;
myObj.lpszName = "My Object";
myObj.n1 = 100;
myObj.n2 = 1000;
RegisterObject (&myObj);
HOBJ hobj = RealizeObject ("My Object", ...); // Функция находит в памяти нашу структуру.
}
 
R

Rififi

Гость
#12
Партизан

Функции RegisterObject и RealizeObject мне и надо реализовать!

это можно сделать с использованием любого ассоциативного контейнера, например std::map

для более углублённого изучения темы, гоогле по словам "Паттерны проектирования", "Порождающие паттерны" (фабрика и пр.)
 

Гость
#13
гоогле по словам "Паттерны проектирования", "Порождающие паттерны" (фабрика и пр.)
Что-то я не нашёл ничего подходящего для меня. Может, сразу скажете ссылку на страницу, где можно получить нужную информацию?
 
R

Rififi

Гость
#14
Партизан

Может, сразу скажете ссылку на страницу, где можно получить нужную информацию?

"мой" гоогле - такой же как у тебя.

Чтобы видеть этот контент необходимо: Войти или зарегистрироваться


Чтобы видеть этот контент необходимо: Войти или зарегистрироваться


http://progbook.ru/technologiya-programmir...irovannogo.html