C# ActiveX
От: beetlewar  
Дата: 17.10.11 10:08
Оценка:
Здравствуйте. Столкнулся с проблемой получения интерфейса через ActiveX. При вызове GetActiveObject(..) возвращает объект типа System.__ComObject. При приведении его к типу интерфейса возвращает null. Вот описание Co-класса:
  [ComVisible( true )]
    [Guid( "038d06d2-3e93-40cd-9507-c5e2f227afdd" )]
    [InterfaceType( ComInterfaceType.InterfaceIsDual )]
    public interface ITextProvider
    {
        [DispId( 1 )]
        void SetText( string Text );
        [DispId( 2 )]
        string GetText();
    }

    [ComVisible( true )]
    [InterfaceType( ComInterfaceType.InterfaceIsIDispatch )]
    [Guid( "e5e3ada1-267c-4ac4-a0f9-2e5222281959" )]
    public interface ITextProviderEvents
    {
        [DispId( 1 )]
        void TextChanged( string Text );
    }

    public delegate void TextDelegate( string Text );

    [ComVisible( true )]
    [ComSourceInterfaces( typeof( ITextProviderEvents ) )]
    [ClassInterface( ClassInterfaceType.None )]
    [Guid( "f7b960be-0b48-43de-b5ce-c43a07d051ef" )]
    [ProgId( "ComLib.CoTextProvider" )]
    [ComDefaultInterface( typeof( ITextProvider ) )]
    public class CoTextProvider : ITextProvider, IDisposable
    {
        public event TextDelegate TextChanged;

        private string m_sText;
        private int m_iRegister = 0;
        private bool m_bDisposed = false;

        public CoTextProvider()
        {
            Guid guid = Marshal.GenerateGuidForType( typeof( ComLib.CoTextProvider ) );
            var i = Ole32.RegisterActiveObject( this, ref guid, 0, out m_iRegister );
        }

        public void SetText( string Text )
        {
            this.m_sText = Text;
            var h = this.TextChanged;
            if( h != null )
            {
                try
                {
                    h( Text );
                }
                catch( Exception ex )
                {
                    System.Diagnostics.Trace.TraceError( string.Format( "Exception: {0}", ex.Message ) );
                }
            }
        }
        public string GetText()
        {
            return this.m_sText;
        }
        public void Dispose()
        {
            if( this.m_bDisposed )
            {
                return;
            }
            if( this.m_iRegister != 0 )
            {
                try
                {
                    IBindCtx bc;
                    ComLib.Ole32.CreateBindCtx( 0, out bc );

                    IRunningObjectTable rot;
                    bc.GetRunningObjectTable( out rot );
                    rot.Revoke( m_iRegister );
                    m_iRegister = 0;
                }
                catch { }
            }
            this.m_bDisposed = true;
        }
    }


Соответственно, запускается сервер (WinForms-приложение), инстанцирующий данный объект и клиент (тоже WinForms), пытающийся к нему подключиться и получаю вышесказанное. Подскажите, может я что-то забыл или не так сделал. Как получить на клиенте после вызова GetActiveObject ссылку на объект типа CoTextProvider?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.