Трабл вот в чем. Подгружаетьса dllка, в ее главной функции создаетьса тред. Тред создает окно. Как сделать еще несколько таких окон? Создавать новый тред? Я подгрузил еще такую же дллку, она создала такоеже окно, но они оба начали глючить.
"Глючить" это как, - убегают от мышки??? Толи проблема слишком простая, толи ты плохо объясняешь. Переведи вопрос нормально, - по-русски, без всяких тредов, траблов... Вообщем, для того чтобы создать несколько копий окна, класс который регистрируется в DllMain, нужно создать специальную функцию для экспорта, которая будет создавать эти окна: ; Функция клонирования окна CloneWindow proc ;... invoke CreateWindowEx, ;... CloneWindow endp ; Функция входа в библиотеку DllMain proc ;... invoke RegisterClassEx, ;... DllMain endp END DllMain
Нет, такой способ не пройдет. То есть пройдет, но он не решит проблему. Вопрос стоит переформулировать, так как я докопался почему ети окна глючат. Причина вот в чем. В секции '.data'(пишу на fasm) хранятьса позиции и размеры некоторых контролов в окне. Когда окно получает сообщение WM_SIZE, оконная процедура и использует ети переменные. Но если создать несколько окон, то их оконные процедуры будут использовать одни и те же данные. Как создавать для каждого окна свою копию етих данных? Вот блин. Кажетьса придумал . Где-то было написано, при регистрации оконного класа там можно указать количество дополнительных байт, которые будут следовать после 'window instance'. Насколько я понял, указателем на етот window instance будет значение, возвращаемое CreateWindow? Самый нормальный совет, который я когда-либо слышал: "если вы зашли в тупик при решении проблемы, один из лучших способов выйти из него — это объяснить проблему приятелю. Почти всегда решение возникает в вашей голове посредине объяснения"(Ален И. Голуб, "Веревка достаточной длины, чтобы... выстрелить себе в ногу")
CreateWindow возвращает hWnd окна, а не дополнительные байты. Можно собрать все переменные, относящиеся к одному окну в структуру, и каждому создаваемому окну сделать по такой структуре, чтобы они не путались. Кусочек памяти под структуру выделять динамически при помощи VirtualAlloc или HeapAlloc. А окна пусть таскают с собой указатель на свои структуры. Таскать можно в виде элемента GWL_USERDATA. Соответственно прицепить указатель на структуру к окну, и считать указатель можно SetWindowLong/GetWindowLong
А не проще ли для каждого создваемого окна иметь локальные данные/переменные и не заморачиваться с выделением памяти и указателем на структуру???
Вышел из процедуры - и все локальные потерялись. И при входе в процедуру где брать значения, которыми инициализировать локальные переменные? Вызывать для каждого элемента GetClientRect? А если переменные не получить через апи? Т.е. какие-то негеометрические или невизуальные переменные?