|
addin на sharpdevelop
|
|||
---|---|---|---|
#18+
Всем привет! Формулировка вопроса проста - как написать addin для MS WORD с помощью SharpDevelop? Я посмотрел как это делается в VisualStudio- 1) подключается GAC reference - библиотека для работы с офисными объектами 2) создается скелет класса с двумя методами - действия при загрузке/выключении офисной программы. 3) созданный addin регистрируется в реестре, причем в реестр прописывается манифест - .vsto файл, который, насколько я понял, дает знать запущенному word-у, откуда загружать дополнения. А как я пытался сделать это с помощью SharpDevelop 1) Погуглив, выяснил, что надо создать пустой addin-project. 2) Подключил офисные библиотеки в папку references созданного проекта. А вот дальше есть вопросы - какие мне необходимо расширять интерфейсы, классы для написания аддина, куда писать свой код? В студийном проекте не разобрался, откуда он берет эти два метода, о которых я говорил выше. Я ожидал что мне необходимо реализовать некий интерфейс, переопределив методы вроде doSmthOnStartUp(), doSmthOnWordSelection(),doSmthOnButtonPress() и.т.д. или там как-то по-другому? Второй вопрос о регистрации в реестре - sharp develop создает некий .addin файл, который, как я понял, выполняет те же функции, что и .vsto в студийном проекте. На форумах люди советуют добавить в этот .addin файл manifest section - туда только название .dll пишем. Вопрос - Если я вручную добавляю в реестр инфу о своей .dll - должен ли я прописать именно этот .addin файл или как-то по другому? Причем в студийном файле куча информации, как-то жирный xml файл, по сути, а .addin, даже с добавлением секции манифест - всего несколько строчек, что вызывает подозрения, что я что-то не так понял. Обобщая вышенаписанное, прошу помощи по 2 вопросам - куда писать код (сэмплы, ссылки приветсвуются), как регистрировать в системе свой аддин. Студию не предлагать, надо решить вопрос именно на SharpDevelop, и библиотеку NetOffice не предлагать - там какая-то жирная библиотека, я не вникал тщательно, но это вроде как из пушки по воробьям. Должен же быть простой способ подрубить офисные .dll-ки, написать свой код, зарегать все это в реестре и все. Если кто делал подобное, поделитесь опытом, пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2013, 11:52 |
|
addin на sharpdevelop
|
|||
---|---|---|---|
#18+
Неужели никто не сталкивался с подобной проблемой? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2013, 20:48 |
|
addin на sharpdevelop
|
|||
---|---|---|---|
#18+
Теперь вопрос видоизменился. Как вывод из того, что я урывками читал в интернете - можно создать addin с помощью специального инструментария, предоставляемого студией VS tools for office - VSTO, а можно создать СОМ addin - для этого подключить Extensibility и реализовать интерфейс IDTExtensibility2 - там методы, в которых необходимо описать поведение addin-а при загрузке,выгрузке и т.д. Вопрос - как все таки зарегистрировать addin в системе? В реестре, в разделе current user/software/microsoft/office/word/addins создал свой подраздел, как было сказано во многих источниках, там создал переменные - имя надстройки, load behavior - не разобрался, куда прописывать путь к самой dll? А еще, SharpDevelop создает .addin файл - xml-дескриптор, его вроде тоже необходимо регистрировать - куда? Ну и менне насущный на данном этапе вопрос - предположим, я зарегал в системе примитивный addin, выводящий messageBox при загрузке. Но мне еще надо описать действия при других событиях - выделение слова, нажатие какой-либо клавиши и.т.д - это еще какой-то интерфейс надо реализовать? Блин, кто-нибудь дайте пожалуйста внятные инструкции, в нете вроде много материала, все вокруг да около кручусь, обидно, что алгоритмическую часть знаю как сделать, а застрял на чисто технических мелочах. Даже messageBox("hello world"); не получается сделать:( ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2013, 20:40 |
|
addin на sharpdevelop
|
|||
---|---|---|---|
#18+
BaurzhanSВ реестре, в разделе current user/software/microsoft/office/word/addins создал свой подраздел, как было сказано во многих источниках, там создал переменные - имя надстройки, load behavior - не разобрался, куда прописывать путь к самой dll?Путь к dll прописывать не нужно, ее нужно только зарегистрировать. Имя раздела должно называться ИмяDLL.ИмяКласса — это ProgID класса, реализующего IDTExtensibility2. По этому ProgID ворд в HKCR находит одноименный раздел, в этом разделе указан CLSID этого класса, в CLSID прописан путь к файлу. Это основа функционирования COM, азбука можно сказать. load behavior - не разобралсяВнутри раздела ИмяБиблиотеки.ИмяКласс нужно создать значение LoadBehavior типа reg_dword и присвоить нужное значение. А еще, SharpDevelop создает .addin файл - xml-дескриптор, его вроде тоже необходимо регистрировать - куда?Он не нужен. Но мне еще надо описать действия при других событиях - выделение слова, нажатие какой-либо клавиши и.т.д - это еще какой-то интерфейс надо реализовать?Никакой. Нужно получать ссылки на все документы и само приложение и обрабатывать их события. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 17:14 |
|
addin на sharpdevelop
|
|||
---|---|---|---|
#18+
Antonariy,спасибо за ответ, я думал уже никто не ответит. Я пробовал, сделать все, что Вы мне написали, но что-то не пошло( Я выполнил 3 действия в реестре: 1) в разделе HKCU/software/microsoft/office/word/addins создал подраздел ИмяDLL.ИмяКласса. в этом разделе создал переменные LoadBehavior,Description,FriendlyName. В LoadBehavior установил значение 3. 2) в разделе HKCR создал подраздел ИмяDLL.ИмяКласса/CLSID , и там переменной по умолчанию установил значение {649D6562-F01F-4117-BF2C-198CDD3E11E4}, именно со скобочками, как показано было в примерах. Значение взял из примера, его не нашел как генерить, но я так понял, я его сам назначаю, на всякий случай не стал придумывать (вдруг формат не угадаю), а взял из примера. 3) после 2-го действия в разделе HKCR/CLSID/{649D6562-F01F-4117-BF2C-198CDD3E11E4}/Inprocserver32 в переменной по умолчанию установил путь до .dll После этого я перезагрузил компьютер и после перезагрузки обнаружил, что "испортил" свой Word - он писал, что произошла серьезная ошибка и попросился запуститься в безопасном режиме. В безопасном режиме, посмотрев в параметрах Word надстройки, увидел свою надстройку в списке неактивных. Надстройка не запустилась - я просто выводил MessageBox во всех событиях интерфейса IDTExtensibility2 и никакого мс-бокса не увидел. Вопросы: 1) что я делал не так, что умудрился испортить word? 2) guid - это любое 128 битное число, разделенное знаком тире таким образом: 4 байта-2 байта-2 байта-2 байта - 6 байт? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2013, 15:26 |
|
addin на sharpdevelop
|
|||
---|---|---|---|
#18+
2 и 3 вручную делать не надо, нужно выполнить regsvr32 path/your.dll. Лучше очистите HKCR от своих экспериментов. Учитывая, что это хоть и com-visible dll, но все же .net, возможно regsvr32 не сработает, тогда нужно попробовать regasm. Путь к нему в переменных окружения не прописан, его нужно искать в %systemroot%\Microsoft.NET. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2013, 23:34 |
|
addin на sharpdevelop
|
|||
---|---|---|---|
#18+
Antonariy, спасибо. Получилось таки вывести "Hello world") Для тех, кому это потом может понадобиться, при проблемах с регистрацией .dll выолняем следующие действия: 1) В файле AssemblyInfo устанавливаем [assembly: ComVisible(true)] 2) Выбираем тот RegAsm той версии .NET, на которой вы собрали свой .dll - например, я регистрировал свою через RegAsm, лежащий в %systemroot%/microsoft.net/framework/4.0/regasm.exe. 3) Желательно, чтобы путь к .dll содержал только английские буквы, я вообще положил его в корень D диска. Еще в интернете рекомендовали менять некий regasm.config - пишу на память, в общем, xml-файл, лежащий в одной директории с RegAsm.exe, в этом файле надо дописать <runtime> <loadFromRemoteSources="true"/> </runtime> , но мне это не понадобилось, у меня были проблемы из-за русских букв в пути файла. 4) хоть я и сидел под админом, выполнение регистрации через командную строку Far требовало запуска от имени админа. Для удобства я создал батник и запустил его от имени администратора - может кому пригодится. P.S. - На самом деле, при установке на клиентскую машину могут возникать всякие "спецэффекты", типа не подходящих к текущей версии офиса IntertopAssemblies, отсутсвие необходимой версии .NET framework, отсутствие админских прав у пользователя, устанавливающего надстройку. Я в этом пока особо не разбирался, но кажется, чтобы подружить Вашу надстройку с конкретной версией офисной программы, с конкретными параметрами системы , придется потратить немало усилий) P.P.S - В ранних ответах Antonariy писал мне, чтобы обрабатывать события офисного прилодения "Нужно получать ссылки на все документы и само приложение и обрабатывать их события". - можно небольшой примерчик? Ссылку на приложение перехватываем в констукторе, а как реагировать на его события? Я представляю как-то так: addinLoad(){ app = getAppRef(); app.requiredEvent+=myEventHandler(); //и ниже метод myEventHandler } Правильно в общих чертах? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2013, 20:52 |
|
addin на sharpdevelop
|
|||
---|---|---|---|
#18+
"Нужно получать ссылки на все документы и само приложение и обрабатывать их события". - можно небольшой примерчик?Можно конечно. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2013, 21:31 |
|
addin на sharpdevelop
|
|||
---|---|---|---|
#18+
Antonariy, большое спасибо! Будем пробовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 07:02 |
|
addin на sharpdevelop
|
|||
---|---|---|---|
#18+
Вопрос лишь косвенно касается сабжа, но не стал заводить новую тему. Вопрос об объекте Microsoft.Intertop.Selection: как у него посмотреть текст? В примерах пишут про свойство Text, у меня его нет. У меня Word 2007. У selection есть свойства words,rows - их пытался распечатать, и также что-то вроде rows[0].toString() - ничего не выводит, такое чувство, что где-то внутри происходит runtime error, но мне не показывается. В документации есть у 10-го и 3-его word-а, может быть, с этим связано, но как тогда забрать текст у selection в 7-ом word-e? Ну и еще маленький вопрос - есть ли способ отлавливать нажатие клавиш, более компактный и элегантный чем этот ? Вообще говоря, это мне надо для отлавливания последнего введенного слова, может быть, необязательно слушать клавиши? Например, в голову приходит такой вариант - 1) делаем selection.wholeStory() - типа делаем CTRL+A 2) у выделенного selection можно запустить find.execute("пробел") 3) от последнего пробела до текущей позиции - это и есть последнее введенное слово. Но это слишком тупо и я не умею после Find.execute - забирать те позиции, которые он нашел. Какие есть мысли, идеи, предложения? Буду очент признатален за любую помощь, по сути, умение делать getText() у Selection( перехватывать его я умею) и умение перехватывать последнее введенное слово - это все мне нужно) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2013, 20:25 |
|
|
start [/forum/topic.php?fid=20&tid=1405114]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
12ms |
check topic access: |
12ms |
track hit: |
45ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
others: | 323ms |
total: | 463ms |
0 / 0 |