Помогите разобраться с функцией GetDC, с возвращаемым ею значением!

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 3 июн 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Пожалуйста, а то я залез в какие-то дебри, оставив позади себя простые истины. И не могу их найти.

    Итак, имеем стороннее приложение, которое создаёт несколько окошек и кое-что пишет в них с помощью DrawTextW, которую я намерен перехватить, когда она будет записывать нечто в ОДНО ИЗ ОКОН

    Для этого мне нужно найти дескриптор контекста устройства, который бы этому окну соответстовал. С помощью оконного менеджера, скачанного отсюда

    http://decoding.narod.ru/download/soft/objectviewer.zip

    нахожу хэндл окна.
    Потом с помощью такой вот проги нахожу дескриптор контекста устройства.

    Код (Text):
    1. #include <Windows.h>
    2. #include <stdio.h>
    3. #define handle_okna 1247792 /*предположим*/
    4.  
    5. int main () {
    6.  printf ("%x", GetDC ((HWND) handle_okna));
    7.  getchar ();
    8.  return 0;
    9. }
    Компилирую, запускаю. И вот пока на этом стоп. Вот 10 раз включу, появится 10 разных значений, как генератор случайных чисел кто-то включил. А аргумент-то GetDC один и тот же всегда!
    Хэндл окна неизменен, а дескрипоры его меняются постоянно причём. В общем, не пойму я, так должно быть, что ли? Спасибо.
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    я конечно не спец во всех этих окнах, но если учесть, что вся оконная инфа содержится в таблицах, общих для всех приложений, то можно сделать вполне логичный вывод:
    1) последний выделенный дескриптор 0х100
    2) запускаем наше приложение, естественно получаем 0х101
    3) пока мы второй раз запустем приложение дескрипторы получают и освобождают десятки других приложений, что приводит к тому, что на момент второго запуска последний выделенный дескриптор может быть как больше, так и меньше 0х100.
     
  3. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    А почему тебя не смущает, например, что CreateFile с одними и теми же аргументами всегда разные значения возвращает?
     
  4. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Я не пользовался CreateFile. Ну, или редко, раз-другой, буквально. Не настолько, чтобы заметит

    Ну, в общем, я понял, что так и должно быть, спасибо.
    А вообще я разницы не могу понять между

    дескриптором
    хэндлом
    идентификатором, допустим PID или потока (TID).

    Подставляю одно значение, не получилось- подставляю другое. Так вот, мыкаюсь.
     
  5. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Сделай то, что у тебя написано в подписи :)
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    amvoz
    GetDC не определяет (считывает откуда-то), а создаёт графический контекст для указанного окна. "Догадаться" об этом легко по тому факту что такие контексты после использования следует удалять ReleaseDC.
     
  7. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    amvoz
    Почитай и это вот тоже. Там есть инфа про гди хэндлы и всё такое. Книга проскакивала здесь на сайте под название asmgrahics.rar.
    А название оригинальное название - Feng Yuan - Windows Graphics Programming Win32 Gdi And Directdraw.chm
     
  8. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Моё предложении лучше....
     
  9. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Y_Mur
    Пошто путаете воина "догадками" ? :)
    GetDC не "создаёт" (как CreateDC), а - занимает, а ReleaseDC соответственно не "удаляет" (как DeleteDC), а - высвобождает, так ведь ? :)
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    kero
    Попробовал проверить догадку путём наблюдения за памятью процесса - сравнил её расход для GetDC и CreateCompatibleDC - в обоих случаях её расхода хватает только на создание нового handle :) Собственно вполне логичный результат - сама память для контекста выделяется ядром, а не в АП процесса, поэтому таким образом не определишь создаётся новый контекст или только новый handle. Но имхо совершенно нелогично в этом случае создавать новый handle (про появление которого и спрашивает ТС) для старого контекста.