Добрый день. Когда то давно написал графическую обвертку вокруг WinAPI и уже много лет пользуюсь. Система простая. Есть базовый класс окна. Оконная процедура обьявлена в нем как статический метод. При создании окна (CreateWindow) последним параметром передается указатель на обьект окна. В оконной процедуре по сообщению WM_CREATE этот параметр извлекается и прописывается в окно функцией SetWindowLong. Получив обьект оконная процедура вызывает виртуальный обработчик сообщения который переопределяется в наследованном классе. Все меня устраивало до сегодняшнео времени. Потребовалось внести поддержку MDI интерфейса. Оконную процедуру я решил оставить ту же самую но пришлось ee немного доработать. Столкнулся с такой подставой от мелкомягких. Оказалось что WM_CREATE это не первое сообщение которое получает окно при создании. До него приходят еще несколько. Понятно что оконная процедура во время прихода их нормально обработать не может так как адрес обьекта еще не получен и виртуально вызвать обработчик сообщения не получится. Для MDI окна это критично поэтому надо уже по первому сообщению иметь в оконной процедуре адрес обьекта. Как это сделать средствами WInAPI я не знаю. Я выкрутился при помощи флага и обьекта "событие" (CreateEvent). Но мне самому такой подход не очень нравится. Может есть способ передать каким то образом указатель в оконную процедуру чтоб она смогла его получить в первом сообщении?
Нет гарантии что это сообщение прийдет первым. У меня сейчас первое сообщение которое приходит WM_GETMINMAXINFO
Можно попробовать создать окно с голым пустым обработчиком, а потом SetWindowLong'ом с GWL_WNDPROC пересадить на основной. Возможно даже GWL_USERDATA с нужным указателем на объект (установленным в первом обработчике) при этом сохранится.
f13nd, > SetWindowLong Эта апи регистрирует(транслирует) глобальный параметр. Те это нужно для работы между апп(IPC). Если же эту апи кто то использует для обмена данными в своём апп, то следует закрыть компилер и занятся чем то другим.
Я точно таким же способом, описанным в первом посте, своим окнам указатель на буфер и передаю. Способ изящный, прекрасно работает. Можешь только порадоваться, что в число моих пользователей не входишь, если тебя это утешит.
в этом инжекте передается указатель на ком интерфейс, который затем вызывается... если просто передавать указатель на данные, то есть ничего не запускать на исполнение, а просто читать их, то тут не будет такой уязвимости... --- Сообщение объединено, 9 фев 2019 --- можно сделать либо глобальную, либо тредлокал (если нужно создавать несколько таких окон в разных потоках) переменную и установить ей значение твоего буффера до вызова криейтвиндоу...
Видимо, потому, что не прошло 30 дней после моей регистрации. Говорят, что потом открывается доступ к каким-то ресурсам и видимо на доступ в личку это тоже влияет. Если кто-то первый пишет мне в личку, то вроде все работает и доступ открыт. Я, во-первых, хотел вам сказать спасибо за ваш уникальный VST-плагин на FASM ассемблере. Он хоть и простой , но по-моему, должен помочь более глубокому пониманию работы VST-плагинов. Я на нем хочу попробовать поэксперементировать с реверсингом, чтобы потом перенести результаты на другие более сложные плагины, на которые нет исходников. Но у меня почему-то хост программы (Cubase и т.п) не видят ваш плагин. Так он компилируется, вроде все в норме, но вот хосты его (DLL) не видят. В чем может быть проблема? И еще хотел спросить ваше мнение. Как вы думаете, насколько это сложно в плане времязатраты и прочего - реверсить чужие плагины, чтобы получить более-менее похожий C/C++ код. И насколько реально и какова сложность найти и отреверсить какую-нибудь часть VST-плагина? Например, какой-нибудь фильтр или что-то еще. Может, на ваш взгляд, проще написать свой код с ноля, чем связываться с этим?
А битность хоста совпадает? Можно попробовать поменять Main на VSTPluginMain или main (некоторые хосты не понимают Main, у меня все понимали). Ну я бы не стал полностью реверсить плагин, только нужный алгоритм. Отыскать не составит труда, т.к. интерфейс документирован, конечно еще от сложности самого плагина зависит. Опять-таки, зависит от плагина, а интерфейс документирован. В самом простом случае можно просто отключить ненужные фичи у плагина, и смотреть по цепочке хост->ProcessReplacing. Там уже видно будет где идет обработка нужной части. Я к примеру извлекал нужные реализации интересных мне фильтров из CamelPhat - ничего сложного. Тоже самое с правкой, к примеру мне как-то понадобился один VST с нестандартным строем (микротонал), правкой определенных байтов плагин легко перестраивается под другой размер. Ну тут все конечно зависит от способностей. Если какая-то реализация эффекта известна, то нет смысла ее реверсить, только что-то неизвестное и не документированное.
Вот как раз такие обстоятельства и заставляют порой встать на путь воровства реверсинга Thetrik, у меня к вам просьба - пошлите мне в личку какое-нибудь сообщение. Что-нибудь типа: 1234 , а я потом в случае необходимости попробую послать на него ответ. Спасибо вам ОГРО-О-О-ОМНОЕ , очень меня обнадежил ваш ответ, а то, думаю, потратишь время и все впустую. А людей которые знакомы с этим не по наслышке, по-моему, только вы один. Мне один программист, который, видимо, слышал звон... сказал примерно следующее. Представь, говорит, что тебе дали задание пересадить дерево, но есть одна особенность - у этого дерева длина корней несколько десятков километров.
>>Я точно таким же способом, описанным в первом посте, своим окнам указатель на буфер и передаю. Способ изящный, прекрасно работает. Способ изящный но корректно отрабатывает если WM_CREATE первый. Если нет то первые сообщения до него таким способом не обработать своими методами. У меня так давно было сделано но с внедрением поддержки MDI интерфейса возникли проблемы. >>можно сделать либо глобальную, либо тредлокал (если нужно создавать несколько таких окон в разных потоках) переменную и установить ей значение твоего буффера до вызова криейтвиндоу... Вот пока как то так и сделал временно. Посмотрю хуки. WH_CBT вроде то что нужно. Посмотрю как эта проблема решена в библиотеке vxWidgets. В последнее время присматриваюсь к ней. Смотрю тут VST плагины народ ковыряет. Пользуясь случаем хочу спросить. Какими библиотеками отрисовываются все эти хитрые кнопочки переключатели, стрелочки в vst плагинах для музыкантов?
сам ни VST ни DAW никогда не писал, но знаю, что есть классная кроссплатформенная библиотека на плюсах, которая часто используется для интерфейсов во всяческих плагинах: https://juce.com/ - на ней же написано клевая DAW: https://www.tracktion.com/ ... если кодишь на плюсах, то будет вполне себе подходящий вариант...
Да чем хочешь, в VSTGUI там стандартный набор функций. А там хоть WINAPI хоть Cairo хоть что угодно можешь использовать.