Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Работа с событиями COM


Автор: adonin 25.8.2010, 21:31
Доброй ночи.

У меня есть задача обработать событие, сгенерированное COM сервером. Следующий код регистрирует обработчик на сервере:
Код

           // Обертка для COM объекта SpRecordClient
            var sprecordClient = new SpRecordClientClass();
            sprecordClient.Connect(0, string.Empty, string.Empty);
            // Регистрация обработчика COM событий 
            var connectionPointContainer = (IConnectionPointContainer)sprecordClient;            
            // Гуид ком класса ISpRecordClientEvents
            var guid = new Guid("601D686C-2D6B-4A70-AF5A-094BC254C7B9");
            connectionPointContainer.FindConnectionPoint(ref guid, out point);

            // Обработчик события
            sprecordEvents = new SpRecordClientEvents();
            int pdwCookie;
            point.Advise(sprecordEvents, out pdwCookie);


код обработчика:
Код

public class SpRecordClientEvents : ISpRecordClientEvents
    {
        #region ISpRecordClientEvents Members
        public void OnMessage(object Msg)
        {
           // Мой код
        }
        #endregion
    }


В функции OnMessage() параметр Msg приходит ввиде массива byte. 

Cобственно вопрос: Как мне десериализовать этот массив в структуру? (есть описание структуры на C++)
Всем спасибо.

Автор: adonin 26.8.2010, 19:22
Отвечаю сам себе smile  http://bytes.com/topic/c-sharp/answers/249770-byte-structure
Используем следующий метод:
Код

public static object RawDeserialize(byte[] rawData, int position, Type anyType)
{
            int rawsize = Marshal.SizeOf(anyType);
            if (rawsize > rawData.Length)
                return null;
            IntPtr buffer = Marshal.AllocHGlobal(rawsize);
            Marshal.Copy(rawData, position, buffer, rawsize);
            object retobj = Marshal.PtrToStructure(buffer, anyType);
            Marshal.FreeHGlobal(buffer);
            return retobj;
}

метод OnMessage принимает следующий вид:
Код

public void OnMessage(object Msg)
        {
            MSGHEADER f;
            byte[] byteArray = (byte[])Msg;
            // преобразуем массив в структуру
            f = (MSGHEADER)RawDeserialize(byteArray, 0, typeof(MSGHEADER));
        }


Ларс, если читаешь, респект тебеsmile

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