MFC - как подправить ресурсы
От: nobody1985  
Дата: 16.12.16 03:23
Оценка:
Есть бинарник программы написаной на C++/MFC ( исходников нет )
Внутри есть диалоговое окно , в котором есть комбо-бох — можно ли в этом комбо-боксе подправить пару значений в выпадающем списке, не имея исходников?
Где вообще данные выпадающего списка комбо-бокса хранятся? В ресурсах?
Re: MFC - как подправить ресурсы
От: SаNNy Россия  
Дата: 16.12.16 05:13
Оценка:
Здравствуйте, nobody1985, Вы писали:

N>Есть бинарник программы написаной на C++/MFC ( исходников нет )

N>Внутри есть диалоговое окно , в котором есть комбо-бох — можно ли в этом комбо-боксе подправить пару значений в выпадающем списке, не имея исходников?
N>Где вообще данные выпадающего списка комбо-бокса хранятся? В ресурсах?

Зависит от программы, возможно значения прописаны в коде или вычисляются динамически.
Ресурсы программы можно смотреть и редактировать в Visual Studio открыв с помощью нее exe файл.
Re: MFC - как подправить ресурсы
От: Pavel Dvorkin Россия  
Дата: 16.12.16 14:17
Оценка:
Здравствуйте, nobody1985, Вы писали:


N>Где вообще данные выпадающего списка комбо-бокса хранятся? В ресурсах?


Там, откуда их взял код, добавляющий эти значения. Чего-то подобного привязке данных к комбобоксу помимо явно написанного кода AFAIK в MFC нет
Но, может быть, и в ресурсах, например в. STRINGTABLE
With best regards
Pavel Dvorkin
Re[2]: MFC - как подправить ресурсы
От: nobody1985  
Дата: 16.12.16 16:52
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, nobody1985, Вы писали:



N>>Где вообще данные выпадающего списка комбо-бокса хранятся? В ресурсах?


PD>Там, откуда их взял код, добавляющий эти значения. Чего-то подобного привязке данных к комбобоксу помимо явно написанного кода AFAIK в MFC нет

PD>Но, может быть, и в ресурсах, например в. STRINGTABLE

Т.е. кроме как вызвать CComboBox::AddString других способов заполнить выпадающий список нет?
Я давно с MFC не работал, но вроде там можно было статические строчки прямо в визуальном дизайнере Visual studio в комбо-бокс забить. Хотя может и ошибаюсь.
Re[3]: MFC - как подправить ресурсы
От: Alexander G Украина  
Дата: 16.12.16 17:34
Оценка:
Здравствуйте, nobody1985, Вы писали:

N>Т.е. кроме как вызвать CComboBox::AddString других способов заполнить выпадающий список нет?

N>Я давно с MFC не работал, но вроде там можно было статические строчки прямо в визуальном дизайнере Visual studio в комбо-бокс забить. Хотя может и ошибаюсь.

Можно. Но мало кто этим пользуется.

Начнём с того, что приложение может хранить внутри себя массив каких-либо объектов, и в комбо только его отражение, тогда посторонние элементы приведут к непредсказуемой работе.

А если приложение действительно может похендлить левые элементы, то проще их добавить через CB_ADDSTRING или прочие сообщения.

То есть, я бы сначала проверил, может ли оно вообще принять новую строку.

Можно попробовать сначала отправить SendMessage хоть из другого процесса ( CB_ADDSTRING < WM_USER ), предварительно подсмотрев HWND в C++, чтобы убедиться, что ничего не развалится.

SendMessageW((HWND)0x2047A, CB_ADDSTRING, 0, (LPARAM)L"Test"); // 0x2047A — хендл комбо


Если не разваливается, то в качестве перманентного решения могу предложить запускалку, которая бы создавала процес, и вешала SetWindowsHookEx на его UI тред, в хуке мониторить появление нужного комбо и подменять контент.
Русский военный корабль идёт ко дну!
Re[4]: MFC - как подправить ресурсы
От: Stanislav V. Zudin Россия  
Дата: 16.12.16 17:58
Оценка: +1
Здравствуйте, Alexander G, Вы писали:

AG>Можно попробовать сначала отправить SendMessage хоть из другого процесса ( CB_ADDSTRING < WM_USER ), предварительно подсмотрев HWND в C++, чтобы убедиться, что ничего не развалится.


AG>SendMessageW((HWND)0x2047A, CB_ADDSTRING, 0, (LPARAM)L"Test"); // 0x2047A — хендл комбо


Из другого процесса не получится. Указатель на строку система маршалить не будет. Целевое окно вместо строки получит мусор.
_____________________
С уважением,
Stanislav V. Zudin
Re[5]: MFC - как подправить ресурсы
От: Alexander G Украина  
Дата: 16.12.16 18:09
Оценка: +1
Здравствуйте, Stanislav V. Zudin, Вы писали:


SVZ>Из другого процесса не получится. Указатель на строку система маршалить не будет. Целевое окно вместо строки получит мусор.


Будет. Я ж специально уточнил CB_ADDSTRING меньше WM_USER.
Правило простое: всё, что меньше WM_USER — маршалится, хотя самые известные из таких сообщений WM_COPYDATA и WM_SETTEXT
Русский военный корабль идёт ко дну!
Re: MFC - как подправить ресурсы
От: Stanislav V. Zudin Россия  
Дата: 16.12.16 18:10
Оценка:
Здравствуйте, nobody1985, Вы писали:

