Встраиваем VBA в... VB6 0_o

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Встраиваем VBA в... VB6 0_o

Сообщение Antonariy » 12.02.2008 (Вт) 17:13

Казалось бы, зачем нужен этот нонсенс? Оказывается, для рефакторинга. Иногда нужно привести большое количество однообразного, но четко структурированного кода, к другому виду, а ручная верстка грозит многочасовым интеллектуальным копипейстом.

Можно закрыть проект, считать файл в строку, сделать все что нужно, записать обратно, открыть проект... Слишком много действий, да и процедуры парсинга расползаются по проектам, папкам, концы иногда теряются. Гораздо удобнее выполнять эти процедуры не отходя от кассы, прямо в ide. Для этого нужна среда исполнения и доступ к объектам VB Extensibility текущего IDE. Доступ элементарно предоставляется через AddIn, а в качестве среды можно использовать даже VBScript, но VBA по очевидным причинам лучше. С каждым VB-проектом сопостовляется VBA-проект, который хранится в базе. Можно совершенно не париться о сохранности сервисных процедур.

Итак, это AddIn, в списке аддинов представлен под названием Refactor, для работы требует VBA 6.3. Исходники прилагаются.
В VBA-проекте присутствует объект VBProject (тип Refactor.RFProject), почти полностью повторяющий VBE.VBProject, из него открывается путь ко всем остальным потрохам VBE.
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось Antonariy 13.02.2008 (Ср) 11:33, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение alibek » 13.02.2008 (Ср) 8:35

Классно :)
Жаль, что я не смогу его затестить, как и IE VBE, но очень полезная задумка.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.02.2008 (Ср) 10:18

Почему не сможешь?
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение alibek » 13.02.2008 (Ср) 10:21

VBA нет :)
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.02.2008 (Ср) 10:23

Тынц, 16.7 мб.
Надеюсь это законно.

Кстати, обновил архив, там был глюк из-за которого не загружался сохраненный VBA-проект.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 13.02.2008 (Ср) 11:37

Ошибка
AddinInstance_OnConnection - ActiveX component can't create object

ADDED:
Как выяснилось, Add-in ищет APC и не находит его. Что за APC то?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.02.2008 (Ср) 12:09

Это и есть VBA 6.3.
Могу еще выложить 6.2, 11 мб.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 13.02.2008 (Ср) 12:20

Установил.
lProjects_ItemAdded - Не поддерживается
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.02.2008 (Ср) 12:23

Это почему-то происходит под отладчиком, скомпилированный exe работает нормально.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 13.02.2008 (Ср) 12:26

В списке эддинов нет никакого рефактора. В первый раз был, кстати.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.02.2008 (Ср) 12:32

Закрой все экземпляры VB, открой проект Refactor, если он есть в меню аддинов, выгрузи, закрой и снова открой проект и скомпилируй. Все восстановится.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 13.02.2008 (Ср) 12:37

Неуспеваю отписываться.

Помогло перекомпилирование в другую папку с другим именем.
Собственно, смысл эддина до меня ещё пока плохо доходит. Но вот то, что в эддине продемонстрированна возможность подключения VBA к своему проекту - это, безусловно, здорово. Для одного из своих проектов мне пришлось делать байткодную виртуальную машину, собственный VB-подобный ВУЯП, компилитор этого языка в байткод, IDE для этого языка. Я потратил на это невообразимое количество времени. А так, думается мне, можно было бы прикрутить VBA.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.02.2008 (Ср) 13:45

Смысл продемонстрирован в мультике :)
У вас нет доступа для просмотра вложений в этом сообщении.
Лучший способ понять что-то самому — объяснить это другому.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 13.02.2008 (Ср) 13:53

У VBA только один недостаток, для его использования в своих проектах, необходимо купить лицензию у Майкрософт. Причем стоимость лицензии на VBA, хранится в строжайшей тайне, как самой Майкрософт, так и покупателем. Если судить о том, кто реально использует VBA в коммерческих проектах - Autodesk, Adobe, SAP и т.д. Это монстры IT - индустрии, и скорее всего реальная стоимость лицензии - сотни тысяч, если не миллионы долларов США :)

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

Сообщение Хакер » 13.02.2008 (Ср) 14:28

Antonariy
Ну и раскраска. Глаза не устают? :)

Смысл, как я понял, в том, что VBA проект, коннектящийся к VB-проекту позволяет автоматизировать изменения в коде VB-проекта?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.02.2008 (Ср) 14:32

jangle
Не совсем все плохо. Платное лицензирование требуется только если ты собираешься продавать продукт с vba. Если это персональная или внутренняя корпоративная или некоммерческая разработка, то платить не надо.

А еще мне кажется, что можно обойти и коммерческое лицензирование. Если есть возможность сделать в приложении использование VBA опциональным, то лучше так сделать. Распространять дистрибутив VBA вообще ничто не мешает (см redist.txt), а решение устанавливать VBA или нет оставить целиком на откуп пользователю, предварительно открестившись от всех прав на него и повторив положения MS про персональное использование. "А еще наша программа может использовать VBA, если он у вас есть" - формулировка очень сомнительная, да и юрист из меня аховый.

Хакер
Почему-то код в стандартной расцветке воспринимается хуже :)

Ага. И не только в коде.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.02.2008 (Ср) 15:37

Для одного из своих проектов мне пришлось делать байткодную виртуальную машину, собственный VB-подобный ВУЯП, компилитор этого языка в байткод, IDE для этого языка.
А для чего это было нужно, если не секрет? Может хватило бы возможностей ScriptControl'а? А в качестве IDE - Notepad++ :) Дешево и сердито 8)
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 13.02.2008 (Ср) 16:44

