![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Jr13san |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Сколько не программирую на различных языках, но на с++ не перестаю удивляться. Иногда становится просто тошно от того, что ты знаешь как запрограммировать определённое событие, всё для этого есть, но синтаксис не позволяет тебе двигаться дальше. Такая же ситуация и здесь.
Пересмотрел пару десятков примеров вызова функции GetWindowText(), но ни один не работает. У меня есть только предположение о том, что я что-то упустил. Я сомневаюсь, что те части кода были обманом. Поэтому прошу помочь разобраться.
Ещё получилось выцепить ASCII символы из строки. Сейчас я не помню как тогда я написал. Но пришлось бы изобретать функцию преобразования всего этого в строку. А зачем передавать строку в непонятном виде, чтобы её нужно было потом преобразовывать? И это называется упрощение работы программисту? Даже нет слов. И грустно и смешно... Почему разработчики не могли сделать такую конструкцию? :
Наверное понравилось извращаться с переправкой данных за место того, чтобы этим занимался программист. Зачем наделали столько типов, что приходится на каждый вызов функции преобразовывать её выходные данные. Неужели нельзя было обойтись стандартными типами: short, int, long, byte, bool, string, double, и т.д. Зачем больше? Вместо того, чтобы работать над программным кодом, мне приходится искать преобразование типов или узнавать что это за таинственные типы параметров, передающихся в вызываемую функцию. Язык должен быть интуитивно понятным и простым в освоении, а не извращённым до нельзя. Результат самостоятельной работы над ошибками: Так как в проекте используется поддержка Unicode строк, то код выглядит следующим образом:
Чтобы проверить результат работы программы, нужно открыть окно блокнота(Notepad.exe) и запустить программу. Результат работы программы таков: 1. Получить идентификатор заголовка окна Блокнота. 2. По идентификатору окна получить обратно название окна. 3. Сравнить полученное название окна с заранее известным названием окна. Это сообщение отредактировал(а) Jr13san - 4.3.2012, 11:50 |
||||||
|
|||||||
LeonidPr |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 17.2.2012 Где: г. Чебоксары Репутация: нет Всего: 1 |
А какое отношение к C++ имеет функция GetWindowText?
Это одна из функций API в Windows, а в хедэре просто описан её прототип, чтобы вы могли её вызывать. Если бы Microsoft сделала эту функцию такой:
то использовали бы её так, как вы написали:
Мне кажется (знатоки, поправьте пожалуйста, если я не прав), что первый вариант был выбран из тех соображений, что вы должны будете явно выделить буфер для строки и следовательно будете следить, что бы память была освобождена после использования. Во втором же случае, система сама неявно (для того, кто пользуется функцией) должна выделить память под возвращаемую строку. Следовательно, легко забыть освободить её, что может привести к неприятностям. Это сообщение отредактировал(а) LeonidPr - 3.3.2012, 21:40 --------------------
pkunzip.zip |
||||
|
|||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
А что тут очищать то? Может быть ещё вручную?
Я думаю так.. Функция возвращает "текст", а все переданные в неё параметры должны по идее сами удалиться из памяти после завершения работы этой функции. Но для этого должен существовать определённый "чистильщик". Или я не правильно мыслю в силу других языков, работающих таким алгоритмом? Это сообщение отредактировал(а) Jr13san - 3.3.2012, 22:04 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
причину нужно искать в себе. плохому танцору, в курсе что мешало? ;) тебе не понять. к тому же, там ошибка. в общем, тему на свалку. |
|||
|
||||
LeonidPr |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 17.2.2012 Где: г. Чебоксары Репутация: нет Всего: 1 |
Что бы функция вернула текст, она должна выделить память под него. Вы с этим текстом поработали (вывели на консоль например). Теперь надо освободить выделенную под него память. Кто это будет делать? Я так понимаю вы, в C++ нет стандартного сборщика мусора.
--------------------
pkunzip.zip |
|||
|
||||
boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
угу. правило такое есть: память нужно освобождать на то же уровне, на котором она была выделена. нет такого типа ![]()
страшно жить. скажи, на каких ты там языках программируешь? только по подробнее ;) есть такое мнение среди программистов: после изучения языка "Х", моцг напрочь отказывается самостоятельно мыслить. Это сообщение отредактировал(а) boostcoder - 3.3.2012, 22:21 |
||||
|
|||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Как раз-таки здесь причина в самом языке программирования. Скорей всего тебе не понять мою мысль. И вот наверное твоя же фраза это подтверждает:
Ага, куда же ей ещё. Жди, сейчас мусоровоз подъедет. Если тебе тема не интересна, то это не значит, что всё тут напрасно. Я пытаюсь разобраться с помощью людей, которые разбираются в данном языке и готовы как-то помочь. А от тебя одни сплошные комментарии, а толку 0. Даже если этого сборщика нет, это не беда, это лишь отсутствие автоматизации данного языка. Дело в том, что функция возвращает не пойми что. Попробуйте написать что-то работающее на основе того, что я написал. в c++ может быть и нет, но в других ЯП есть тип string и он на много удобнее и проще чем char, TCHAR, WCHAR, ZLUPECHAR. Извините за последний "агрессивно-вымышленный" тип, но таковы реалии. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
в данном случае нет, но дело даже не в этом. Если тебе не нравится язык, зачем ты на нём пишешь?
-------------------- Обижено школьников: 8 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
тот код что ты привел - Си. в с++ как раз таки строки есть. это лишнее подтверждение моих слов ![]() так на каких ты там языках пишешь? |
|||
|
||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
ты не понимаешь одну из основ самосовершенствования: критика всего вокруг себя но только не себя - обрекает тебя на постоянное совершение того, что ты сейчас делаешь. а именно - говорить что что-то не так и не эдак, вместо того чтоб признать, что ты банально читать не умеешь. ибо для этой функции есть дока, и любой адекватный человек, за несколько минут разберется с тремя аргументами. по этому, снова спрошу: плохому танцору, знаешь что мешает? Добавлено @ 22:58 для танкистов, повторяю: это Си! Это сообщение отредактировал(а) boostcoder - 3.3.2012, 23:01 |
|||
|
||||
marsh123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.6.2008 Репутация: нет Всего: нет |
Сообщил в Microsoft гениальную идею автора, пообещали, что исправят.
![]() |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
marsh123, сообщи ТСу адресок. чтоб в следующий раз он сразу им писал
![]() |
|||
|
||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Ок. Я так понял, помощи я здесь не найду.
Прощу прощение у адм. за пустую созданную тему. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
А скорость написания выше разве что по сравнению с асмом, лол. Нет никаких причин писать user-mode приложения для windows на плюсах или чистом си. Это не нужно, для этого есть более удобные инструменты. А проблема описанная в оппосте связана даже не с языком, а с тем что ты не въехал в винапи, но пытаешься его использовать. Он совершенно сишный, со всей вытекающей ручной работой Это сообщение отредактировал(а) bems - 3.3.2012, 23:05 -------------------- Обижено школьников: 8 |
|||
|
||||
marsh123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.6.2008 Репутация: нет Всего: нет |
Как Вы, кстати, определили, что тс пишет на Си, просто интересно, такой код без проблем и на C++ должен работать. Неужели из-за того, что он printf использует? Это сообщение отредактировал(а) marsh123 - 3.3.2012, 23:05 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
потому что в его коде нет ничего от плюсов.
Добавлено через 1 минуту и 16 секунд на каких языках ТС профессионально пишет, нам не удастся узнать. ТС обиделся и нас покинул. вовсе. |
|||
|
||||
LeonidPr |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 17.2.2012 Где: г. Чебоксары Репутация: нет Всего: 1 |
Ух-ты, отошел от компа минут на десять, а тут такой спор...
Так вот, Jr13san, я так до конца не понял, к чему конкретно ваша претензия? Если к языку, тогда причем здесь GetWindowText - это к WinAPI, если к GetWindowText, тогда причем здесь C++? Если вам не нравится, как ведет себя GetWindowText, предлагаю написать функцию-обертку, которая будет выдавать вам результат в том виде, в каком вам хочется. Может вернуть char*, может string. Вы напишите конкретно, в чем вопрос, может сможем помочь... --------------------
pkunzip.zip |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
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... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |