Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > c# vs vb.net


Автор: infarch 21.11.2011, 13:04
Возникла у меня необходимость написать приложение на c#. Простая форма, а на ней - ActiveX контрол. Если кто знает - AutoVue от Оракла. Документации практически нет, только скудный пример на бейсике. Ну хорошо, форму создал, контрол работает. Теперь надо слушать его события. Вот кусок из того примера на бейсике.

Код

    Private Sub AxJVueAXControl1_onFileEvent(ByVal sender As System.Object, ByVal e As AxJVueAXLib.IID_ISource_onFileEventEvent) Handles AxJVueAXControl1.onFileEvent
        Dim EventID As Integer
        EventID = e.arg0.getEventID()
        If EventID = EVENTID_FILEEVENT_ONSETFILE Then
            UpdateMessage()
        ElseIf EventID = EVENTID_FILEEVENT_ONSETPAGE Then
            UpdateMessage()
        End If
    End Sub


Главное что меня интересует: EventID = e.arg0.getEventID(). Надо получит айди события. Начал писать на c#:

Код

       void av_onFileEvent(object sender, AxJVueAXLib.IID_ISource_onFileEventEvent e)
        {
            e.arg0...
        }


И вот тут облом ( arg0 имеет тип Object и никакого getEventID там нет. Через e.arg0.GetType() уточнил что тип его на самом деле System.__ComObject. И что это за тип? Студия притворяется что не знает такого. А бейсик работает себе, гад такой. Ну не верю я что он круче! Да и не подходит мне он, на си написать надо. Может кто подскажет как выкрутиться из ситуации?



Автор: diadiavova 21.11.2011, 20:41
Цитата(infarch @  21.11.2011,  14:04 Найти цитируемый пост)
Ну не верю я что он круче!

Круче, круче - не сомневайся smile

Цитата(infarch @  21.11.2011,  14:04 Найти цитируемый пост)
Может кто подскажет как выкрутиться из ситуации?

На самом деле, если ты пишешь на последней(в данный момент 4-ой) версии шарпа, то можно использовать что-то вроде
Код

dynamic arg0 = e.arg0
EventID = arg0.getEventID()
В противном случае придется иметь дело с рефлексией и тянуть все оттуда.

Автор: Fortnox 21.11.2011, 22:56
Мм, помню был похожий случай, когда я делал экспорт в Word одной фигни. Помогло приведение типов.
Может в вашем случае, достаточно привести е к типу AxJVueAXLib.IID_ISource_onFileEventEvent (или посмотреть, как тип во время отладки).

Автор: diadiavova 22.11.2011, 00:04
Цитата(Fortnox @  21.11.2011,  23:56 Найти цитируемый пост)
Может в вашем случае, достаточно привести е к типу AxJVueAXLib.IID_ISource_onFileEventEvent (или посмотреть, как тип во время отладки). 

Ну он же написал, что тип - _ComObject

Автор: Voyager 22.11.2011, 08:53
Ну и что, _ComObject можно приводить к соответствующим интерфейсам.

Автор: infarch 22.11.2011, 11:12
Конечно можно приводить... Вот только надо знать к каким. Я бы давно уже попробовал. Итак, эксперимент не удался:

Код


            dynamic arg = e.arg0;
            int EventID = arg.getEventID();



System.NotImplementedException was unhandled by user code
  Message=The method or operation is not implemented.
  Source=mscorlib
  StackTrace:
       at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
       at System.Dynamic.ComRuntimeHelpers.GetITypeInfoFromIDispatch(IDispatch dispatch, Boolean throwIfMissingExpectedTypeInfo)
       at System.Dynamic.IDispatchComObject.EnsureScanDefinedMethods()
       at System.Dynamic.IDispatchComObject.System.Dynamic.IDynamicMetaObjectProvider.GetMetaObject(Expression parameter)
       at System.Dynamic.DynamicMetaObject.Create(Object value, Expression expression)
       at System.Dynamic.DynamicMetaObjectBinder.Bind(Object[] args, ReadOnlyCollection`1 parameters, LabelTarget returnLabel)
       at System.Runtime.CompilerServices.CallSiteBinder.BindCore[T](CallSite`1 site, Object[] args)
       at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
       at CallSite.Target(Closure , CallSite , Object )
       at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
       at AutoVue.Form1.av_onFileEvent(Object sender, IID_ISource_onFileEventEvent e) in C:\Users\sku\Documents\Visual Studio 2010\Projects\AutoVue\AutoVue\Form1.cs:line 49
       at AxJVueAXLib.AxJVueAXControl.RaiseOnonFileEvent(Object sender, IID_ISource_onFileEventEvent e)
       at AxJVueAXLib.AxJVueAXControlEventMulticaster.onFileEvent(Object arg0)
  InnerException: 

Автор: diadiavova 22.11.2011, 23:36
Цитата(infarch @  22.11.2011,  12:12 Найти цитируемый пост)
System.NotImplementedException was unhandled by user code
  Message=The method or operation is not implemented.

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

Автор: infarch 23.11.2011, 10:33
В том то и дело что работает :( Я получаю все айди, без проблем.

Автор: diadiavova 23.11.2011, 11:18
Цитата(infarch @  23.11.2011,  11:33 Найти цитируемый пост)
В том то и дело что работает :( Я получаю все айди, без проблем. 

Ну попробуй через рефлексию, но это гемор. 
Код

var arg = e.arg0;
 int EventID = arg.GetType().GetMethod("getEventID", System.Reflection.BindingFlags.IgnoreCase).Invoke(arg, null);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)