![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
V0fka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 5.11.2006 Где: Украина Репутация: нет Всего: нет |
Привет!
Есть в коде следующее:
Код не мой, нашел пример в интернете. И есть вопрос: первые 2 строчки [Guid("AB634005-F13D-11D0-A459-004095E1DAEA")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] говорят системе о том, что ниже представлен com интерфейс и искать его надо по ГУИДу такому-то? Если не так, то поправьте, пожалуйста, а если так, подскажите где можно увидеть определение/описание этого интерфейса (сигнатуру его методов)? |
|||
|
||||
diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
V0fka, в обозревателе добавь в настраиваемый набор компонентов библиотеку с этим интерфейсом. Найти ее адрес можно в реестре. Код примерно такой
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||
|
|||||
V0fka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 5.11.2006 Где: Украина Репутация: нет Всего: нет |
Я первым делом запустил поиск в реестре. Но не моего ГУИДа, не наименования интерфейса в реестре нету. Перепроверил кодом выше - эффекта тоже 0. Но этот интерфейс точно в системе есть, т.к. я могу объявить переменную этого типа и компилятор не ругнется, и ошибки во время исполнения тоже не возникает.
|
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Есть библиотека для обзора ком-типов, прилагаю в аттаче. Ее надо зарегистрировать в системе, создать проект, добавить ссылку на нее и пользоваться ей не сложно. Можно так получить сведения и о типах и о местонахождении библиотеки и прочее. Там есть хелп, но не помню насколько он хорош. Еще два файла cmd для регистрации и отмены регистрации, но там прописан адрес библиотеки на моем компе, если решишь воспользоваться - измени. Можешь скачать эту либу еще откуда-нибудь, найти ее в сети можно(это если не опасаешься, что я вирусов туда накидал
![]() Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
V0fka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 5.11.2006 Где: Украина Репутация: нет Всего: нет |
Для меня, как для не очень шарящего, из мануала не понятно нифига. + все на буржуйском... :(
![]() Это сообщение отредактировал(а) V0fka - 12.6.2013, 14:29 |
|||
|
||||
diadiavova |
|
||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Блин, а вот на это я внимания и не обратил. Так компилятор и не должен ругаться, ты объявил интерфейс, стало быть можешь создавать переменные и даже можешь реализовать его. Это еще не значит, что он есть в системе. Так что вряд ли он у тебя есть. Я уже не говорю о том, что в первом методе интерфейса явно ошибка в названии. Просто посмотри внимательнее тот сайт, откуда взял код. А вообще лучше бы ты задал вопрос, на который этот код по-твоему отвечает, возможно вопрос вообще решается иначе. Пример работы с библиотекой выкладываю, но видимо это тебе не поможет. Я использовал реально существующий в системе класс
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||||
|
|||||||
V0fka |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 5.11.2006 Где: Украина Репутация: нет Всего: нет |
Расскажу почему я думаю, что оно работает.
Действительно, что-то я не это прощелкал.
Ошибки точно нету (ниже разъясню). Почему ты решил, что там ошибка? Код рабочий. Это часть описания внешней компоненты для 1С. Конкретно этот интерфейс отвечает за вывод в строке статуса какой-то информации. Причем, если в описании этого интерфейса я уберу ГУИД - тогда возникает ошибка, а если уберу строку [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] то ошибки не возникает, но статус не отображается. Поэтому я подумал (опять таки, в силу своей низкой квалификации), что раз такое дело, то интерфейс где-то должен быть зарегистрирован в системе и с конкретно таким ГУИДом. Но, как оказывается сейчас, по ходу это не так. Я и сделал так:
но в результате получил ошибку о том, что класс не зарегистрирован. И из этого появляется другой вопрос: что это за ГУИД и зачем вторая строка (в коде в первом посте)? ![]() |
||||
|
|||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Метод действительно так называется? Может все-таки SetStatusLine? ![]() Я так понимаю, код все-таки работает, но работающий код и то, что ты написал до этого - разные вещи.
Ошибка возникает при использовании класса, но не при объявлении переменной. Что касается ошибки времени исполнения, то тут вопрос на чем сбой происходит, поскольку если просто объявить переменную то это к сбою не приведет. Другой вопрос, если ты ее как-то инициируешь. Так вот, если тебе известен способ как это сделать, то в моем коде в шестой строчке передавай методу ClassInfoFromObject именно этот объект. А то, что ты процитировал мне нужно было для того, чтобы какой-то ком-объект создать. Ты его видимо через какой-то сервис получаешь. Для того, чтобы CLR имела возможность создать объект, надо предоставить ей сведения о местонахождении библиотеки, которая его содержит. В твоем же случае объект(насколько я понял) создается внешней компонентой и как она это делает в принципе тебя не должно волновать. О второй строке читай здесь http://msdn.microsoft.com/query/dev11.quer...%29&rd=true и здесь http://msdn.microsoft.com/ru-ru/library/46f8ac6z.aspx -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
V0fka |
|
||||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 5.11.2006 Где: Украина Репутация: нет Всего: нет |
Теперь вообще ничего не понимаю. В названии метода, действительно ошибка. Но оно же работает.. Взял обозвал метод по другому вообще
Сделал вызов этого нового метода
Работает ![]()
Да, объект инициируется "где-то" и попадает ко мне в компоненту в методе инизиализации:
Понял. Но к этому посту интересуют ещё немного другие вещи: зачем в объявлении интерфейса ГУИД (по приведенным ссылочкам на "2 строчку" я прочитал, представление об этом получил, спасибо!) и почему всё это работает, несмотря на то, что я в интерфейсе метод переобзываю. ![]() |
||||||||||||
|
|||||||||||||
diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Вот и просмотри эти объекты с помощью той библиотеки, если это еще актуально. Так по нему интерфейс идентифицируется. Обычно ты кидаешь ссылку на библиотеку, где объявлен тип и благодаря этому по имени тип точно идентифицируется. Здесь у тебя нет ссылки(это не CLR тип), поэтому надо как-то идентифицировать интерфейс, для этого и используются Глобально-Уникальные ИДентификаторы. То есть каждый такой идентификатор сопоставлен какому-то типу, это что-то вроде того, как ты обращаешься к типу по имени, только здесь это имя уникально в глобальном масштабе. От как-то так. ![]()
Вот здесь я затрудняюсь сказать. Могу предположить, что поиск нужного метода более сложен, чем сопоставление имен, возможно проверяются сигнатуры и все такое, а поскольку в интерфейсе только один метод с такой сигнатурой, то он и находится. Но это просто предположение. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||
|
|||||
V0fka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 5.11.2006 Где: Украина Репутация: нет Всего: нет |
Сейчас посмотреть не могу, поэкспериментирую завтра. ![]() Я другого не пойму. Я бы успокоился, если бы где-то (в реестре, например) я обнаружил бы какую-то запись с соответствием этого ГУИД-а какому-то типу данных. А так как система может идентифицировать интерфейс, если это хз что за ГУИД вообще? Вот что не дает покоя пытливому уму ![]() Тоже завтра поиграюсь с этим всем ![]() И спасибо тебе, дядяВова, за ответы! Я очень признателен! ![]() |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
ГУИД - это просто идентификатор типа и все. Изначально их придумали видимо именно для того, чтобы можно было регистрировать в системе и все такое, но вообще, это просто идентификатор типа. Внутри библиотеки типам можно дать уникальные в ее пределах имена и этого будет достаточно, но когда объект может быть получен неизвестно откуда ( в том числе с другой машины), то нужна система идентификации, при которой один тип не может быть принят за другой. ГУИД дает такую возможность в силу того, что это очень большое число и вероятность случайного совпадения гуидов практически нулевая. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
V0fka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 5.11.2006 Где: Украина Репутация: нет Всего: нет |
Это я знаю. Но для того, чтобы система по ГУИДу могла идентифицировать объект - в ней где-то должна храниться информация о том, что такой-то ГУИД - это такой-от объект. Причем даже если в системе будут объекты с одинаковыми наименованиями, то их всеравно можно будет находить и отличать по ГУИД-у, т.к. вероятность того, что в мире есть 2 одинаковых ГУИДа - стремится к нулю. Отсюда я делаю вывод, что этот ГУИД над этим объектом (интерфейсом) не с проста. Для того, чтобы удостовериться в этом, я поменял его и при попытке инициализации компоненты - получаю ошибку. Т.е. этот ГУИД должен быть именно таким. Но почему? Если информации в реестре по нему нигде нету (т.е. система не знает, что с такому ГУИД-у соответствует такой-то объект), то где этот ГУИД используется и зачем? Вот в чем вопрос ![]() Если то что я выше говорю непонятно, попробую задать вопрос по другому: зачем помечать интерфейс (или какой-то класс) атрибутом ГУИД, как и где это можно использовать? Импирическим методом я установил, что вызывается первый в списке метод с нужной сигнатурой, причем имя метода - по барабану. ![]() |
|||
|
||||
diadiavova |
|
||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
А это я знаю. Только система тут ни при чем. Тебе не надо, чтобы система создавала объект по гуиду, его создает программа, в которой этот класс определен и ей для создания экземпляра реестр не нужен, а твоя настройка получает этот объект в готовом виде и тебе только надо сопоставить его с интерфейсом и не с абы каким, а именно с тем, который надо. Вот для того, чтобы их можно было сопоставить и нужен гуид.
Ну представь себе, что это не ком вовсе, а просто надо привести объект к интерфейсному типу. И что, ты можешь любой объект к любому интерфейсу привести что ли? ![]() ![]()
Да, может, поскольку имя - не вполне надежный идентификатор(там могут быть проблемы с той же кодировкой к примеру). Гуид указывает на то, что это именно тот интерфейс, поэтому для поиска членов могут использоваться разные подходы. Но опять-таки, это предположение. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||||
|
|||||||
V0fka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 5.11.2006 Где: Украина Репутация: нет Всего: нет |
Определенные моменты прояснились, но появились новые вопросы по технической реализации
![]() ![]() diadiavova, большое тебе спасибо за помощь! ![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |