Хэндл

Тема в разделе "Общие вопросы по С и С++", создана пользователем -, 22 дек 2010.

  1. Гость

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

    ierofant Гость

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    ierofant, речь о Windows, видимо.
    За handle скрыты внутренние структуры, о которых знать необязательно. Кое-чего описано у рихтера в последнем издании.
     
  4. Гость

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    рихтер - это библия для разработчиков под 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 сам его найдёт.
    Только со своей структурой? Тут уже задача гораздо сложнее.
    А если я на С пишу?
     
  7. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Хендл - это просто заглушка типа, не более того - он не помогает и не мешает программировать. А как это сделать, если бы 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 для многих объектов не указывает напрямую на область памяти, а лишь нумерует объекты из специальной таблицы для процесса.
     
  8. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Всем выше оставленным комментаторам просто поражаюсь. Есть желание поставить всем минус, но я сам по-себе добрый и минусы без особой причины не ставлю.

    Партизан
    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 Какие классы!? Ты о чем вообще??

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

    Rififi Гость

    Партизан

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

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

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

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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Еще раз такое скажешь - получишь гнилой пряник.
     
  11. Гость

    Видимо, да. Я, наверно, не очень понятно объяснил. Я же в функцию CreateWindow никакого указателя не посылал (только имя класса окна), но структуру WNDCLASS (по имени класса) в памяти эта функция нашла. Вот это мне и надо реализовать. Посмотрите код:
    Код (Text):
    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", ...); // Функция находит в памяти нашу структуру.
    }
     
  12. Rififi

    Rififi Гость

    Партизан

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

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

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

    Что-то я не нашёл ничего подходящего для меня. Может, сразу скажете ссылку на страницу, где можно получить нужную информацию?
     
  14. Rififi

    Rififi Гость

Загрузка...
Похожие Темы - Хэндл
  1. admin
    Ответов:
    3
    Просмотров:
    20.230

Поделиться этой страницей