Загадочное поведение евентов у COM-объекта
От: boruh  
Дата: 18.07.08 14:20
Оценка:
Полтора дня уже с бубном бегаю (((
Дано: в 1ой сборке описан интерфейс com-объекта,
во 2ой — он реализован.
Всё прекрасно работает, но стоит только добавить ещё один
(в коде закоментирован) евент и всё, ни одного
евента больше не вызываются =0

Отчего это происходит, может у кого есть какие идеи?

1ая сборка:
    // Интерфейс со свойствами и методами
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IControl
    {
        bool    Connected     { get; }
        ...
        void Connect();
        ...
    }

    // Интерфейс с событиями
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IControlEvents
    {
        #region События
        [DispId(0x60020000)] void OnError(EOperation operationID, EErrorCode errorCode, string errorMessage);
        [DispId(0x60020001)] void OnControlLoad();
        [DispId(0x60020002)] void OnConnected();
        [DispId(0x60020003)] void OnDisconnected();
        [DispId(0x60020004)] void OnCallMade(int callID, string callingDevice, string calledDevice, string uui);
        [DispId(0x60020005)] void OnCallDelivered(int callID);
        //[DispId(0x60020006)] void CallHangedUp(int callId, EEventCause cause);  
        // !!!! если раскоментить, подписки на евенты не происходит,
        // то есть во второй сборке проверки типа if(OnConnected != null) дают false
        // =( почему?
        #endregion
    }

    #region Типы
    public enum EOperation{...}
    public enum EErrorCode{...}
    public enum EEventCause{...}
    #endregion

    #region Делегаты
    public delegate void ErrorDelegate(EOperation operationID, EErrorCode errorCode, string errorMessage);
    public delegate void ControlLoadDelegate();
    public delegate void ConnectedDelegate();
    public delegate void DisconnectedDelegate();
    public delegate void CallMadeDelegate(int callID, string callingDevice, string calledDevice, string uui);
    public delegate void CallDeliveredDelegate(int callID);
    public delegate void CallHangedUpDelegate(int callId, EEventCause cause);
    #endregion


2ая сборка:
    [ComVisible(true),
     Guid("3B2A046B-174A-36A3-89D3-3EF404E54880"),
     ProgId("MyControl"),
     ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IControlEvents))]    
    public partial class Control : UserControl, IControl
    { 
        // Свойства
        public bool Connected { get { return _connected; } }
        ...
        // Методы
        public void Connect() { if(OnConnected != null) OnConnected(); }
        ...
        // События
        private  event ErrorDelegate OnError;
        private  event ControlLoadDelegate OnControlLoad;
        private  event ConnectedDelegate OnConnected;
        private  event ConnectedDelegate OnDisconnected;
        private  event CallMadeDelegate OnCallMade;
        private  event CallDeliveredDelegate OnCallDelivered;
        private  event CallHangedUpDelegate CallHangedUp;
        ...


html-страничка:
        <OBJECT id="ctrl" name="ctrl" ClassID="CLSID:3B2A046B-174A-36A3-89D3-3EF404E54880">                      
        </OBJECT>

        <script language="javascript">         
          function ctrl::OnControlLoad()
          {            
            alert("OnControlLoad");
          }    
          function ctrl::OnError(operationID, errorCode, errorMessage)
          {
            alert("OnError");
          }
          function ctrl::OnConnected()
          {
            alert("OnConnected");
          }
          function ctrl::OnDisconnected()
          {
            alert("OnDisconnected");
          }  
          function ctrl::OnCallMade(callID, callingDevice, calledDevice, uui)
          {
            alert("OnCallMade");
          } 
          function ctrl::OnCallDelivered(callID)
          {
            alert("OnCallDelivered");
          }    
          function ctrl::CallHangedUp(called, cause)
          {
            alert("CallHangedUp");
          }        
        </script>   
            
        <input type=button onClick="javascript:ctrl.Connect();" value="Connect">
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.