2013-09-12 4 views
1

Попытка подключить библиотеку COM, которую мы используем, чтобы говорить с вещами в .NET. В VB6, то же самое мог, было сделано, просто делаяПоймать COM-события?

private withevents _monitor as new Application 

и тогда я мог бы сделать

monitor_onPrintText(byval msg as string, byval draw as boolean) 

и он будет работать, когда что-то было напечатано на стороне монитора, он будет стрелять событие и отправить нам обратно. Однако в C# я могу выполнять команды, но я не получаю нормальные вещи, как в VB6. Я просто любопытно, что я делаю не так, как все, что я прочитал, говорит

_monitor.onPrintText += onPrintText; 

должен работать, но я не в состоянии получить событие огонь.

Я пробовал this codeproject project, and MSDN и кучу других ресурсов там, но я не могу получить эту чертову вещь для работы! Вот основы кода, я добавил все три «интерфейса», созданные путем импорта объекта com, и я пробовал всевозможные комбинации. Мой «запуск» скрипт должен вернуть истинный, и огонь.Пушка onPrintText событие несколько раз с некоторыми сообщениями по пути (или, по крайней мере, вот что он делает в VB6 ...)

using System; 
using monitorLib; 

public class MyClass 
{ 
    private Application _monitor; 

    public MyClass() 
    { 
     _monitor = new Application; 
     _monitor.onPrintText += onPrintText; 

     // Doing this runs a "script" which causes the 
     // event to fire whenever print is called from it. 
     _monitor.evaluate("run(\"startup\");"); 
    } 


    public dynamic Evaluate(string pScript) 
    { 
     return _monitor.evaluate(pScript); 
    } 

    public void PrintText(string p_text, bool p_drawNow) 
    { 
     debug.print(p_text); 
    } 
} 
+0

Я немного смущен относительно того, что вы пытаетесь сделать. Вы хотите отправить текст на объект COM? Или вы хотите захватить события, запущенные объектом COM? или оба? – paqogomez

+0

Отредактировано на основе предложений от Hans – Calvin

+0

Пробовал ли вы 'var source = (IApplicationEvents_Events) _monitor;' как это было предложено @Hans? – paqogomez

ответ

3
public class MyClass : IApplication, IApplicationEvents, IApplicationEvents_Event 

Что-то пошло очень неправильно здесь. Возможно, это намеренно, но это сомнительно. Это сервер, который реализует интерфейсы, клиент просто использует их. Вы написали код, который должен написать сервер. Он должен реализовать все интерфейсы, которые предоставляет сервер. Но MyClass определенно похож на клиентский код, который просто использует сервер.

Не знаете, как вы попали в этот рассол, возможно, вы всегда писали серверы и никогда не использовали код клиента. Другим возможным объяснением является то, что COM позволяет серверу реализовывать несколько интерфейсов, которые генерируют события. Не то, что вы можете сделать на C#. Чтобы продвинуться вперед, вам придется удалить все эти унаследованные интерфейсы и код, который вы написали, чтобы реализовать их. Тогда либо попробуйте:

public MyClass() { 
    _monitor = new Application(); 
    _monitor.onPrintText += onPrintText; 
} 

Как вы обычно пишете. Если событие не реализован интерфейс по умолчанию [источник], то вы, возможно, придется написать:

public MyClass() { 
    _monitor = new Application; 
    var source = (IApplicationEvents_Events)_monitor; 
    source.onPrintText += onPrintText; 
} 

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

+0

Что-нибудь конкретное, что вам нужно от обозревателя объектов? Я отредактировал свой пост с вашими предложениями, попробовал оба метода, и событие все еще не срабатывает. – Calvin

+0

Ну, все, что я понял из редактирования, это то, что вы не на самом деле означает реализовать эти интерфейсы.Так что вы действительно хотели реализовать клиент, а не сервер.Прогресс. Я еще не знаю, когда COM-сервер собирается запустить событие. –

+0

Я на самом деле просто получил его работу, оказывается, я использовал приложение, а не ApplicationClass.Я раньше пытался использовать ApplicationClass, но поскольку я реализовал все интерфейсы, он вызывал ошибку. (Ссылка на ссылку, я думаю?) Спасибо за помощь! – Calvin

1

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

Интерфейсы от COM будут использоваться для продлить функциональность компонента. Они не понадобятся, если вы просто пытаетесь отправить или получить информацию от своего компонента или от него.

Ваш код выглядит нормально, если вы просто пытаетесь получить или отправить информацию в компонент COM.

Вам нужно:

  1. Удалить все интерфейсы с вашего объявления класса.
  2. Удалить метод IApplicationEvents_onPrintTextEventHandler.
  3. Добавьте ссылку на свой COM элемент управления в свой проект, а затем создайте его как любой тип.

(Подсказка: Application очень вероятно, не тип вашего контроля)

Пока этот элемент управления имеет событие называется onPrintText и метод, называемый evaluate тогда вы вызываете их просто отлично.

+0

I ' я отредактировал сообщение, чтобы быть более ясным (это то, что я на самом деле имел, прежде чем я только начал все пытаться) технически, приложение monitorLib.Application. – Calvin

+0

Я вижу, ну, думаю, ваша первая попытка была ближе. Очки для привлечения внимания! :) Вы попробовали 'var source = (IApplicationEvents_Events) _monitor;'? – paqogomez

+0

На самом деле, возможно, вы правы ... Я заметил, что приложение является интерфейсом. Существует класс под названием ApplicationClass, который, как представляется, содержит много одинаковых вещей? Я думаю, потому что раньше я наследовал все эти классы, это не позволяло мне использовать его. (возможно, круглая ссылка?) – Calvin

Смежные вопросы