![]() |
|
Модераторы: Akina |
![]()
|
|
| DrBoom |
|
|||
|
QIP VB-SDK Developer ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.2.2006 Репутация: нет Всего: нет |
Суть проблемы такая. Есть приложение, написанное на Delphi. Есть DLL для этого приложения, написанная на VB6. Приложение имеет основную форму и мы знаем её имя. В DLL получаем дескриптор (hWnd) основного окна по имени окна, а после добавляем в неё дочернее окно нашей DLL с помощью SetParent. Проблема следующая: как определить, что окно принадлежит именно нашему приложению, а не, к примеру, второй запущенной копии этого же приложения. Пытался сравнивать дескрипторы инстанции (hInstance) окон, с помощью GetWindowLong, однако они не совпадают (хотя приложение одно и тоже). Есть ли иные способы провернуть проверку?
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 34 Всего: 454 |
Давай начнём с краю - а запуск нескольких экземпляров приложения - это нормальная штатная ситуация? или в теории этого быть не должно, просто юзер придурок? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| DrBoom |
|
|||
|
QIP VB-SDK Developer ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.2.2006 Репутация: нет Всего: нет |
Akina, ну если бы было не нормально, то я бы и не задумывался об этом. Программа может быть запущена сколько угодно раз, ибо с ней (даже с одним экземпляром) могут работать несколько пользователей и она поддерживает различные профили. От проверяемого родительского окна известно только имя класса и его дескриптор.
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 34 Всего: 454 |
Если бы это было ненормально, мы бы искали способ запретить повторный запуск (впрочем, он известен).
А так... я могу предложить несколько вариантов решения. Например, перед отдачей дочернего окна исходному процессу заполнить Tag этого окна необходимой нам информацией - например хендлы свой и нового родителя (Дельфовой программы). Тогда ты сможешь не только понимать, от какого экземпляра своей программы отдано окно, но и какому экземпляру Дельфийского приложения (вдруг их тоже можно стартовать несколько...). -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| DrBoom |
|
|||
|
QIP VB-SDK Developer ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.2.2006 Репутация: нет Всего: нет |
Akina, задача ещё сложнее, чем кажется. У нас в вооружении может быть только дескриптор и имя класса окна
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 34 Всего: 454 |
Не понял... ты пишешь приложение на VB6 и в то же время не имеешь доступа к его исходникам? Добавлено через 13 минут и 53 секунды Или ты пишешь ТРЕТЬЕ приложение? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| DrBoom |
|
|||
|
QIP VB-SDK Developer ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.2.2006 Репутация: нет Всего: нет |
Akina, приложение написано на делфи и уже готово. Исходников нет. Для этого приложения я пишут дополнение в виде DLL, которая подключается к этому приложению. У приложения я отлавливаю окно. Для этого окна я делаю дочернее окно со своими элементами. Вот возникает вопрос о проверке что окно действительно то, которое нам нужно.
|
|||
|
||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 34 Всего: 454 |
Окно, которое сформировано приложением на Дельфи и к которому нужно присоединить дочернее окно из DLL на VB6, надо определить из этой же DLL на VB6?
Ммм... каких окон? что, это одно D-приложение формирует несколько окон, к одному из которых надо присоединить целевое дочернее? С другой стороны было бы более чем удивительно, если бы у двух окон был одинаковый инстанс... а его владельца-родителя смотрел? тоже различаются? Сдаётся мне, что тебе придётся брести по дереву хендлов до самого корня, а потом спускаться обратно, ища требуемый. Впрочем, что-то запутался я, что там куда надо присоединять и что собсно надо проверять.... Кстати. А если запущено 2 экземпляра приложения - как ТЫ определяешь, к какому надо присоединяться? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| DrBoom |
|
|||
|
QIP VB-SDK Developer ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.2.2006 Репутация: нет Всего: нет |
И так попробую разъяснить:
1. Как говорил, есть некое приложение на делфях. 2. Это приложение поддерживает дополнения\плагины. 3. Наша DLL (натуральная AxtiveX, если это имеет значение) является этим дополнением и её подключает само приложение. 4. В этой DLL есть форма, которая должна стать дочерней для одной из форм приложения: А. На форме (в DLL) есть некий таймер, который проверяет имя каждой активной формы (аля GetForegroundWindow). Б. Первый пункт проверки: проверка имени класса окна. В. Второй пункт проверки: проверка окна на то, что оно является окном именно того приложения, к которому подключена DLL. Г. Если окно прошло проверку наше окно в DLL становится дочерним найденному. Собственно задача\вопрос стоит в том, как можно проверить является ли найденное окно именно окном того приложения, к которому подключена DLL Это сообщение отредактировал(а) DrBoom - 25.8.2009, 16:21 |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 34 Всего: 454 |
Имхо надо определять ProcessID (PID) приложения-прародителя окна и папашки для DLL. Это не хэндлы, тут никаких фортелей не должно быть.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| DrBoom |
|
|||
|
QIP VB-SDK Developer ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.2.2006 Репутация: нет Всего: нет |
Спасибо огромное за помощь... Проблему решил
Хотя этот код тоже может оказаться не универсальным, однако у меня он работает как надо ЗЫ. В качестве параметра передаю дескриптор проверяемого "родительского" окна |
|||
|
||||
![]()
|
| Правила форума "VB6" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | VB6 | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |