Внешняя компонента. Метод объекта не обнаружен. #755993


#0 by alexkozin
Коллеги, приветствую! Встал в ступор. По шаблону "накатал" внешнюю компоненту. Инициализируется нормально, никаких проблем, IInitDone отрабатывается нормально, но вот беда - ни одного определенного мной метода 1С не видит. То есть в компоненте есть мой метод methTest, но 1С при вызове метода ВК.methTest пишет "Метод объекта не обнаружен". Компонента зарегистрирована через regasm и инициализирована в 1С без ошибок. Платформа 1с 8.2.14.533 Куда копать? Заранее спасибо!
#1 by alexkozin
Уп))
#2 by Кирпич
смотреть на свой код пока не вскочишь и воскликнешь: "о боже! неужели это я мог допустить такую глупую ошибку!"
#3 by alexkozin
Дык вроде как всё просмотрел таки..... Всё прям по фен шую
#4 by Кирпич
ну тогда выкладывай код. добрый дядя тебе найдет твой косяк.
#5 by alexkozin
'Сгенерируйте уникальный идентификатор компоненты (меню Tools - Create GUID)   'Укажите ProgID компоненты (по этому имени ее будет находить 1С). 'Пример регистрации компоненты в системном реестре, чтобы ее смогла найти 1С: Public Class vk_OLE     Const c_AddinName As String = "vk_OLE"     Public Sub New ' Обязательно для COM инициализации         'Вызывается при начале работы внешней компоненты (2 раза)     Private Sub Init(<MarshalAs(UnmanagedType.IDispatch)> ByVal pConnection As Object) Implements IInitDone.Init         'Вызывается при начале работы внешней компоненты (2 раза)     Private Sub Done Implements IInitDone.Done         'Вызывается при завершении работы внешней компоненты (2 раза)         MessageBox.Show("Завершение работы ВК")     Dim obj1C As Object 'Объект 1С     Dim g_flagInit As Boolean 'Признак, что инициализация obj1C уже прошла     '<MarshalAs(UnmanagedType.IDispatch)> Dim g_var As Object     Dim g_var As Object     Sub GetNProps(ByRef plProps As Integer) Implements ILanguageExtender.GetNProps         'Здесь 1С получает количество доступных из ВК свойств     Sub FindProp(ByVal bstrPropName As String, ByRef plPropNum As Integer) Implements ILanguageExtender.FindProp         'Здесь 1С ищет числовой идентификатор свойства по его текстовому имени         Select Case bstrPropName     Sub GetPropName(ByVal lPropNum As Integer, ByVal lPropAlias As Integer, ByRef pbstrPropName As String) Implements ILanguageExtender.GetPropName         'Здесь 1С (теоретически) узнает имя свойства по его идентификатору. lPropAlias - номер псевдонима     'Функция генерирует исключение в 1С     Sub Raise1CException(ByVal s As String)         Dim ei As ExcepInfo         '1004 - красный значок !!!         '1005 - зеленый значок i         '1006 - красный значок err     Sub GetPropVal(ByVal lPropNum As Integer, ByRef pvarPropVal As Object) Implements ILanguageExtender.GetPropVal         'Здесь 1С узнает значения свойств             pvarPropVal = Nothing             Select Case lPropNum             End Select         Catch ex As Exception 'Обработчик исключительных ситуаций (ошибок)     Sub SetPropVal(ByVal lPropNum As Integer, ByRef varPropVal As Object) Implements ILanguageExtender.SetPropVal         'Здесь 1С изменяет значения свойств         Select Case lPropNum             '/////////////////////////////////////////////////////////     Sub IsPropReadable(ByVal lPropNum As Integer, ByRef pboolPropRead As Boolean) Implements ILanguageExtender.IsPropReadable         'Здесь 1С узнает, какие свойства доступны для чтения         pboolPropRead = True ' Все свойства доступны для чтения     Sub IsPropWritable(ByVal lPropNum As Integer, ByRef pboolPropWrite As Boolean) Implements ILanguageExtender.IsPropWritable         'Здесь 1С узнает, какие свойства доступны для записи         pboolPropWrite = True ' Все свойства доступны для записи     Sub FindMethod(ByVal bstrMethodName As String, ByRef plMethodNum As Integer) Implements ILanguageExtender.FindMethod         'Здесь 1С получает числовой идентификатор метода (процедуры или функции) по имени (названию) процедуры или функции         plMethodNum = -1         Select Case bstrMethodName     Sub GetMethodName(ByVal lMethodNum As Integer, ByVal lMethodAlias As Integer, ByRef pbstrMethodName As String) Implements ILanguageExtender.GetMethodName         'Здесь 1С (теоретически) получает имя метода по его идентификатору. lMethodAlias - номер синонима.     Sub GetNParams(ByVal lMethodNum As Integer, ByRef plParams As Integer) Implements ILanguageExtender.GetNParams         'Здесь 1С получает количество параметров у метода (процедуры или функции)         Select Case lMethodNum     Sub GetParamDefValue(ByVal lMethodNum As Integer, ByVal lParamNum As Integer, ByRef pvarParamDefValue As Object) Implements ILanguageExtender.GetParamDefValue         'Здесь 1С получает значения параметров процедуры или функции по умолчанию         pvarParamDefValue = Nothing 'Нет значений по умолчанию     Sub HasRetVal(ByVal lMethodNum As Integer, ByRef pboolRetValue As Boolean) Implements ILanguageExtender.HasRetVal         'Здесь 1С узнает, возвращает ли метод значение (т.е. является процедурой или функцией)         pboolRetValue = True  'Все методы у нас будут функциями (т.е. будут возвращать значение).     Sub CallAsProc(ByVal lMethodNum As Integer, ByRef paParams As System.Array) Implements ILanguageExtender.CallAsProc         'Здесь внешняя компонента выполняет код процедур. А процедур у нас нет.     Sub CallAsFunc(ByVal lMethodNum As Integer, _      ByRef pvarRetValue As Object, _      <MarshalAs(UnmanagedType.IDispatch)> ByRef paParams As System.Array) _         'Здесь внешняя компонента выполняет код функций.         Try             pvarRetValue = 0 'Возвращаемое значение метода для 1С             Select Case lMethodNum 'Порядковый номер метода                 '//////////////////////////////////////////////////////////             Case Methods.methTest  'Реализуем метод для тестирования доступа к 1С                     If g_flagInit = False Then                     Dim obj0 As Object                 Case Methods.methSetValue                     'Реализуем метод для установки значения из 1С в внешнюю компоненту                 Case Methods.methGetValue                     'Реализуем метод для чтения значения в 1С из внешней компоненты                     'Реализуем метод для очистки переменной (иначе 1С зависает в памяти)         Catch ex As Exception 'Обрабатываем исключение (ошибку)
#6 by alexkozin
Собсно вот класс.... Абсолютно как в книжке)) Вот форма:
#7 by alexkozin
А вот ошибка: {Форма.Форма.Форма}: Метод объекта не обнаружен (methTest)     Сообщить(ВК.methTest);
#8 by Serginio1
А зачем тебе ВК? посмотри Там кстати реализована ВК для получения глобального контекста и интерфейсов
#9 by hhhh
в процедуду ПриОткрытии попадает вообще? В отладчике смотрел?
#10 by alexkozin
Здарова! Да, попадает и загрузка и выгрузка компоненты робит отлично. IInitDone отрабатывает без проблем.
#11 by alexkozin
дык научиться хочу)) Кстати, спс за ссылку, обязательно ознакомлюсь, но для начала хотелось бы разобраться с ВК.
#12 by Serginio1
Так для того, что бы научиться, нужно посмотреть на уже существующие решения. Там есть и реализация ВК
#13 by Кирпич
Sub GetMethodName(ByVal lMethodNum As Integer, ByVal lMethodAlias As Integer, ByRef pbstrMethodName As String) Implements ILanguageExtender.GetMethodName это что за фигня? здесь ты должен возвращать имя метода по его номеру
#14 by Маратыч
Погодь, у тебя FindMethod что искать пытается, посмотри. Ты ей пихаешь methTest, а у нее в Case такого нет, есть только Test. Плюс еще.
#15 by Serginio1
Посмотри
#16 by Serginio1
14 Ну и в отладчике посмотри FindMethod CallAsFunc
#17 by alexkozin
приколюха в том что в отладчике да данных функций почему-то не доходит. Последний отрабатываемый метод это ILanguageExtender-овский RegisterExtensionAs   Sub RegisterExtensionAs(ByRef bstrExtensionName As String) Implements ILanguageExtender.RegisterExtensionAs и усё.... даьше как будто выходит из отладчика
#18 by alexkozin
'/////////////////////////////////////////////////////////////////////////////////     Sub FindMethod(ByVal bstrMethodName As String, ByRef plMethodNum As Integer) Implements ILanguageExtender.FindMethod         'Здесь 1С получает числовой идентификатор метода (процедуры или функции) по имени (названию) процедуры или функции         plMethodNum = -1         Select Case bstrMethodName доделал, но один фиг толку 0   '/////////////////////////////////////////////////////////////////////////////////     Sub GetMethodName(ByVal lMethodNum As Integer, ByVal lMethodAlias As Integer, ByRef pbstrMethodName As String) Implements ILanguageExtender.GetMethodName         'Здесь 1С (теоретически) получает имя метода по его идентификатору. lMethodAlias - номер синонима.         pbstrMethodName = ""         Select Case lMethodNum
#19 by alexkozin
Хожу отладчиком. Короче почему-то не заходит в методы FindMethod и т.д. В общем ооладчик не хотит ходить по методом интерфейса ILanguageExtender :(
#20 by ProgAL
У тебя ГУИД ком объекта ILanguageExtender должен быть точно таким как в шаблоек внешних компонент в примерах на диске ИТС. И у интерфейса IInitDone, IAsyncEvent, IStatusLine тоже.
#21 by ProgAL
Вероятно, причина именно в этом. 1с просто не видит твои интерфейсы, т к тыкается через кваериинтерфейс в предопределенные значения ГУИДов, а твои ГУИДы другие.
#22 by alexkozin
Клянуся ГУИД как надо именно такой, с другим даже компонента не регится AB634003-F13D-11d0-A459-004095E1DAEA :(
#23 by alexkozin
+ в метод RegisterExtensionAs-то нормально заходит.
#24 by alexkozin
Чудеса, ребята :(
#25 by Serginio1
А c_AddinName="vk_OLE"
#26 by Serginio1
ВК = Новый(ИмяВК);
#27 by Serginio1
Бери примеры и не мучайся.
#28 by alexkozin
Ага, так и делаю. Создается нормально, отладчиком нормально ходит по интерфейсу IInitDone и по первому методу интерфейса ILanguageExtender "RegisterExtensionAs", но вот в остальные методы отладчик не идет почему-то. Осталось с помощью коллег выяснить почему) Будешь смеяться, но это пример))
#29 by alexkozin
мне критично именно на VB.NET, а это как раз пример VB.NET
#30 by Serginio1
А в чем разница? Можешь код сконвертировать.
#31 by Кирпич
какие нафиг чудеса?! Просто понятия нет никпкого. Когда будет понятие, сам свои ошибки видеть будешь, а не искать их через мисту методом тыка.
#32 by Serginio1
30+ Берешь ILSpy выбираешь свой любимый VB и декомпилируешь.
#33 by Serginio1
28 Разницу видишь ВК = Новый COMОбъект(ИмяВК); и
#34 by Serginio1
Не работающий вариант. А на будущее проще использовать 15. В ближайшем будущем прикручу автоматическую компиляцию врапера для обертки нетовских событий в комовские.
#35 by Кирпич
не видит он.
#36 by Serginio1
Да уж 5 дней уже страдает.
#37 by Сияющий в темноте
да птсатель прозаек сскачал шаблон а заполнить не смог
#38 by Сияющий в темноте
он там ещё и встр неправильно формирует его нужно создавать а не копировпть
#39 by alexkozin
у меня сейчас единственный вопрос остался, суть которого в следующем "почему отладчик не видит методов интерфейса ILanguageExtender кроме единственного 'RegisterExtensionAs'" По делу что-то будет сказано или забить уже мне? В примере от 1С был верхний вариант. В чем разница кроме того что написано по-разному?
#40 by Serginio1
Потому, что 33. Разница большая При ВК = Новый COMОбъект(ИмяВК) создается COMОбъект А при ВК = Новый(ИмяВК) Ищется ВК с зарегистрированным RegisterExtensionAs Один вызов твоей ВК делается при ПодключитьВнешнююКомпоненту(ИмяВК);
#41 by alexkozin
При ВК = Новый(ИмяВК) 1С вот такое говорит: vk_OLE : Общий член "CreateObject" для типа "_ComObject" не найден.. При чем говорит при вызове метода. Инициализируется без ошибок.
#42 by Serginio1
Имя Вк должно быть AddIn.vk_OLE
#43 by Serginio1
Чему у тебя равен c_AddinName
#44 by alexkozin
Const c_AddinName As String = "vk_OLE"
#45 by Serginio1
А ИмяВК? Вообще возьми любой рабочий пример и потихоньку его изменяй
#46 by alexkozin
Имя ВК тоже такое же vk_OLE. Фигня в том что на VB.NET нигде не могу найти нормального рабочего примера. Изначально именно так и хотел поступить, но куда ни ткнусь - везде облом.
#47 by MM
А можно будет выкладывать проект на какой-нибудь бесплатный ресурс? А то, стармани не безграничные (
#48 by Serginio1
Да мне не жалко. Просто никому это не нужно. Я всегда кто попросит отправляю на поччту
#49 by Serginio1
Берешь в руки ILSpy и декомпилируешь сборку в VB.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С