Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Где посмотреть список com объектов/интерфейсов 
:(
    Опции темы
V0fka
Дата 12.6.2013, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Привет!

Есть в коде следующее:

Код

[Guid("AB634005-F13D-11D0-A459-004095E1DAEA")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IStatusLine
{
    void SetStarusLine([MarshalAs(UnmanagedType.BStr)] String bstrStatusLine);
    void ResetStatusLine();
}


Код не мой, нашел пример в интернете. И есть вопрос: первые 2 строчки

[Guid("AB634005-F13D-11D0-A459-004095E1DAEA")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

говорят системе о том, что ниже представлен com интерфейс и искать его надо по ГУИДу такому-то? Если не так, то поправьте, пожалуйста, а если так, подскажите где можно увидеть определение/описание этого интерфейса (сигнатуру его методов)?
PM MAIL   Вверх
diadiavova
Дата 12.6.2013, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



V0fka, в обозревателе добавь в настраиваемый набор компонентов библиотеку с этим интерфейсом. Найти ее адрес можно в реестре. Код примерно такой
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;

namespace gettlbpath
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(GetTlbPath("0000000A-0000-0010-8000-00AA006D2EA4"));
            Console.ReadKey();
        }


        static string GetTlbPath(string interfaceGuid)
        {
            var interfaceguidrn = "{" + interfaceGuid + "}";
            var interfaceregistrybranch = Registry.ClassesRoot.OpenSubKey(string.Format(@"Interface\{0}\TypeLib", interfaceguidrn));
            var tlbguid = interfaceregistrybranch.GetValue("");
            var tlbversion = interfaceregistrybranch.GetValue("version");
            var tlbbranch = Registry.ClassesRoot.OpenSubKey(string.Format(@"TypeLib\{0}\{1}\0\win32", tlbguid, tlbversion));
            var tlbpath = tlbbranch.GetValue("");
            return Environment.ExpandEnvironmentVariables(tlbpath.ToString());
        }
    }
}

Конкретно с твоим гуидом у меня он не сработал, просто не нашел такой ветки в реестре, видимо у меня не установлена эта библиотека, но с тем, который я тут показал выдало путь
Код

