| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB6 > Приложение и его формы |
| Автор: DrBoom 25.8.2009, 11:42 |
| Суть проблемы такая. Есть приложение, написанное на Delphi. Есть DLL для этого приложения, написанная на VB6. Приложение имеет основную форму и мы знаем её имя. В DLL получаем дескриптор (hWnd) основного окна по имени окна, а после добавляем в неё дочернее окно нашей DLL с помощью SetParent. Проблема следующая: как определить, что окно принадлежит именно нашему приложению, а не, к примеру, второй запущенной копии этого же приложения. Пытался сравнивать дескрипторы инстанции (hInstance) окон, с помощью GetWindowLong, однако они не совпадают (хотя приложение одно и тоже). Есть ли иные способы провернуть проверку? |
| Автор: DrBoom 25.8.2009, 13:38 |
| Akina, ну если бы было не нормально, то я бы и не задумывался об этом. Программа может быть запущена сколько угодно раз, ибо с ней (даже с одним экземпляром) могут работать несколько пользователей и она поддерживает различные профили. От проверяемого родительского окна известно только имя класса и его дескриптор. |
| Автор: Akina 25.8.2009, 13:54 |
| Если бы это было ненормально, мы бы искали способ запретить повторный запуск (впрочем, он известен). А так... я могу предложить несколько вариантов решения. Например, перед отдачей дочернего окна исходному процессу заполнить Tag этого окна необходимой нам информацией - например хендлы свой и нового родителя (Дельфовой программы). Тогда ты сможешь не только понимать, от какого экземпляра своей программы отдано окно, но и какому экземпляру Дельфийского приложения (вдруг их тоже можно стартовать несколько...). |
| Автор: DrBoom 25.8.2009, 14:04 |
| Akina, задача ещё сложнее, чем кажется. У нас в вооружении может быть только дескриптор и имя класса окна |
| Автор: Akina 25.8.2009, 14:47 |
Не понял... ты пишешь приложение на VB6 и в то же время не имеешь доступа к его исходникам? Добавлено через 13 минут и 53 секунды Или ты пишешь ТРЕТЬЕ приложение? |
| Автор: DrBoom 25.8.2009, 15:02 |
| Akina, приложение написано на делфи и уже готово. Исходников нет. Для этого приложения я пишут дополнение в виде DLL, которая подключается к этому приложению. У приложения я отлавливаю окно. Для этого окна я делаю дочернее окно со своими элементами. Вот возникает вопрос о проверке что окно действительно то, которое нам нужно. |
| Автор: Akina 25.8.2009, 15:32 | ||||
Окно, которое сформировано приложением на Дельфи и к которому нужно присоединить дочернее окно из DLL на VB6, надо определить из этой же DLL на VB6?
Ммм... каких окон? что, это одно D-приложение формирует несколько окон, к одному из которых надо присоединить целевое дочернее? С другой стороны было бы более чем удивительно, если бы у двух окон был одинаковый инстанс... а его владельца-родителя смотрел? тоже различаются? Сдаётся мне, что тебе придётся брести по дереву хендлов до самого корня, а потом спускаться обратно, ища требуемый. Впрочем, что-то запутался я, что там куда надо присоединять и что собсно надо проверять.... Кстати. А если запущено 2 экземпляра приложения - как ТЫ определяешь, к какому надо присоединяться? |
| Автор: DrBoom 25.8.2009, 16:00 |
| И так попробую разъяснить: 1. Как говорил, есть некое приложение на делфях. 2. Это приложение поддерживает дополнения\плагины. 3. Наша DLL (натуральная AxtiveX, если это имеет значение) является этим дополнением и её подключает само приложение. 4. В этой DLL есть форма, которая должна стать дочерней для одной из форм приложения: А. На форме (в DLL) есть некий таймер, который проверяет имя каждой активной формы (аля GetForegroundWindow). Б. Первый пункт проверки: проверка имени класса окна. В. Второй пункт проверки: проверка окна на то, что оно является окном именно того приложения, к которому подключена DLL. Г. Если окно прошло проверку наше окно в DLL становится дочерним найденному. Собственно задача\вопрос стоит в том, как можно проверить является ли найденное окно именно окном того приложения, к которому подключена DLL |
| Автор: Akina 25.8.2009, 20:34 |
| Имхо надо определять ProcessID (PID) приложения-прародителя окна и папашки для DLL. Это не хэндлы, тут никаких фортелей не должно быть. |
| Автор: DrBoom 25.8.2009, 21:35 | ||
Спасибо огромное за помощь... Проблему решил
Хотя этот код тоже может оказаться не универсальным, однако у меня он работает как надо ЗЫ. В качестве параметра передаю дескриптор проверяемого "родительского" окна |