Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Как правильно работать с функцией GetWindowText()? |
Автор: Jr13san 3.3.2012, 21:06 | ||||||
Сколько не программирую на различных языках, но на с++ не перестаю удивляться. Иногда становится просто тошно от того, что ты знаешь как запрограммировать определённое событие, всё для этого есть, но синтаксис не позволяет тебе двигаться дальше. Такая же ситуация и здесь. Пересмотрел пару десятков примеров вызова функции GetWindowText(), но ни один не работает. У меня есть только предположение о том, что я что-то упустил. Я сомневаюсь, что те части кода были обманом. Поэтому прошу помочь разобраться.
Ещё получилось выцепить ASCII символы из строки. Сейчас я не помню как тогда я написал. Но пришлось бы изобретать функцию преобразования всего этого в строку. А зачем передавать строку в непонятном виде, чтобы её нужно было потом преобразовывать? И это называется упрощение работы программисту? Даже нет слов. И грустно и смешно... Почему разработчики не могли сделать такую конструкцию? :
Наверное понравилось извращаться с переправкой данных за место того, чтобы этим занимался программист. Зачем наделали столько типов, что приходится на каждый вызов функции преобразовывать её выходные данные. Неужели нельзя было обойтись стандартными типами: short, int, long, byte, bool, string, double, и т.д. Зачем больше? Вместо того, чтобы работать над программным кодом, мне приходится искать преобразование типов или узнавать что это за таинственные типы параметров, передающихся в вызываемую функцию. Язык должен быть интуитивно понятным и простым в освоении, а не извращённым до нельзя. Результат самостоятельной работы над ошибками: Так как в проекте используется поддержка Unicode строк, то код выглядит следующим образом:
Чтобы проверить результат работы программы, нужно открыть окно блокнота(Notepad.exe) и запустить программу. Результат работы программы таков: 1. Получить идентификатор заголовка окна Блокнота. 2. По идентификатору окна получить обратно название окна. 3. Сравнить полученное название окна с заранее известным названием окна. |
Автор: LeonidPr 3.3.2012, 21:34 | ||||
А какое отношение к C++ имеет функция GetWindowText? Это одна из функций API в Windows, а в хедэре просто описан её прототип, чтобы вы могли её вызывать. Если бы Microsoft сделала эту функцию такой:
то использовали бы её так, как вы написали:
Мне кажется (знатоки, поправьте пожалуйста, если я не прав), что первый вариант был выбран из тех соображений, что вы должны будете явно выделить буфер для строки и следовательно будете следить, что бы память была освобождена после использования. Во втором же случае, система сама неявно (для того, кто пользуется функцией) должна выделить память под возвращаемую строку. Следовательно, легко забыть освободить её, что может привести к неприятностям. |
Автор: Jr13san 3.3.2012, 22:00 |
А что тут очищать то? Может быть ещё вручную? Я думаю так.. Функция возвращает "текст", а все переданные в неё параметры должны по идее сами удалиться из памяти после завершения работы этой функции. Но для этого должен существовать определённый "чистильщик". Или я не правильно мыслю в силу других языков, работающих таким алгоритмом? |
Автор: boostcoder 3.3.2012, 22:13 |
причину нужно искать в себе. плохому танцору, в курсе что мешало? ;) тебе не понять. к тому же, там ошибка. в общем, тему на свалку. |
Автор: LeonidPr 3.3.2012, 22:15 |
Что бы функция вернула текст, она должна выделить память под него. Вы с этим текстом поработали (вывели на консоль например). Теперь надо освободить выделенную под него память. Кто это будет делать? Я так понимаю вы, в C++ нет стандартного сборщика мусора. |
Автор: Jr13san 3.3.2012, 22:43 | ||||
Как раз-таки здесь причина в самом языке программирования. Скорей всего тебе не понять мою мысль. И вот наверное твоя же фраза это подтверждает:
Ага, куда же ей ещё. Жди, сейчас мусоровоз подъедет. Если тебе тема не интересна, то это не значит, что всё тут напрасно. Я пытаюсь разобраться с помощью людей, которые разбираются в данном языке и готовы как-то помочь. А от тебя одни сплошные комментарии, а толку 0.
Даже если этого сборщика нет, это не беда, это лишь отсутствие автоматизации данного языка. Дело в том, что функция возвращает не пойми что. Попробуйте написать что-то работающее на основе того, что я написал. в c++ может быть и нет, но в других ЯП есть тип string и он на много удобнее и проще чем char, TCHAR, WCHAR, ZLUPECHAR. Извините за последний "агрессивно-вымышленный" тип, но таковы реалии. |
Автор: bems 3.3.2012, 22:45 |
в данном случае нет, но дело даже не в этом. Если тебе не нравится язык, зачем ты на нём пишешь? |
Автор: boostcoder 3.3.2012, 22:52 |
тот код что ты привел - Си. в с++ как раз таки строки есть. это лишнее подтверждение моих слов ![]() так на каких ты там языках пишешь? |
Автор: Jr13san 3.3.2012, 22:56 | ||
Вы сговорились что-ли все? На самом деле я пишу на c++ из за его высокой скорости и относительно быстрой скорости написания кода в отличии от asm. |
Автор: boostcoder 3.3.2012, 22:57 |
ты не понимаешь одну из основ самосовершенствования: критика всего вокруг себя но только не себя - обрекает тебя на постоянное совершение того, что ты сейчас делаешь. а именно - говорить что что-то не так и не эдак, вместо того чтоб признать, что ты банально читать не умеешь. ибо для этой функции есть дока, и любой адекватный человек, за несколько минут разберется с тремя аргументами. по этому, снова спрошу: плохому танцору, знаешь что мешает? Добавлено @ 22:58 для танкистов, повторяю: это Си! |
Автор: marsh123 3.3.2012, 22:58 |
Сообщил в Microsoft гениальную идею автора, пообещали, что исправят. ![]() |
Автор: boostcoder 3.3.2012, 23:02 |
marsh123, сообщи ТСу адресок. чтоб в следующий раз он сразу им писал ![]() |
Автор: Jr13san 3.3.2012, 23:03 |
Ок. Я так понял, помощи я здесь не найду. Прощу прощение у адм. за пустую созданную тему. |
Автор: bems 3.3.2012, 23:04 | ||
А скорость написания выше разве что по сравнению с асмом, лол. Нет никаких причин писать user-mode приложения для windows на плюсах или чистом си. Это не нужно, для этого есть более удобные инструменты. А проблема описанная в оппосте связана даже не с языком, а с тем что ты не въехал в винапи, но пытаешься его использовать. Он совершенно сишный, со всей вытекающей ручной работой |
Автор: marsh123 3.3.2012, 23:04 | ||
Как Вы, кстати, определили, что тс пишет на Си, просто интересно, такой код без проблем и на C++ должен работать. Неужели из-за того, что он printf использует? |
Автор: boostcoder 3.3.2012, 23:09 |
потому что в его коде нет ничего от плюсов. Добавлено через 1 минуту и 16 секунд на каких языках ТС профессионально пишет, нам не удастся узнать. ТС обиделся и нас покинул. вовсе. |
Автор: LeonidPr 3.3.2012, 23:13 |
Ух-ты, отошел от компа минут на десять, а тут такой спор... Так вот, Jr13san, я так до конца не понял, к чему конкретно ваша претензия? Если к языку, тогда причем здесь GetWindowText - это к WinAPI, если к GetWindowText, тогда причем здесь C++? Если вам не нравится, как ведет себя GetWindowText, предлагаю написать функцию-обертку, которая будет выдавать вам результат в том виде, в каком вам хочется. Может вернуть char*, может string. Вы напишите конкретно, в чем вопрос, может сможем помочь... |
Автор: bsa 3.3.2012, 23:14 |
Jr13san, ты языка то не знаешь. Во-первых, обозвал язык С языком С++. Во-вторых, удивительно, как у тебя программа вообще компилируется, так как "главная функция, загружается самая первая" обязана возвращать int. В-третьих, ты вляпался в WinAPI и клянешь язык. Ты не думал, что printf работает исключительно с char. А с TCHAR работает _tprintf. Так как TCHAR в зависимости от настроек проекта может быть как char, так и wchar_t. Добавлено через 5 минут и 4 секунды Затем, чтобы было проще. HWND несет больше смысла, чем void*. А DWORD гарантирует 32-хбитность. В С99, кстати, были введены аналогичные типы: uint8_t, uint16_t, uint32_t, uint64_t... |