Как передать параметр в оконную процедуру?

Тема в разделе "WASM.WIN32", создана пользователем KingT, 8 фев 2019.

  1. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Добрый день.
    Когда то давно написал графическую обвертку вокруг WinAPI и уже много лет пользуюсь.
    Система простая.
    Есть базовый класс окна. Оконная процедура обьявлена в нем как статический метод.
    При создании окна (CreateWindow) последним параметром передается указатель на обьект окна.
    В оконной процедуре по сообщению WM_CREATE этот параметр извлекается и прописывается в окно функцией SetWindowLong. Получив обьект оконная процедура вызывает виртуальный обработчик сообщения который переопределяется в наследованном классе.
    Все меня устраивало до сегодняшнео времени.
    Потребовалось внести поддержку MDI интерфейса.
    Оконную процедуру я решил оставить ту же самую но пришлось ee немного доработать.
    Столкнулся с такой подставой от мелкомягких. Оказалось что WM_CREATE это не первое сообщение которое получает окно при создании. До него приходят еще несколько. Понятно что оконная процедура во время прихода их нормально обработать не может так как адрес обьекта еще не получен и виртуально вызвать обработчик сообщения не получится. Для MDI окна это критично поэтому надо уже по первому сообщению иметь в оконной процедуре адрес обьекта. Как это сделать средствами WInAPI я не знаю.
    Я выкрутился при помощи флага и обьекта "событие" (CreateEvent). Но мне самому такой подход не очень нравится.
    Может есть способ передать каким то образом указатель в оконную процедуру чтоб она смогла его получить в первом сообщении?
     
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    WM_NCCREATE
     
  3. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Нет гарантии что это сообщение прийдет первым. У меня сейчас первое сообщение которое приходит WM_GETMINMAXINFO
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Поставь фильтр(gui hook's).
     
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Можно попробовать создать окно с голым пустым обработчиком, а потом SetWindowLong'ом с GWL_WNDPROC пересадить на основной. Возможно даже GWL_USERDATA с нужным указателем на объект (установленным в первом обработчике) при этом сохранится.
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    f13nd,

    > SetWindowLong

    Эта апи регистрирует(транслирует) глобальный параметр. Те это нужно для работы между апп(IPC). Если же эту апи кто то использует для обмена данными в своём апп, то следует закрыть компилер и занятся чем то другим.
     
  7. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Я точно таким же способом, описанным в первом посте, своим окнам указатель на буфер и передаю. Способ изящный, прекрасно работает. Можешь только порадоваться, что в число моих пользователей не входишь, если тебя это утешит.
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    в этом инжекте передается указатель на ком интерфейс, который затем вызывается... если просто передавать указатель на данные, то есть ничего не запускать на исполнение, а просто читать их, то тут не будет такой уязвимости...
    --- Сообщение объединено, 9 фев 2019 ---
    можно сделать либо глобальную, либо тредлокал (если нужно создавать несколько таких окон в разных потоках) переменную и установить ей значение твоего буффера до вызова криейтвиндоу...
     
    KingT нравится это.
  9. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Это зависит от самих данных.

    Можно поставить хук (WH_CBT) в своем процессе и ловить HCBT_CREATEWND.
     
  10. sty

    sty Member

    Публикаций:
    0
    Регистрация:
    2 фев 2019
    Сообщения:
    102
    Thetrik, хотел написать вам в личку, а доступ закрыт. Как можно с вами связаться?
     
  11. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    sty, у меня вроде все открыто, пишите сюда.
     
  12. sty

    sty Member

    Публикаций:
    0
    Регистрация:
    2 фев 2019
    Сообщения:
    102
    Видимо, потому, что не прошло 30 дней после моей регистрации. Говорят, что потом открывается доступ к каким-то ресурсам и видимо на доступ в личку это тоже влияет. Если кто-то первый пишет мне в личку, то вроде все работает и доступ открыт.

    Я, во-первых, хотел вам сказать спасибо за ваш уникальный VST-плагин на FASM ассемблере. Он хоть и простой , но по-моему, должен помочь более глубокому пониманию работы VST-плагинов. Я на нем хочу попробовать поэксперементировать с реверсингом, чтобы потом перенести результаты на другие более сложные плагины, на которые нет исходников.

    Но у меня почему-то хост программы (Cubase и т.п) не видят ваш плагин. Так он компилируется, вроде все в норме, но вот хосты его (DLL) не видят. В чем может быть проблема?

    И еще хотел спросить ваше мнение. Как вы думаете, насколько это сложно в плане времязатраты и прочего - реверсить чужие плагины, чтобы получить более-менее похожий C/C++ код. И насколько реально и какова сложность найти и отреверсить какую-нибудь часть VST-плагина? Например, какой-нибудь фильтр или что-то еще. Может, на ваш взгляд, проще написать свой код с ноля, чем связываться с этим?
     
  13. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    А битность хоста совпадает? Можно попробовать поменять Main на VSTPluginMain или main (некоторые хосты не понимают Main, у меня все понимали).
    upload_2019-2-10_10-19-2.png
    Ну я бы не стал полностью реверсить плагин, только нужный алгоритм. Отыскать не составит труда, т.к. интерфейс документирован, конечно еще от сложности самого плагина зависит.
    Опять-таки, зависит от плагина, а интерфейс документирован. В самом простом случае можно просто отключить ненужные фичи у плагина, и смотреть по цепочке хост->ProcessReplacing. Там уже видно будет где идет обработка нужной части. Я к примеру извлекал нужные реализации интересных мне фильтров из CamelPhat - ничего сложного. Тоже самое с правкой, к примеру мне как-то понадобился один VST с нестандартным строем (микротонал), правкой определенных байтов плагин легко перестраивается под другой размер.
    Ну тут все конечно зависит от способностей. Если какая-то реализация эффекта известна, то нет смысла ее реверсить, только что-то неизвестное и не документированное.
     
    sty нравится это.
  14. sty

    sty Member

    Публикаций:
    0
    Регистрация:
    2 фев 2019
    Сообщения:
    102
    Вот как раз такие обстоятельства и заставляют порой встать на путь воровства реверсинга :)

    Thetrik, у меня к вам просьба - пошлите мне в личку какое-нибудь сообщение. Что-нибудь типа: 1234 :), а я потом в случае необходимости попробую послать на него ответ.

    Спасибо вам ОГРО-О-О-ОМНОЕ :), очень меня обнадежил ваш ответ, а то, думаю, потратишь время и все впустую. А людей которые знакомы с этим не по наслышке, по-моему, только вы один. Мне один программист, который, видимо, слышал звон... сказал примерно следующее. Представь, говорит, что тебе дали задание пересадить дерево, но есть одна особенность - у этого дерева длина корней несколько десятков километров.
     
  15. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Отписал.
     
  16. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    >>Я точно таким же способом, описанным в первом посте, своим окнам указатель на буфер и передаю. Способ изящный, прекрасно работает.

    Способ изящный но корректно отрабатывает если WM_CREATE первый. Если нет то первые сообщения до него таким способом не обработать своими методами. У меня так давно было сделано но с внедрением поддержки MDI интерфейса возникли проблемы.

    >>можно сделать либо глобальную, либо тредлокал (если нужно создавать несколько таких окон в разных потоках) переменную и установить ей значение твоего буффера до вызова криейтвиндоу...

    Вот пока как то так и сделал временно. Посмотрю хуки. WH_CBT вроде то что нужно.
    Посмотрю как эта проблема решена в библиотеке vxWidgets. В последнее время присматриваюсь к ней.

    Смотрю тут VST плагины народ ковыряет. Пользуясь случаем хочу спросить. Какими библиотеками отрисовываются все эти хитрые кнопочки переключатели, стрелочки в vst плагинах для музыкантов?
     
  17. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    сам ни VST ни DAW никогда не писал, но знаю, что есть классная кроссплатформенная библиотека на плюсах, которая часто используется для интерфейсов во всяческих плагинах: https://juce.com/ - на ней же написано клевая DAW: https://www.tracktion.com/ ... если кодишь на плюсах, то будет вполне себе подходящий вариант...
     
  18. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Да чем хочешь, в VSTGUI там стандартный набор функций. А там хоть WINAPI хоть Cairo хоть что угодно можешь использовать.