ActiveX для InTouch

Вопросы, не попадающие в другие разделы.

ActiveX для InTouch

Сообщение LexSL » Ср апр 04, 2012 5:31 pm

Решил начать новую тему, кому интересно написание своих ActiveX для Интача. Хочу поделиться опытом... :)
В общем было сначала так:
http://www.InTouch.ru/forum/viewtopic.php?f=4&t=1451&sid=42db5d987f07fc996292fb990089c502

Я сам не силен в технологии COM на которой базируется технология ActiveX, однако что-то умею писать на C#, C++.
Так вот, так как на C# оказалось достаточно просто клепать свои UserControl для IDE путем импортирования сборки в среду
(см. например http://www.InTouch.ru/forum/viewtopic.php?f=4&t=1451&sid=42db5d987f07fc996292fb990089c502),
то я задался вопросом - нельзя ли сделать так, чтобы создаваемая сборка в C# была видна в системе как COM объект, проще говоря - ActiveX компонент.
Я к тому, что люди, не имеющие лицензии на IDE,а только на InTouch - посмотрят на это и вздохнут с сожалением :)...
Пришлось конечно свои знания по COM подтянуть и в итоге получилось следующее - сборку dll, которая содержит в себе классы (наследуемые от UserControl)
можно сделать видимой в системе, точнее InTouch уже видит их как ActiveX контролы.
Меня могут одернуть знающию люди, сказав, что достаточно поставить галочки "Register for COM Interop" и "Make assembly COM-Visible" в свойствах проекта VisualStuido,
однако нужно было заиметь также быстрый способ создания самого скелета ActiveX...
долго помучившись с интерфейсами и классами, их реализующими, натолкнулся на вот это:
http://msdn.microsoft.com/en-us/vstudio/bb419144
проще говоря, это тулкит для VsiualStudio для Basic.NET, позволяющий сборки дотнетовские использовать в старом VisualBasic 6 как COM объекты (ActiveX).
уже что-то рядом...ну естественно, добры люди переписали все это для C#:
http://www.codeproject.com/Articles/189 ... 0-Tutorial
или
http://interoptoolkitcs.codeplex.com/
а так как я со школы не перевариваю бейсик, то решено было воспользоваться темплейтами и шаблонами для C#.
Необходимо их скачать и скопировать zip файлы в директорию C:\Users\username\My Documents\Visual Studio 2010\Templates:
для ItemTemplates: в подпапку ItemTemplates\Visual C#\CSInteropUserControlItemTemplate.zip
для ProjectTemplates: в подпапку ProjectTemplates\Visual C#\Windows\CSInteropUserControlProjectTemplate.zip
это для Visual Studio 2010
Для Visual studion 2008:
ProjectTemplates: в подпапку ProjectTemplates\Visual C#\CSInteropUserControlProjectTemplate.zip
Ну и соответственно, начинаем создание нового Project и выбираем в списке templates\My Templates : Interop UserControl
Данный шаблон содержит уже все необходимые интерфейсы и классы , необходимые для регистрации в системе как COM объекту.
также уже там есть ваш класс, наследуемый от UserControl, который и будет собсвенно вашей "формочкой" в Интаче.
В интерфейсах уже объявлены некоторые свойства, методы и события , стандартные для любого контрола ActiveX.
И в принципе уже можно начинать ваять свой ActiveX.
При компиляции проекта VisualStudio сама зарегистрирует в системе и типы и классы и интерфейсы, объвленные в сборке, поэтому на этой же машине InTouch без проблем должен
увидеть этот ActiveX. Но заказчику-то не будешь ставить VisualStudio, поэтому на чистой машине, куда уже будет установлен рантайм интача необходимо
зарегистрировать типы,интерфейсы и классы из сборки таким образом (в командной строке):
"C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" /codebase /tlb:xxx.tlb "ваша сборка".dll
Чуть не забыл, сборку в VisualStudio необходимо подписать "строгой" подписью утилитой sn.exe (как - смотри в msdn, это достаточно просто)
и ключ /tlb нужен обязательно, ибо если Вы что-то поменяли в сборке и надо заменить на чистой машине старую на новую, то сначала отменяете регистрацию:
"C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" /unregister /tlb "ваша сборка".dll
и вот тут тоже ключ /tlb помогает убрать информацию о типах, содержащиеся в ххх.tlb из реестра,
после этого уже старую сборку заменяете на новую и заново регистрируете...
Ну и насчет этого злосчастного TreeView :D. Я себе сделал таким образом TreeView ActiveX компонент, который грузит в себя дерево из xml файла
(воспользовался вот этим: http://www.codeproject.com/Articles/130 ... -an-XML-fi)
Теперь в интаче у меня на отдельном окне висит "дерево" и по клику по дереву у меня открываются сопоставленные элементам дерева окна в интаче.
сопоставление(имя окна в Интаче) у меня храниться в свойстве Tag у Item.
также у себя заменил все контролы, которые были вставлены в InTouch из IDE, а они уже были в свою очередь импортированы из сборки dll.
:) согласен - отвратный способ был :)
Сделал себе наконец табличное представление данных, также в виде ActiveX, данные берутся по DDE у самого InTouch runime.
(кому интересно - ndde.codeplex.com)
Да, еще...в свою сборку можно также добавлять еще и еще классы (будут еще ActiveX) - Project->Add New Item и выбираем также Interop UserControl
(у нас же есть не только шаблон проекта, но и шаблон итема (ItemTemplates))
Думаю мысль понятна, в одной сборке будет находится несколько классов UserControl, соответсвенно мы будем иметь в интаче несколько ActiveX, а все
они объявлены в одной сборке.

