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

Изначально было наверное не правильно создавать COM через позднее связывание и затем вызывать его методы через InvokeMember.
Но сейчас, пожалуй, уже поздно все переделывать заново.

Подскажите как быть пожалуйста.

Имеется COM объект в DLL. Написан на Delphi7.

В C# он используется так:

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




Сейчас нужно добавить к нему возможность, чтобы он вызывал методы сервера (ну т.е. того, кто держит в себе этот COM объект)

Для этого, доработал COM объект, описав в его TLB дополнительный интерфейс

Код: pascal
1.
2.
3.
  IHookCallback = interface(IDispatch)
    procedure ServerHook(DoStuff: integer); safecall;
  end;



А также, в основной его интерфейс добавил метод инициализации коллбэка
Код: pascal
1.
procedure SetupHook(const Callback: IHookCallback); safecall;



После чего, импортировал в проект VS эту DLL с COMом внутри. Благодаря чему получил доступ к описанию интерфейса.

Затем (в VS) создал класс, реализующий этот интерфейс.
Создаю этот объект.
И пытаюсь передать его в COM через InvokeMember

Код: c#
1.
2.
// COM мы уже создали раньше
comType.InvokeMember("SetupHook", BindingFlags.InvokeMethod, null, srvObj, new object[] {SomeClass as IHookCallback});




ииииии. Не работает блин.

Вылетает ошибка:
Код: c#
1.
Exception has been thrown by the target of an invocation.


и его innerException:
Код: c#
1.
Specified cast is not valid.



Подскажите пожалуйста, как надо правильно !
...
Рейтинг: 0 / 0
Как передать в COM интерфейс, если обращения идут через InvokeMember ?
    #38497767
MsSql_Study
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот как интерфейс описан в Delphi

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
// Interface: IHookCallback
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {3586BB08-CEDD-466C-85E6-5CEAE4DFB15F}
// *********************************************************************//
  IHookCallback = interface(IDispatch)
    ['{3586BB08-CEDD-466C-85E6-5CEAE4DFB15F}']
    procedure ServerHook(DoStuff: SYSINT); safecall;
  end;




и описание импортированной библиотеки, как оно видится в VS

Код: c#
1.
2.
3.
4.
5.
6.
7.
    [TypeLibType(4160)]
    [Guid("3586BB08-CEDD-466C-85E6-5CEAE4DFB15F")]
    public interface IHookCallback
    {
        [DispId(201)]
        void ServerHook(DoStuff: integer);
    }
...
Рейтинг: 0 / 0
Как передать в COM интерфейс, если обращения идут через InvokeMember ?
    #38499702
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MsSql_Study,
SomeClass что за зверь? В отладчике что показывает?
Что будет если попробовать использовать dynamic, а не InvokeMember?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как передать в COM интерфейс, если обращения идут через InvokeMember ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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