Есть бинарник программы написаной на C++/MFC ( исходников нет )
Внутри есть диалоговое окно , в котором есть комбо-бох — можно ли в этом комбо-боксе подправить пару значений в выпадающем списке, не имея исходников?
Где вообще данные выпадающего списка комбо-бокса хранятся? В ресурсах?
Здравствуйте, nobody1985, Вы писали:
N>Есть бинарник программы написаной на C++/MFC ( исходников нет ) N>Внутри есть диалоговое окно , в котором есть комбо-бох — можно ли в этом комбо-боксе подправить пару значений в выпадающем списке, не имея исходников? N>Где вообще данные выпадающего списка комбо-бокса хранятся? В ресурсах?
Зависит от программы, возможно значения прописаны в коде или вычисляются динамически.
Ресурсы программы можно смотреть и редактировать в Visual Studio открыв с помощью нее exe файл.
N>Где вообще данные выпадающего списка комбо-бокса хранятся? В ресурсах?
Там, откуда их взял код, добавляющий эти значения. Чего-то подобного привязке данных к комбобоксу помимо явно написанного кода AFAIK в MFC нет
Но, может быть, и в ресурсах, например в. STRINGTABLE
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, nobody1985, Вы писали:
N>>Где вообще данные выпадающего списка комбо-бокса хранятся? В ресурсах?
PD>Там, откуда их взял код, добавляющий эти значения. Чего-то подобного привязке данных к комбобоксу помимо явно написанного кода AFAIK в MFC нет PD>Но, может быть, и в ресурсах, например в. STRINGTABLE
Т.е. кроме как вызвать CComboBox::AddString других способов заполнить выпадающий список нет?
Я давно с MFC не работал, но вроде там можно было статические строчки прямо в визуальном дизайнере Visual studio в комбо-бокс забить. Хотя может и ошибаюсь.
Здравствуйте, nobody1985, Вы писали:
N>Т.е. кроме как вызвать CComboBox::AddString других способов заполнить выпадающий список нет? N>Я давно с MFC не работал, но вроде там можно было статические строчки прямо в визуальном дизайнере Visual studio в комбо-бокс забить. Хотя может и ошибаюсь.
Можно. Но мало кто этим пользуется.
Начнём с того, что приложение может хранить внутри себя массив каких-либо объектов, и в комбо только его отражение, тогда посторонние элементы приведут к непредсказуемой работе.
А если приложение действительно может похендлить левые элементы, то проще их добавить через CB_ADDSTRING или прочие сообщения.
То есть, я бы сначала проверил, может ли оно вообще принять новую строку.
Можно попробовать сначала отправить SendMessage хоть из другого процесса ( CB_ADDSTRING < WM_USER ), предварительно подсмотрев HWND в C++, чтобы убедиться, что ничего не развалится.
Если не разваливается, то в качестве перманентного решения могу предложить запускалку, которая бы создавала процес, и вешала SetWindowsHookEx на его UI тред, в хуке мониторить появление нужного комбо и подменять контент.
Здравствуйте, Alexander G, Вы писали:
AG>Можно попробовать сначала отправить SendMessage хоть из другого процесса ( CB_ADDSTRING < WM_USER ), предварительно подсмотрев HWND в C++, чтобы убедиться, что ничего не развалится.
AG>SendMessageW((HWND)0x2047A, CB_ADDSTRING, 0, (LPARAM)L"Test"); // 0x2047A — хендл комбо
Из другого процесса не получится. Указатель на строку система маршалить не будет. Целевое окно вместо строки получит мусор.
_____________________
С уважением,
Stanislav V. Zudin
SVZ>Из другого процесса не получится. Указатель на строку система маршалить не будет. Целевое окно вместо строки получит мусор.
Будет. Я ж специально уточнил CB_ADDSTRING меньше WM_USER.
Правило простое: всё, что меньше WM_USER — маршалится, хотя самые известные из таких сообщений WM_COPYDATA и WM_SETTEXT
Здравствуйте, nobody1985, Вы писали:
N>Где вообще данные выпадающего списка комбо-бокса хранятся? В ресурсах?
В ресурсах MFC может добавлять секцию DLGINIT, из которой инициализирует контрол, но коллеги правы, чаще списки заполняются в рантайме.
А в рантайме строки могут браться откуда угодно — из ресурсов, из внешних файлов, из секции с данными и проч.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, nobody1985, Вы писали:
N>Внутри есть диалоговое окно , в котором есть комбо-бох — можно ли в этом комбо-боксе подправить пару значений в выпадающем списке, не имея исходников?
Кто знает как этот combo box использует видимый лист?
Например, если это Time Zone, и Вы поправите текст — всё будет ОК.
"(UTC+03:00) Moscow, St. Petersburg"
замените на
"(UTC+03:00) Москва, Ленинград"
Здравствуйте, Stanislav V. Zudin, Вы писали:
AG>>SendMessageW((HWND)0x2047A, CB_ADDSTRING, 0, (LPARAM)L"Test"); // 0x2047A — хендл комбо
SVZ>Из другого процесса не получится. Указатель на строку система маршалить не будет. Целевое окно вместо строки получит мусор.
+1
Так просто — не получится. Но можно писать/читать память того процесса.
Здравствуйте, VladFein, Вы писали:
AG>>>SendMessageW((HWND)0x2047A, CB_ADDSTRING, 0, (LPARAM)L"Test"); // 0x2047A — хендл комбо
VF>Так просто — не получится. Но можно писать/читать память того процесса.
Для CB_ сообщений как раз при попытке самостоятельно маршалить не получится, т.к. система попытается повторно замаршалить.
Здравствуйте, Alexander G, Вы писали:
SVZ>>Из другого процесса не получится. Указатель на строку система маршалить не будет. Целевое окно вместо строки получит мусор.
AG>Будет. Я ж специально уточнил CB_ADDSTRING меньше WM_USER. AG>Правило простое: всё, что меньше WM_USER — маршалится, хотя самые известные из таких сообщений WM_COPYDATA и WM_SETTEXT
Если бы всё было так просто...
WM_SIZING, WM_MOVING тоже меньше WM_USER, однако указатели с этими сообщениями передаются как есть.
Что касается WM_COPYDATA, то это вообще отдельная история.
Во-первых, он специально предназначен для передачи данных между процессами, а во-вторых, "...The data being passed must not contain pointers or other references to objects not accessible to the application receiving the data...".
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Alexander G, Вы писали:
VF>>Так просто — не получится. Но можно писать/читать память того процесса.
AG>Для CB_ сообщений как раз при попытке самостоятельно маршалить не получится, т.к. система попытается повторно замаршалить.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Если бы всё было так просто... SVZ>WM_SIZING, WM_MOVING тоже меньше WM_USER, однако указатели с этими сообщениями передаются как есть.
Да, похоже, что маршаллинг не сделали для всего, что меньше WM_USER, я заблуждался.
Но для CB_ADDSTRING — сделали.
Значит, правило такое: некоторые сообщения, которые меньше WM_USER, маршалятся системой.
Здравствуйте, VladFein, Вы писали:
VF>Кто знает как этот combo box использует видимый лист? VF>Например, если это Time Zone, и Вы поправите текст — всё будет ОК. VF>"(UTC+03:00) Moscow, St. Petersburg" VF>замените на VF>"(UTC+03:00) Москва, Ленинград"
VF>Но если вы замените "+03:00" на "+07:00" — удачи!
Как раз в этом и цель — подправить текст в combo box(там числовые константы), чтобы немного изменить логику программы — выбранная числовая константа потом используется как множитель для неких вычислений ... нужно, грубо говоря, все константы в комбо-боксе на 2 умножить ( чтоб потом результат вычислений соответственно был в 2 раза больше )
Здравствуйте, nobody1985, Вы писали:
N>Как раз в этом и цель — подправить текст в combo box(там числовые константы), чтобы немного изменить логику программы — выбранная числовая константа потом используется как множитель для неких вычислений ... нужно, грубо говоря, все константы в комбо-боксе на 2 умножить ( чтоб потом результат вычислений соответственно был в 2 раза больше )
Если combo box — это drop down + edit, т.е. можно вводить своё, то, скорее всего, всё получится.
Если combo box — это drop down list, то наиболее правдоподобны такие варианты:
1. Программа таки конвертирует текст в число, тогда всё получится.
2. Программа использует индекс элемента для обращения к массиву констант, тогда текст ни на что не повлияет
3. Программа хранит сами константы в item data, тогда текст ни на что не влияет, но через сообщения таки можно поменять не только текст, но и item data
Здравствуйте, nobody1985, Вы писали:
N>Есть бинарник программы написаной на C++/MFC ( исходников нет ) N>Внутри есть диалоговое окно , в котором есть комбо-бох — можно ли в этом комбо-боксе подправить пару значений в выпадающем списке, не имея исходников?
Можно.
N>Где вообще данные выпадающего списка комбо-бокса хранятся? В ресурсах?
Данные в ресурсах МОГУТ храниться, но это -- специальный формат ресурса, используемый только в MFC-приложениях, и могут быть проблемы с изменением ресурса в этом формате (он нестандартный)
Так храниться могут только статические данные, поэтому делается это очень редко. С вероятностью 90% эти данные загружаются в комбик в рантайме и в ресурсах их нет.