OLE связь другого приложения с приложением на VB6

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ol1965
Обычный пользователь
Обычный пользователь
 
Сообщения: 57
Зарегистрирован: 21.02.2005 (Пн) 9:29

OLE связь другого приложения с приложением на VB6

Сообщение Ol1965 » 17.07.2007 (Вт) 15:13

Добрый день,
вопрос может оказаться не правильно построенным, но постараюсь быть точен. Заранее извините. Вопрос: есть приложение (скажем MS Excel, но может быть и другим Access, 1C ...), нужно при необходиости (необходимость задается средствами MS Excel) показывать форму разработаную на VB6. Объекты в форме динамически меняются (реализовано в VB6). Каким образом готовый проект в VB6 загрузить, описать в Excel. Где хотя бы начать искать в поисках ответа. Заранее спасибо.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.07.2007 (Вт) 15:26

Масса вариантов: например, создать ActiveX Control и положить его на экселевскую юзерформу; или, например, создать ActiveX DLL/EXE, который будет показывать свою форму, и подключить его.
Изображение

Ol1965
Обычный пользователь
Обычный пользователь
 
Сообщения: 57
Зарегистрирован: 21.02.2005 (Пн) 9:29

Сообщение Ol1965 » 18.07.2007 (Ср) 9:09

Спасибо, тема закрыта.

Ol1965
Обычный пользователь
Обычный пользователь
 
Сообщения: 57
Зарегистрирован: 21.02.2005 (Пн) 9:29

Сообщение Ol1965 » 19.07.2007 (Чт) 16:03

Еще один вопрос. В созданной DLL есть форма. При открытии ее из тест-программы (ЕХЕ-проект), эта форма открывается автономно, т.е. не зависимо от формы тест-программы. А возможно ли открыть ее внутри формы вызывающей тест-программы. Ох и намудрил!!! Заранее спасибо.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 19.07.2007 (Чт) 16:21

Точно помню что делал чтобы форма открывалась модально по отношению к Excel (не внутри окна, но тоже нормально). Но вот хоть убей не помню в каком из проектов и как... :(

Напомните кто может...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 19.07.2007 (Чт) 16:51

API: SetParent

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.07.2007 (Чт) 18:33

Модально...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 19.07.2007 (Чт) 23:26

Согласно MFC (BeginModalState) модальное окно при открытии заносит в массив хендл родителя и хендлы других child popup уведомляет их WM_DISABLEMODAL (наверное, на всякий случай - вдруг чего ответят) и блокирует их с помощью EnableWindow, а при закрытии (EndModalState) разблокирует.

Вот как-то так.
SetParent Form1.hwnd , Application.Hwnd
EnableWindow Application.Hwnd, 0
Form1.show
...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.07.2007 (Чт) 23:43

MFC никому не указ... Там сделано одним способом, в делфи другим, может быть в VB третьим...

Дизаблить родителя мало: надо ещё, чтобы по клику по нему фокус передавался активному модальному потомку, чтобы было как будто по-настоящему.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.07.2007 (Чт) 23:47

EUGY
Ты хоть бы опробовал свой код... перед тем как его постить.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 20.07.2007 (Пт) 0:04

перед тем как его постить

А что нужно от sub до end sub? Намека на код, Вам, уважаемый Хакер, не достаточно?
Каким способом сделана модальность в vb нам MSDN не говорит.
Но то что окно блокирует родителя очевидно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.07.2007 (Пт) 0:07

EUGY
Но то что окно блокирует родителя очевидно.

Да.

Но очевидно ли тебе, что быть чилдом окна, и быть модальным окном - абсолютно разные вещи? Хотя бы тем, что модальное окно не ограничено клиентской частью владельца?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 20.07.2007 (Пт) 0:08

tyomitch писал(а):надо ещё, чтобы по клику по нему фокус передавался активному модальному потомку.


А именно так и произойдет. Windows это сама делает.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.07.2007 (Пт) 0:12

EUGY писал(а):
tyomitch писал(а):надо ещё, чтобы по клику по нему фокус передавался активному модальному потомку.


А именно так и произойдет. Windows это сама делает.

Не верю. Потому что у дизабленного окна может быть два потомка одного уровня, и ей неоткуда узнать, который из них активный.
Изображение

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 20.07.2007 (Пт) 0:19

EUGY писал(а): и хендлы других child popup ..


И насчет моего прокола по SetParent... Sorry..
GWL_HWNDPARENT

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 20.07.2007 (Пт) 5:17

Вопрос: А как сделать SetParent или другие действия с родителем, если язык, на котором вызвана dll не поддерживает Hwnd вприципе?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 20.07.2007 (Пт) 10:51

Matew
Сделать на другом языке ActiveX Control, который определяет своего родителя и кинуть в контейнер.
Изображение

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 23.07.2007 (Пн) 1:20

keks-n, я так понимаю в контейнер на форме родителя? А если язык не поддерживает ActiveX Control-ы? (1С например, который есть в вопросе Ol1965-а)
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.07.2007 (Пн) 1:23

Язык не может поддерживать или не поддерживать ActiveX контролы, ровно как и Hwnd. Среда или там платформа - я ещё пойму. Но язык...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 23.07.2007 (Пн) 16:23

Хакер
На VBA до hWnd формы не достучишся
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.07.2007 (Пн) 17:27

Отдельные умельцы достукиваются при помощи FindWindowEx.
Изображение

Iwanoffъъ
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 07.12.2007 (Пт) 0:54

Сообщение Iwanoffъъ » 07.12.2007 (Пт) 1:09

На тему OLE, но несколько другой вопрос...
Допустим, что запущено 2, 3, 4 и т.д. экземпляров, к примеру, того же Exel... При помощи

Dim xlApp As Object
Set xlApp = GetObject(, "Excel.Application")

проектируемое приложение подключится к первому же из запущенных экземпляров Exel... А как лучше сделать, чтоб подключить ко второму или третьему или т. д.? И может даже вывести список всех открытых копий Exel?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 07.12.2007 (Пт) 9:14

Если вызывать GetObject несколько раз, то ты будешь подключаться к разным инстансам.
Правда подтверждения этому в MSDN я не нашел, но где-то такое читал.
Lasciate ogni speranza, voi ch'entrate.

Iwanoffъъ
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 07.12.2007 (Пт) 0:54

Сообщение Iwanoffъъ » 09.04.2008 (Ср) 20:45

alibek писал(а):Если вызывать GetObject несколько раз, то ты будешь подключаться к разным инстансам.
Правда подтверждения этому в MSDN я не нашел, но где-то такое читал.


Вот и я не нашёл... И экспериментальным путём получается так, что если запущены несколько копий программы, то все действия совершаются с первой из запущенной... Прошло три месяца, а ответ и ныне там...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 81

    TopList