Antonariy
IDE для создания тестирующего ПО.

СкрипКонтрол он по определению - СкриптКонтрол. Работает медлено, ограничен, нет тебе ни типов, ни исключений, нельзя вызывать многие API-функции (структур нет? указателей нет?) и т.д. и т.п.

Дешево и сердито 8)

Но несолидно. Это главное.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.02.2008 (Ср) 16:57

Хм, для тестирования ПО по-моему достаточно скриптовой скорости (большую часть времени скрипт будет ждать ответа от ПО), а API и т.п. можно было бы юзать через объекты самого IDE.
Но несолидно.
Ну, насчет Notepad++ согласен, но SC достаточно солиден. Под ним IE скрипты гоняет. Не через ocx конечно, но юзает те же интерфейсы, что и ocx.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 13.02.2008 (Ср) 17:39

А если нужно создать какое-то ну очень уж интерактивное ТПО? Например с трёхмерными летающими вариантами ответа, испускающими зелёный туман (я конечно утрирую). Всё-таки надо было обогнать всех конкурентов.

Да и к тому же. Как ты вот это превратишь в VBScript?

Код: Выделить всё
Dim File1 As IXTRStorageFile
Dim File2 As IXTRStorageFile
Dim LSRegion As IXTRStorageDataChunk
Dim LSSection As IXTProjSection

Set File1 = New CFile("Local@XenTester:\file1.dat", xcAccessFull)
Set File2 = New CFile("Local@XenTester:\file2.dat", xcAccessFull)

Set LSRegion = _
    File1.FileMgr.GetStorageRegion(File1.RData.RVA, _
                                   File1.RData.RVA + File1.RData.ChunkSize - 1)
Set LSSection = XTRuntime.Internal.XTProject.GetSection(XTSECTIONID_LOCALSTORAGE)

XTRuntime.Internal.XTRDebug_XCodeLockSection(LSSection, XTLOCK_DEFAULT And Not XTLOCK_IO)
With LSSection
    .EnterIOTransaction()
    LSRegion.IncreaseLinkCounter()
    .FreePool(File2.FileMgr.GetStoragePool())
    LSRegion.LockBoundary()
    File2.FileMgr.SetStoragePool(LSRegion.RVA, LSRegion.Size)
    LSRegion.UnlockBoundary()
   
    .CommitIOTransaction()
End With
Set File1 = Nothing ' Закрываем один из файлов прежде чем заблокировать секцию
                    ' т.к. не две региона не могут быть промапплены на одну и ту
                    ' же память.
XTRuntime.Internal.XTRDebug_XCodeLockSection(LSSection, XTLOCK_DEFAULT)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.02.2008 (Ср) 17:54

Код: Выделить всё
'от балды
Const xcAccessFull = 1
Const XTSECTIONID_LOCALSTORAGE = 2
Const XTLOCK_DEFAULT = 3
Const XTLOCK_IO = 4

Dim File1
Dim File2
Dim LSRegion
Dim LSSection

'Допустим XTRuntime - объект ide, переданный скрипту
Set File1 = XTRuntime.NewCFile("Local@XenTester:\file1.dat", xcAccessFull)
Set File2 = XTRuntime.NewCFile("Local@XenTester:\file2.dat", xcAccessFull)

Set LSRegion = _
    File1.FileMgr.GetStorageRegion(File1.RData.RVA, _
                                   File1.RData.RVA + File1.RData.ChunkSize - 1)
Set LSSection = XTRuntime.Internal.XTProject.GetSection(XTSECTIONID_LOCALSTORAGE)

Call XTRuntime.Internal.XTRDebug_XCodeLockSection(LSSection, XTLOCK_DEFAULT And Not XTLOCK_IO)
With LSSection
    .EnterIOTransaction
    LSRegion.IncreaseLinkCounter
    .FreePool (File2.FileMgr.GetStoragePool())
    LSRegion.LockBoundary
    Call File2.FileMgr.SetStoragePool(LSRegion.RVA, LSRegion.Size)
    LSRegion.UnlockBoundary
   
    .CommitIOTransaction
End With
Set File1 = Nothing

Call XTRuntime.Internal.XTRDebug_XCodeLockSection(LSSection, XTLOCK_DEFAULT)
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Хакер » 13.02.2008 (Ср) 18:51

Antonariy
Твой код не будет работать.

Ну, начнём с того, что RData - это свойство интерфейса IXTRStorageFile.

У тебя File1 As object, и всё гоняется через позднее связывание. Через IDispatch т.е. Таким образом доступ к левым интерфейсам, которые объект поддерживает ты не получишь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.02.2008 (Ср) 20:17

Насчет левых интерфейсов ты прав. В принципе можно возвращать указатели на них явно через дополнительные свойства основного класса, который возвращает NewCFile, но это уже не то, теряется смысл интерфейсов...
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 14.03.2008 (Пт) 14:35

Мелкие обновления:
1) Добавлено сохранение VBA-проекта при нажатии на дискетку.
2) Добавлено свойство RFProject.VBhWnd, возвращающее дексриптор IDE VB, в котором открыт проект.
3) Добавлено глобальное свойство VBAhWnd, возвращающее дексриптор IDE VBА.
4) Добавлено глобальное свойство hWnd4Modal, которое устанавливает дексриптор окна, по отношению к которому VBA-формы будут отображаться модально. Выбор, собственно, небольшой. Это может быть только hWnd любого top-level окна в адресном пространстве VB. То есть как самого VB, так и (предположительно) любой формы, что он может отобразить при запуске, а так же VBAhWnd.
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Наши проекты

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

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

    TopList