Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приложение и его формы 
V
    Опции темы
DrBoom
Дата 25.8.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


QIP VB-SDK Developer
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.2.2006

Репутация: нет
Всего: нет



Суть проблемы такая. Есть приложение, написанное на Delphi. Есть DLL для этого приложения, написанная на VB6. Приложение имеет основную форму и мы знаем её имя. В DLL получаем дескриптор (hWnd) основного окна по имени окна, а после добавляем в неё дочернее окно нашей DLL с помощью SetParent. Проблема следующая: как определить, что окно принадлежит именно нашему приложению, а не, к примеру, второй запущенной копии этого же приложения. Пытался сравнивать дескрипторы инстанции (hInstance) окон, с помощью GetWindowLong, однако они не совпадают (хотя приложение одно и тоже). Есть ли иные способы провернуть проверку?
PM MAIL ICQ Jabber   Вверх
Akina
Дата 25.8.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(DrBoom @  25.8.2009,  12:42 Найти цитируемый пост)
как определить, что окно принадлежит именно нашему приложению, а не, к примеру, второй запущенной копии этого же приложения.

Давай начнём с краю - а запуск нескольких экземпляров приложения - это нормальная штатная ситуация? или в теории этого быть не должно, просто юзер придурок?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DrBoom
Дата 25.8.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


QIP VB-SDK Developer
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.2.2006

Репутация: нет
Всего: нет



Akina, ну если бы было не нормально, то я бы и не задумывался об этом. Программа может быть запущена сколько угодно раз, ибо с ней (даже с одним экземпляром) могут работать несколько пользователей и она поддерживает различные профили. От проверяемого родительского окна известно только имя класса и его дескриптор.
PM MAIL ICQ Jabber   Вверх
Akina
Дата 25.8.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Если бы это было ненормально, мы бы искали способ запретить повторный запуск (впрочем, он известен).
А так... я могу предложить несколько вариантов решения. Например, перед отдачей дочернего окна исходному процессу заполнить Tag этого окна необходимой нам информацией - например хендлы свой и нового родителя (Дельфовой программы). Тогда ты сможешь не только понимать, от какого экземпляра своей программы отдано окно, но и какому экземпляру Дельфийского приложения (вдруг их тоже можно стартовать несколько...).


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DrBoom
Дата 25.8.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


QIP VB-SDK Developer
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.2.2006

Репутация: нет
Всего: нет



Akina, задача ещё сложнее, чем кажется. У нас в вооружении может быть только дескриптор и имя класса окна smile  Ибо доступ к исходникам уже готового приложения отсутствует у меня. А кто-либо, кто может это сделать, менять в этом окне уж точно уже что-либо не будет:-( Поэтому нужен вариант средствами WinAPI smile 
PM MAIL ICQ Jabber   Вверх
Akina
Дата 25.8.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(DrBoom @  25.8.2009,  15:04 Найти цитируемый пост)
доступ к исходникам уже готового приложения отсутствует у меня.

Не понял... ты пишешь приложение на VB6 и в то же время не имеешь доступа к его исходникам?

Добавлено через 13 минут и 53 секунды
Или ты пишешь ТРЕТЬЕ приложение?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DrBoom
Дата 25.8.2009, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


QIP VB-SDK Developer
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.2.2006

Репутация: нет
Всего: нет



Akina, приложение написано на делфи и уже готово. Исходников нет. Для этого приложения я пишут дополнение в виде DLL, которая подключается к этому приложению. У приложения я отлавливаю окно. Для этого окна я делаю дочернее окно со своими элементами. Вот возникает вопрос о проверке что окно действительно то, которое нам нужно.
PM MAIL ICQ Jabber   Вверх
Akina
Дата 25.8.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(DrBoom @  25.8.2009,  16:02 Найти цитируемый пост)
Вот возникает вопрос о проверке что окно действительно то, которое нам нужно

Окно, которое сформировано приложением на Дельфи и к которому нужно присоединить дочернее окно из DLL на VB6, надо определить из этой же DLL на VB6?

Цитата(DrBoom @  25.8.2009,  12:42 Найти цитируемый пост)
Пытался сравнивать дескрипторы инстанции (hInstance) окон, с помощью GetWindowLong, однако они не совпадают (хотя приложение одно и тоже). 

Ммм... каких окон? что, это одно D-приложение формирует несколько окон, к одному из которых надо присоединить целевое дочернее? С другой стороны было бы более чем удивительно, если бы у двух окон был одинаковый инстанс... а его владельца-родителя смотрел? тоже различаются?

Сдаётся мне, что тебе придётся брести по дереву хендлов до самого корня, а потом спускаться обратно, ища требуемый. Впрочем, что-то запутался я, что там куда надо присоединять и что собсно надо проверять....

Кстати. А если запущено 2 экземпляра приложения - как ТЫ определяешь, к какому надо присоединяться?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DrBoom
Дата 25.8.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


QIP VB-SDK Developer
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.2.2006

Репутация: нет
Всего: нет



И так попробую разъяснить:

1. Как говорил, есть некое приложение на делфях.
2. Это приложение поддерживает дополнения\плагины.
3. Наша DLL (натуральная AxtiveX, если это имеет значение) является этим дополнением и её подключает само приложение.
4. В этой DLL есть форма, которая должна стать дочерней для одной из форм приложения:

А. На форме (в DLL) есть некий таймер, который проверяет имя каждой активной формы (аля GetForegroundWindow).
Б. Первый пункт проверки: проверка имени класса окна.
В. Второй пункт проверки: проверка окна на то, что оно является окном именно того приложения, к которому подключена DLL.
Г. Если окно прошло проверку наше окно в DLL становится дочерним найденному.


Собственно задача\вопрос стоит в том, как можно проверить является ли найденное окно именно окном того приложения, к которому подключена DLL smile 

Это сообщение отредактировал(а) DrBoom - 25.8.2009, 16:21
PM MAIL ICQ Jabber   Вверх
Akina
Дата 25.8.2009, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Имхо надо определять ProcessID (PID) приложения-прародителя окна и папашки для DLL. Это не хэндлы, тут никаких фортелей не должно быть.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DrBoom
Дата 25.8.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


QIP VB-SDK Developer
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.2.2006

Репутация: нет
Всего: нет



Спасибо огромное за помощь... Проблему решил smile 

Код

Option Explicit

Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long

Public Function IsOwnProc(hWnd As Long) As Boolean
 Dim winPID As Long: Call GetWindowThreadProcessId(hWnd, winPID)
 IsOwnProc= CBool(winPID = GetCurrentProcessId)
End Function

Хотя этот код тоже может оказаться не универсальным, однако у меня он работает как надо smile

ЗЫ. В качестве параметра передаю дескриптор проверяемого "родительского" окна smile 
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0787 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.