powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Еще пара вопросов по COM.
6 сообщений из 6, страница 1 из 1
Еще пара вопросов по COM.
    #38484004
MsSql_Study
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.

Дайте совет пожалуйста.

Приложение C# использует COM Объекты. Они написаны на Delphi 7 (хотя по идее разницы не должно быть, ввиду природы COM)

Работа с COM объектом, ведется через "позднее связывание", без библиотек типов.
Код: c#
1.
2.
3.
4.
Type comType = Type.GetTypeFromProgID(ProgID, false);
object comObj = Activator.CreateInstance(comType);
// и далее вызываем методы
comType.InvokeMember("DoLongWork", BindingFlags.InvokeMethod, null, comObj, null);



Сейчас назрела необходимость добавить новый функционал - но с учетом best practices. А именно, вместо переписывания давно использующегося интерфейса, добавить еще один. Ну и переделать часть COMов (до которых смогу добраться) - чтобы они реализовали еще и новый интерфейс. Ну и в процессе работы, нужно будет проверять - реализует ли COM новый интерфейс, и если да то использовать еще и новый функционал.

Собственно вопросы.

1. Как можно в C# запросить у COM'а, поддерживает ли он некий интерфейс и вызвать метод этого интерфейса ?
т.е. нужно проверять, поддерживает ли COM новый функционал, и только тогда использовать его.

2. Нужно добавить "обратный вызов" в интерфейс. Чтобы COM объект мог сообщать серверу о событиях.
Как реализовать в C# инициализацию, с передачей ссылки на свой метод ? Чтобы мол COM Объект потом дергал этот метод и передавал в него параметры ?

Спасибо !
...
Рейтинг: 0 / 0
Еще пара вопросов по COM.
    #38484113
MsSql_Study
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дополнение к 1му вопросу.

Подскажите как можно у COM объекта выяснить, что он реализовал метод интерфейса ?

Дело в том, что получается МОЖНО дорабатывать интерфейс (добавлять новые методы) и создавать на его основе классы. И после этого можно вызывать старые COMы (те которые реализовали версию интерфейса без новых методов) - нужно лишь не вызывать новые методы !

Я удивлен, но это работает !

Вопрос лишь - а как узнать то, реализует метод или нет ?
...
Рейтинг: 0 / 0
Еще пара вопросов по COM.
    #38484136
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MsSql_Studyвызвать метод этого интерфейса ?
поиметь описание этого интерфейса на c# с указанием атрибутов giuid ну например
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
[Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99"), InterfaceType(1)]
    [ComImport]
    public interface IPropertyStore
    {
        void GetCount(out uint cProps);
        void GetAt([In] uint iProp, out PROPERTYKEY pKey);
        void GetValue([In] ref PROPERTYKEY key, out PROPVARIANT pv);
        void SetValue([In] ref PROPERTYKEY key, [In] ref PROPVARIANT propvar);
        void Commit();
    }


далее
Код: c#
1.
IPropertyStore p = comObj as IPropertyStore



если p не нулл - вызывать методы
...
Рейтинг: 0 / 0
Еще пара вопросов по COM.
    #38486036
MsSql_Study
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Вопрос в том, можно ли узнать у COM объекта, который я создал, что есть ли у него метод с конкретным именем ?

Например
Код: c#
1.
2.
3.
4.
Type comType = Type.GetTypeFromProgID(ProgID, false);
object comObj = Activator.CreateInstance(comType);
// и далее вызываем методы
comType.InvokeMember("DoLongWork", BindingFlags.InvokeMethod, null, comObj, null);



Можно ли перед вызовом проверить, что метод "DoLongWork" имеется ?
...
Рейтинг: 0 / 0
Еще пара вопросов по COM.
    #38486111
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MsSql_StudyДело в том, что получается МОЖНО дорабатывать интерфейс (добавлять новые методы) и создавать на его основе классы. И после этого можно вызывать старые COMы (те которые реализовали версию интерфейса без новых методов) - нужно лишь не вызывать новые методы !

Я удивлен, но это работает !
работать то работает, но это нарушает правила COM - нужно создавать новый интерфейс наследуя от существующего(это о COM-сервере речь), далее выяснить, реализует ли сервер нужный интерфейс


MsSql_StudyМожно ли перед вызовом проверить, что метод "DoLongWork" имеется ?
Можно, но известный мне способ не особо изящен (прямой вызов IDispatch.GetIDsOfNames)
...
Рейтинг: 0 / 0
Еще пара вопросов по COM.
    #38489611
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MsSql_Study,

ответы ещё интересуют?
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Еще пара вопросов по COM.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]