Столько написал, думал что кому-нибудь будет интересно... :)
Последний раз редактировалось LexSL Вт апр 17, 2012 4:26 pm, всего редактировалось 1 раз.
LexSL
 
Сообщения: 80
Зарегистрирован: Вт дек 14, 2010 2:53 pm

Re: ActiveX для InTouch

Сообщение Shpik » Ср апр 04, 2012 6:10 pm

Очень интересная тема :!:
Спасибо за направление!!! :)
Shpik
 
Сообщения: 23
Зарегистрирован: Ср янв 11, 2012 12:31 pm

Re: ActiveX для InTouch

Сообщение LexSL » Чт апр 05, 2012 11:53 am

Пишу дальше...:)
Если в своей сборке вы используете типы и классы, находящиеся в другой сборке, отличающиейся от стандартных framework-ских, то есть вы используете постороннюю сборку, то - после компиляции своей сборки - необходимо на чистой машине (где рантайм будет) обязательно зарегистрировать эти чужие сборки, иначе InTouch при загрузке компонента не находит типы и вместо ActiveX будет пустой прямоугольник. :(
естественно, сборка должна быть подписана "строгой" подписью...
вот тут может быть засада: если исходников сборки нет, то подписать чужую сборку можно так:
sn -R "сборка.dll" "файл_подписи.snk"
если и такое не прокатывает (обычно выдает :"сборка.dll" does not represent a strongly named assembly), то можно попытаться так (что у меня получалось):
1. Декомпилируем неподписанную dll в MSIL код.
ildasm сборка.dll /out:assembly.il
2. Убираем куда-нибудь исходную dll (она нам больше не понадобится)
3. Компилируем полученный на этапе №1 код, подписывая его:
ilasm assembly.il /dll /key=key.snk

Ну вот, подписали, зарегистрировали все посторонние сборки , в конце свою сборку..а в Интаче все равно пустой прямоугольник?
Обычно в этом случае я просто все посторонние сборки бросаю в каталог установленного Интача, он обычно при старте туда смотрит
или можно установить посторонние сборки в GAC, утилитой gacutil входящей в Windows SDK или можно просто открыть папку в проводнике c:\windows\assembly и просто перетащить туда сборки - они сами туда установятся.
может есть способы проще, кто знает - пишите, но у меня так было и не сделав я этих действий, InTouch так и не хотел ActiveX видеть - выводил пустой прямоугольник..
LexSL
 
Сообщения: 80
Зарегистрирован: Вт дек 14, 2010 2:53 pm


Вернуться в Другое

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

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

cron