C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll
Код приблизительный и всех нюансов видимо не учитывает, но куда копать, я думаю, понятно.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
V0fka
Дата 12.6.2013, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Я первым делом запустил поиск в реестре. Но не моего ГУИДа, не наименования интерфейса в реестре нету. Перепроверил кодом выше - эффекта тоже 0. Но этот интерфейс точно в системе есть, т.к. я могу объявить переменную этого типа и компилятор не ругнется, и ошибки во время исполнения тоже не возникает.
PM MAIL   Вверх
diadiavova
Дата 12.6.2013, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Есть библиотека для обзора ком-типов, прилагаю в аттаче. Ее надо зарегистрировать в системе, создать проект, добавить ссылку на нее и пользоваться ей не сложно. Можно так получить сведения и о типах и о местонахождении библиотеки и прочее. Там есть хелп, но не помню насколько он хорош. Еще два файла cmd для регистрации и отмены регистрации, но там прописан адрес библиотеки на моем компе, если решишь воспользоваться - измени. Можешь скачать эту либу еще откуда-нибудь, найти ее в сети можно(это если не опасаешься, что я вирусов туда накидал smile )

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  tlbinf.rar 194,64 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
V0fka
Дата 12.6.2013, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Для меня, как для не очень шарящего, из мануала не понятно нифига. + все на буржуйском... :(  smile 

Это сообщение отредактировал(а) V0fka - 12.6.2013, 14:29
PM MAIL   Вверх
diadiavova
Дата 12.6.2013, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(V0fka @  12.6.2013,  14:25 Найти цитируемый пост)
Но этот интерфейс точно в системе есть, т.к. я могу объявить переменную этого типа и компилятор не ругнется, и ошибки во время исполнения тоже не возникает.

Блин, а вот на это я внимания и не обратил. Так компилятор и не должен ругаться, ты объявил интерфейс, стало быть можешь создавать переменные и даже можешь реализовать его. Это еще не значит, что он есть в системе. Так что вряд ли он у тебя есть. Я уже не говорю о том, что в первом методе интерфейса явно ошибка в названии. Просто посмотри внимательнее тот сайт, откуда взял код. А вообще лучше бы ты задал вопрос, на который этот код по-твоему отвечает, возможно вопрос вообще решается иначе.

Пример работы с библиотекой выкладываю, но видимо это тебе не поможет. Я использовал реально существующий в системе класс
Код

       static void Main(string[] args)
        {
            var comtype = Type.GetTypeFromCLSID(new Guid("0D43FE01-F093-11CF-8940-00A0C9054228"));
            var comobj = Activator.CreateInstance(comtype);
            var hlpr = new TLI.TLIApplication();
            var clinf = hlpr.ClassInfoFromObject(comobj);
            foreach (TLI.InterfaceInfo intfc in clinf.Interfaces)
            {
                Console.WriteLine("Интерфейс: {0}",intfc.Name);
                foreach (TLI.MemberInfo mem in intfc.Members)
                {
                    Console.WriteLine("Тип члена: {0}; Имя: {1}",mem.InvokeKind,mem.Name);
                    
                }
            }
            Console.ReadKey();
        }
И код выдал это
Код

Интерфейс: IFileSystem3
Тип члена: INVOKE_FUNC; Имя: QueryInterface
Тип члена: INVOKE_FUNC; Имя: AddRef
Тип члена: INVOKE_FUNC; Имя: Release
Тип члена: INVOKE_FUNC; Имя: GetTypeInfoCount
Тип члена: INVOKE_FUNC; Имя: GetTypeInfo
Тип члена: INVOKE_FUNC; Имя: GetIDsOfNames
Тип члена: INVOKE_FUNC; Имя: Invoke
Тип члена: INVOKE_PROPERTYGET; Имя: Drives
Тип члена: INVOKE_FUNC; Имя: BuildPath
Тип члена: INVOKE_FUNC; Имя: GetDriveName
Тип члена: INVOKE_FUNC; Имя: GetParentFolderName
Тип члена: INVOKE_FUNC; Имя: GetFileName
Тип члена: INVOKE_FUNC; Имя: GetBaseName
Тип члена: INVOKE_FUNC; Имя: GetExtensionName
Тип члена: INVOKE_FUNC; Имя: GetAbsolutePathName
Тип члена: INVOKE_FUNC; Имя: GetTempName
Тип члена: INVOKE_FUNC; Имя: DriveExists
Тип члена: INVOKE_FUNC; Имя: FileExists
Тип члена: INVOKE_FUNC; Имя: FolderExists
Тип члена: INVOKE_FUNC; Имя: GetDrive
Тип члена: INVOKE_FUNC; Имя: GetFile
Тип члена: INVOKE_FUNC; Имя: GetFolder
Тип члена: INVOKE_FUNC; Имя: GetSpecialFolder
Тип члена: INVOKE_FUNC; Имя: DeleteFile
Тип члена: INVOKE_FUNC; Имя: DeleteFolder
Тип члена: INVOKE_FUNC; Имя: MoveFile
Тип члена: INVOKE_FUNC; Имя: MoveFolder
Тип члена: INVOKE_FUNC; Имя: CopyFile
Тип члена: INVOKE_FUNC; Имя: CopyFolder
Тип члена: INVOKE_FUNC; Имя: CreateFolder
Тип члена: INVOKE_FUNC; Имя: CreateTextFile
Тип члена: INVOKE_FUNC; Имя: OpenTextFile
Тип члена: INVOKE_FUNC; Имя: GetStandardStream
Тип члена: INVOKE_FUNC; Имя: GetFileVersion




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
V0fka
Дата 12.6.2013, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Расскажу почему я думаю, что оно работает.
Цитата(diadiavova @  12.6.2013,  15:30 Найти цитируемый пост)
Так компилятор и не должен ругаться, ты объявил интерфейс, стало быть можешь создавать переменные и даже можешь реализовать его. Это еще не значит, что он есть в системе.

Действительно, что-то я не это прощелкал.

Цитата(diadiavova @  12.6.2013,  15:30 Найти цитируемый пост)
Я уже не говорю о том, что в первом методе интерфейса явно ошибка в названии.

Ошибки точно нету (ниже разъясню). Почему ты решил, что там ошибка?

Цитата(diadiavova @  12.6.2013,  15:30 Найти цитируемый пост)
Просто посмотри внимательнее тот сайт, откуда взял код. А вообще лучше бы ты задал вопрос, на который этот код по-твоему отвечает, возможно вопрос вообще решается иначе.

Код рабочий. Это часть описания внешней компоненты для 1С. Конкретно этот интерфейс отвечает за вывод в строке статуса какой-то информации. Причем, если в описании этого интерфейса я уберу ГУИД - тогда возникает ошибка, а если уберу строку
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
то ошибки не возникает, но статус не отображается.

Поэтому я подумал (опять таки, в силу своей низкой квалификации), что раз такое дело, то интерфейс где-то должен быть зарегистрирован в системе и с конкретно таким ГУИДом. Но, как оказывается сейчас, по ходу это не так. Я и сделал так:

Код

var comtype = Type.GetTypeFromCLSID(new Guid("AB634005-F13D-11D0-A459-004095E1DAEA"));
var comobj = Activator.CreateInstance(comtype);


но в результате получил ошибку о том, что класс не зарегистрирован.

И из этого появляется другой вопрос: что это за ГУИД и зачем вторая строка (в коде в первом посте)? smile 
PM MAIL   Вверх
diadiavova
Дата 12.6.2013, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(V0fka @  12.6.2013,  17:43 Найти цитируемый пост)
Почему ты решил, что там ошибка?


Цитата(V0fka @  12.6.2013,  12:45 Найти цитируемый пост)
SetStarusLine

Метод действительно так называется? Может все-таки SetStatusLine? smile 
Цитата(V0fka @  12.6.2013,  17:43 Найти цитируемый пост)
то ошибки не возникает, но статус не отображается

Я так понимаю, код все-таки работает, но работающий код и то, что ты написал до этого - разные вещи.
Цитата(V0fka @  12.6.2013,  17:43 Найти цитируемый пост)
Причем, если в описании этого интерфейса я уберу ГУИД - тогда возникает ошибка

Ошибка возникает при использовании класса, но не при объявлении переменной. Что касается ошибки времени исполнения, то тут вопрос на чем сбой происходит, поскольку если просто объявить переменную то это к  сбою не приведет. Другой вопрос, если ты ее как-то инициируешь. Так вот, если тебе известен способ как это сделать, то в моем коде в шестой строчке передавай методу ClassInfoFromObject именно этот объект. А то, что ты процитировал мне нужно было для того, чтобы какой-то ком-объект создать. Ты его видимо через какой-то сервис получаешь.
Цитата(V0fka @  12.6.2013,  17:43 Найти цитируемый пост)
Поэтому я подумал (опять таки, в силу своей низкой квалификации), что раз такое дело, то интерфейс где-то должен быть зарегистрирован в системе и с конкретно таким ГУИДом.

Для того, чтобы CLR имела возможность создать объект, надо предоставить ей сведения о местонахождении библиотеки, которая его содержит. В твоем же случае объект(насколько я понял) создается внешней компонентой и как она это делает в принципе тебя не должно волновать. 
Цитата(V0fka @  12.6.2013,  17:43 Найти цитируемый пост)
что это за ГУИД и зачем вторая строка (в коде в первом посте)?

О второй строке читай здесь
http://msdn.microsoft.com/query/dev11.quer...%29&rd=true
и здесь
http://msdn.microsoft.com/ru-ru/library/46f8ac6z.aspx


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
V0fka
Дата 12.6.2013, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Цитата(diadiavova @  12.6.2013,  17:13 Найти цитируемый пост)
Метод действительно так называется? Может все-таки SetStatusLine?

Цитата(diadiavova @  12.6.2013,  17:13 Найти цитируемый пост)
Я так понимаю, код все-таки работает, но работающий код и то, что ты написал до этого - разные вещи.

Теперь вообще ничего не понимаю. В названии метода, действительно ошибка. Но оно же работает.. Взял обозвал метод по другому вообще

Код

[Guid("AB634005-F13D-11D0-A459-004095E1DAEA")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IStatusLine
{
    void hzSetStarusLine([MarshalAs(UnmanagedType.BStr)] String bstrStatusLine);
    void ResetStatusLine();
}


Сделал вызов этого нового метода

Код

IStatusLine statusLine = (IStatusLine)connect1c;
            for (long a = 1; a <= 50000; a++ )
            {
                statusLine.hzSetStarusLine("Состояние из компоненты" + a.ToString());
            }

Работает smile : строка состояния в 1С выводит сообщения компоненты.

Цитата(diadiavova @  12.6.2013,  17:13 Найти цитируемый пост)
А то, что ты процитировал мне нужно было для того, чтобы какой-то ком-объект создать. Ты его видимо через какой-то сервис получаешь.

Да, объект инициируется "где-то" и попадает ко мне в компоненту в методе инизиализации:

Код

public void Init([MarshalAs(UnmanagedType.IDispatch)] object connection)
        {
            connect1c = connection; // эта функция вызывается самой 1С
            statusLine = (IStatusLine)connection;
             ...
        }


Цитата(diadiavova @  12.6.2013,  17:13 Найти цитируемый пост)
Для того, чтобы CLR имела возможность создать объект, надо предоставить ей сведения о местонахождении библиотеки, которая его содержит. В твоем же случае объект(насколько я понял) создается внешней компонентой и как она это делает в принципе тебя не должно волновать. 

Понял. Но к этому посту интересуют ещё немного другие вещи: зачем в объявлении интерфейса ГУИД (по приведенным ссылочкам на "2 строчку" я прочитал, представление об этом получил, спасибо!) и почему всё это работает, несмотря на то, что я в интерфейсе метод переобзываю. smile 
PM MAIL   Вверх
diadiavova
Дата 12.6.2013, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(V0fka @  12.6.2013,  18:50 Найти цитируемый пост)
Да, объект инициируется "где-то" и попадает ко мне в компоненту в методе инизиализации:

Вот и просмотри эти объекты с помощью той библиотеки, если это еще актуально.
Цитата(V0fka @  12.6.2013,  18:50 Найти цитируемый пост)
зачем в объявлении интерфейса ГУИД 

Так по нему интерфейс идентифицируется. Обычно ты кидаешь ссылку на библиотеку, где объявлен тип и благодаря этому по имени тип точно идентифицируется. Здесь у тебя нет ссылки(это не CLR тип), поэтому надо как-то идентифицировать интерфейс, для этого и используются Глобально-Уникальные ИДентификаторы. То есть каждый такой идентификатор сопоставлен какому-то типу, это что-то вроде того, как ты обращаешься к типу по имени, только здесь это имя уникально в глобальном масштабе. От как-то так. smile 
Цитата(V0fka @  12.6.2013,  18:50 Найти цитируемый пост)
и почему всё это работает, несмотря на то, что я в интерфейсе метод переобзываю. 

Вот здесь я затрудняюсь сказать. Могу предположить, что поиск нужного метода более сложен, чем сопоставление имен, возможно проверяются сигнатуры и все такое, а поскольку в интерфейсе только один метод с такой  сигнатурой, то он и находится. Но это просто предположение.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
V0fka
Дата 12.6.2013, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Цитата(diadiavova @  12.6.2013,  19:00 Найти цитируемый пост)
Вот и просмотри эти объекты с помощью той библиотеки, если это еще актуально.

Сейчас посмотреть не могу, поэкспериментирую завтра. smile

Цитата(diadiavova @  12.6.2013,  19:00 Найти цитируемый пост)
Так по нему интерфейс идентифицируется. Обычно ты кидаешь ссылку на библиотеку, где объявлен тип и благодаря этому по имени тип точно идентифицируется. Здесь у тебя нет ссылки(это не CLR тип), поэтому надо как-то идентифицировать интерфейс, для этого и используются Глобально-Уникальные ИДентификаторы. То есть каждый такой идентификатор сопоставлен какому-то типу, это что-то вроде того, как ты обращаешься к типу по имени, только здесь это имя уникально в глобальном масштабе. От как-то так. 

Я другого не пойму. Я бы успокоился, если бы где-то (в реестре, например) я обнаружил бы какую-то запись с соответствием этого ГУИД-а какому-то типу данных. А так как система может идентифицировать интерфейс, если это хз что за ГУИД вообще? Вот что не дает покоя пытливому уму smile .

Цитата(diadiavova @  12.6.2013,  19:00 Найти цитируемый пост)
Вот здесь я затрудняюсь сказать. Могу предположить, что поиск нужного метода более сложен, чем сопоставление имен, возможно проверяются сигнатуры и все такое, а поскольку в интерфейсе только один метод с такой  сигнатурой, то он и находится. Но это просто предположение.

Тоже завтра поиграюсь с этим всем  smile 

И спасибо тебе, дядяВова, за ответы! Я очень признателен! smile 
PM MAIL   Вверх
diadiavova
Дата 13.6.2013, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(V0fka @  12.6.2013,  20:33 Найти цитируемый пост)
Я бы успокоился, если бы где-то (в реестре, например) я обнаружил бы какую-то запись с соответствием этого ГУИД-а какому-то типу данных. А так как система может идентифицировать интерфейс, если это хз что за ГУИД вообще? Вот что не дает покоя пытливому уму 

ГУИД - это просто идентификатор типа и все. Изначально их придумали видимо именно для того, чтобы можно было регистрировать в системе и все такое, но вообще, это просто идентификатор типа. Внутри библиотеки типам можно дать уникальные в ее пределах имена и этого будет достаточно, но когда объект может быть получен неизвестно откуда ( в том числе с другой машины), то нужна система идентификации, при которой один тип не может быть принят за другой. ГУИД дает такую возможность в силу того, что это очень большое число и вероятность случайного совпадения гуидов практически нулевая. 



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
V0fka
Дата 13.6.2013, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Цитата(diadiavova @  13.6.2013,  10:12 Найти цитируемый пост)
ГУИД - это просто идентификатор типа и все. Изначально их придумали видимо именно для того, чтобы можно было регистрировать в системе и все такое, но вообще, это просто идентификатор типа. Внутри библиотеки типам можно дать уникальные в ее пределах имена и этого будет достаточно, но когда объект может быть получен неизвестно откуда ( в том числе с другой машины), то нужна система идентификации, при которой один тип не может быть принят за другой. ГУИД дает такую возможность в силу того, что это очень большое число и вероятность случайного совпадения гуидов практически нулевая. 

Это я знаю. Но для того, чтобы система по ГУИДу могла идентифицировать объект - в ней где-то должна храниться информация о том, что такой-то ГУИД - это такой-от объект. Причем даже если в системе будут объекты с одинаковыми наименованиями, то их всеравно можно будет находить и отличать по ГУИД-у, т.к. вероятность того, что в мире есть 2 одинаковых ГУИДа - стремится к нулю. Отсюда я делаю вывод, что этот ГУИД над этим объектом (интерфейсом) не с проста. Для того, чтобы удостовериться в этом, я поменял его и при попытке инициализации компоненты - получаю ошибку. Т.е. этот ГУИД должен быть именно таким. Но почему? Если информации в реестре по нему нигде нету (т.е. система не знает, что с такому ГУИД-у соответствует такой-то объект), то где этот ГУИД используется и зачем? Вот в чем вопрос smile . Я предположил, что может быть как-то извне (из 1С) этот интерфейс ищется по это ГУИД-у, это возможно?

Если то что я выше говорю непонятно, попробую задать вопрос по другому: зачем помечать интерфейс (или какой-то класс) атрибутом ГУИД, как и где это можно использовать?

Цитата(diadiavova @  12.6.2013,  19:00 Найти цитируемый пост)
Вот здесь я затрудняюсь сказать. Могу предположить, что поиск нужного метода более сложен, чем сопоставление имен, возможно проверяются сигнатуры и все такое, а поскольку в интерфейсе только один метод с такой  сигнатурой, то он и находится. Но это просто предположение.

Импирическим методом я установил, что вызывается первый в списке метод с нужной сигнатурой, причем имя метода - по барабану. smile Такое может быть?
PM MAIL   Вверх
diadiavova
Дата 13.6.2013, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(V0fka @  13.6.2013,  16:06 Найти цитируемый пост)
Но для того, чтобы система по ГУИДу могла идентифицировать объект - в ней где-то должна храниться информация о том, что такой-то ГУИД - это такой-от объект.

А это я знаю. Только система тут ни при чем. Тебе не надо, чтобы система создавала объект по гуиду, его создает программа, в которой этот класс определен и ей для создания экземпляра реестр не нужен, а твоя настройка получает этот объект в готовом виде и тебе только надо сопоставить его с интерфейсом и не с абы каким, а именно с тем, который надо. Вот для того, чтобы их можно было сопоставить и нужен гуид.
Цитата(V0fka @  13.6.2013,  16:06 Найти цитируемый пост)
Если информации в реестре по нему нигде нету (т.е. система не знает, что с такому ГУИД-у соответствует такой-то объект), то где этот ГУИД используется и зачем?

Ну представь себе, что это не ком вовсе, а просто надо привести объект к интерфейсному типу. И что, ты можешь любой объект к любому интерфейсу привести что ли?  smile Нет, для того, чтобы CLR могла идентифицировать эти типы используются имена. А здесь имена не помогут, поскольку в твоей надстройке нет ссылки на библиотеку, в которой определен интерфейс и вообще ком - это совсем другая технология. И как программа определит, что это именно тот интерфейс, который нужен? smile Тут не в системе дело, поскольку нет необходимости искать библиотеку, в которой определен класс или интерфейс.
Цитата(V0fka @  13.6.2013,  16:06 Найти цитируемый пост)
Импирическим методом я установил, что вызывается первый в списке метод с нужной сигнатурой, причем имя метода - по барабану. smile Такое может быть? 

Да, может, поскольку имя - не вполне надежный идентификатор(там могут быть проблемы с той же кодировкой к примеру). Гуид указывает на то, что это именно тот интерфейс, поэтому для поиска членов могут использоваться разные подходы. Но опять-таки, это предположение.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
V0fka
Дата 13.6.2013, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Определенные моменты прояснились, но появились новые вопросы по технической реализации smile . Но ко мне подошла совесть и сказала: "Вован, хватит человека задалбывать" smile . Вообще C# для меня сейчас - это хобби, я прочитал по нему пару книг, несколько видеокурсов посмотрел. И очень печально, что там ничего не рассказывалось про com, про взаимодействие управляемого и неуправляемого кода.

diadiavova, большое тебе спасибо за помощь! smile 
PM MAIL   Вверх
diadiavova
Дата 13.6.2013, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(V0fka @  13.6.2013,  17:45 Найти цитируемый пост)
И очень печально, что там ничего не рассказывалось про com, про взаимодействие управляемого и неуправляемого кода.

По этому вопросу полезной информации вообще мало. Документация здесь
http://msdn.microsoft.com/en-us/library/ke...v=vs.71%29.aspx
Так же не забываем об этом
https://www.google.ru/search?q=.net+com+int...366&bih=646
Где-то на мсдн попадалась документация на русском по этому вопросу, можно поискать в разделах по прежним версиям фреймворка. Ну, а так это дело темное и у меня вообще сложилось ощущение, что для хорошего понимания этого вопроса надо обе технологии хорошо знать. Еще можно посмотреть документацию по классам пространства имен System.Runtime.InteropServices, начать можно с класса Marshal. Оттуда можно погулять по ссылкам, которые там кое-где приводятся и таким образом составить представление о вопросе.
Цитата(V0fka @  13.6.2013,  17:45 Найти цитируемый пост)
diadiavova, большое тебе спасибо за помощь! 

Пользуйся на здоровье smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1015 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.