N>Где вообще данные выпадающего списка комбо-бокса хранятся? В ресурсах?


В ресурсах MFC может добавлять секцию DLGINIT, из которой инициализирует контрол, но коллеги правы, чаще списки заполняются в рантайме.
А в рантайме строки могут браться откуда угодно — из ресурсов, из внешних файлов, из секции с данными и проч.
_____________________
С уважением,
Stanislav V. Zudin
Re: MFC - как подправить ресурсы
От: VladFein США  
Дата: 16.12.16 18:15
Оценка: +1
Здравствуйте, nobody1985, Вы писали:

N>Внутри есть диалоговое окно , в котором есть комбо-бох — можно ли в этом комбо-боксе подправить пару значений в выпадающем списке, не имея исходников?


Кто знает как этот combo box использует видимый лист?
Например, если это Time Zone, и Вы поправите текст — всё будет ОК.
"(UTC+03:00) Moscow, St. Petersburg"
замените на
"(UTC+03:00) Москва, Ленинград"

Но если вы замените "+03:00" на "+07:00" — удачи!
Re[5]: MFC - как подправить ресурсы
От: VladFein США  
Дата: 16.12.16 18:17
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

AG>>SendMessageW((HWND)0x2047A, CB_ADDSTRING, 0, (LPARAM)L"Test"); // 0x2047A — хендл комбо


SVZ>Из другого процесса не получится. Указатель на строку система маршалить не будет. Целевое окно вместо строки получит мусор.


+1
Так просто — не получится. Но можно писать/читать память того процесса.
Re[6]: MFC - как подправить ресурсы
От: Alexander G Украина  
Дата: 16.12.16 18:33
Оценка: 9 (1)
Здравствуйте, VladFein, Вы писали:

AG>>>SendMessageW((HWND)0x2047A, CB_ADDSTRING, 0, (LPARAM)L"Test"); // 0x2047A — хендл комбо


VF>Так просто — не получится. Но можно писать/читать память того процесса.


Для CB_ сообщений как раз при попытке самостоятельно маршалить не получится, т.к. система попытается повторно замаршалить.
Русский военный корабль идёт ко дну!
Re[6]: MFC - как подправить ресурсы
От: Stanislav V. Zudin Россия  
Дата: 16.12.16 18:39
Оценка: 6 (1) +2
Здравствуйте, 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
Re[7]: MFC - как подправить ресурсы
От: VladFein США  
Дата: 16.12.16 19:18
Оценка:
Здравствуйте, Alexander G, Вы писали:

VF>>Так просто — не получится. Но можно писать/читать память того процесса.


AG>Для CB_ сообщений как раз при попытке самостоятельно маршалить не получится, т.к. система попытается повторно замаршалить.


Спасибо, Вы правы.
Re[7]: MFC - как подправить ресурсы
От: Alexander G Украина  
Дата: 16.12.16 19:43
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Если бы всё было так просто...

SVZ>WM_SIZING, WM_MOVING тоже меньше WM_USER, однако указатели с этими сообщениями передаются как есть.

Да, похоже, что маршаллинг не сделали для всего, что меньше WM_USER, я заблуждался.
Но для CB_ADDSTRING — сделали.

Значит, правило такое: некоторые сообщения, которые меньше WM_USER, маршалятся системой.
Русский военный корабль идёт ко дну!
Re[2]: MFC - как подправить ресурсы
От: nobody1985  
Дата: 17.12.16 23:36
Оценка:
Здравствуйте, 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 раза больше )
Re[3]: MFC - как подправить ресурсы
От: Alexander G Украина  
Дата: 18.12.16 07:12
Оценка:
Здравствуйте, nobody1985, Вы писали:

N>Как раз в этом и цель — подправить текст в combo box(там числовые константы), чтобы немного изменить логику программы — выбранная числовая константа потом используется как множитель для неких вычислений ... нужно, грубо говоря, все константы в комбо-боксе на 2 умножить ( чтоб потом результат вычислений соответственно был в 2 раза больше )


Если combo box — это drop down + edit, т.е. можно вводить своё, то, скорее всего, всё получится.

Если combo box — это drop down list, то наиболее правдоподобны такие варианты:
1. Программа таки конвертирует текст в число, тогда всё получится.
2. Программа использует индекс элемента для обращения к массиву констант, тогда текст ни на что не повлияет
3. Программа хранит сами константы в item data, тогда текст ни на что не влияет, но через сообщения таки можно поменять не только текст, но и item data
Русский военный корабль идёт ко дну!
Re: MFC - как подправить ресурсы
От: MasterZiv СССР  
Дата: 26.12.17 14:47
Оценка:
Здравствуйте, nobody1985, Вы писали:

N>Есть бинарник программы написаной на C++/MFC ( исходников нет )

N>Внутри есть диалоговое окно , в котором есть комбо-бох — можно ли в этом комбо-боксе подправить пару значений в выпадающем списке, не имея исходников?

Можно.

N>Где вообще данные выпадающего списка комбо-бокса хранятся? В ресурсах?


Данные в ресурсах МОГУТ храниться, но это -- специальный формат ресурса, используемый только в MFC-приложениях, и могут быть проблемы с изменением ресурса в этом формате (он нестандартный)
Так храниться могут только статические данные, поэтому делается это очень редко. С вероятностью 90% эти данные загружаются в комбик в рантайме и в ресурсах их нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.