C# + COM интерфейс
От: Аноним  
Дата: 19.06.09 19:43
Оценка:
Добрый вечер. Хочу использовать COM компонент в .NET приложении
Компонент регистрирую, добавляю Reference в проекте.
COM класс и интерфейс видятся нормально, объект создается, но те методы которые в COM возвращают HRESULT определяются как void.
Как быть??
Спасибо!
Re: C# + COM интерфейс
От: Аноним  
Дата: 19.06.09 21:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый вечер. Хочу использовать COM компонент в .NET приложении

А>Компонент регистрирую, добавляю Reference в проекте.
А>COM класс и интерфейс видятся нормально, объект создается, но те методы которые в COM возвращают HRESULT определяются как void.
А>Как быть??
А>Спасибо!

это нормальное поведение.
в runtim'e .net проверяет значение HRESULT, если значение неудачное — генерируется ComException и в свойстве HResult лежит его значение.
Если все нормально — просто передается управление дальше.
если все-такие нужно проверить HRESULT, сделай его out параметром
Re[2]: C# + COM интерфейс
От: TK Лес кывт.рф
Дата: 20.06.09 19:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>если все-такие нужно проверить HRESULT, сделай его out параметром


В этом случае лучше обратить внимание на PreserveSigAttribute
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: C# + COM интерфейс
От: Аноним  
Дата: 22.06.09 12:23
Оценка:
Здравствуйте, TK, Вы писали:

TK>Здравствуйте, Аноним, Вы писали:


А>>если все-такие нужно проверить HRESULT, сделай его out параметром


TK>В этом случае лучше обратить внимание на PreserveSigAttribute

Спасибо. Разобрался.
Вот теперь такой вопрос.
COM метод принимает параметр DOUBLE* arr, который представляет собой массив, тоесть доступ к элементам идет типа arr[0]...
При вызове метода из .NET функция требует ref double. Просто передача указателя
            double[] arr = { val1, val2, val3, val4 };
            fixed (double* p = arr)
            {
                _COMObj.SetValue(p);
            }

не прокатывает.
Как можно передать такой массив??
Спасибо!!
Re[4]: C# + COM интерфейс
От: TK Лес кывт.рф
Дата: 27.06.09 23:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>COM метод принимает параметр DOUBLE* arr, который представляет собой массив, тоесть доступ к элементам идет типа arr[0]...

А>При вызове метода из .NET функция требует ref double. Просто передача указателя
А> не прокатывает.
А>Как можно передать такой массив??

Так, передавать-то надо не указатель, а ref:
        {
            var i = new[] { 1, 2, 3 };
            fixed (int* pi = &i[1])
            {
                Test(ref *pi);
            }
        }

        static void Test(ref int t);


Либо, опишите нужный интерфейс руками на C# — тогда, никаких проблем с декларациями не будет
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[5]: C# + COM интерфейс
От: Аноним  
Дата: 29.06.09 08:59
Оценка:
Здравствуйте, TK, Вы писали:

TK>Так, передавать-то надо не указатель, а ref:

TK>
TK>        {
TK>            var i = new[] { 1, 2, 3 };
TK>            fixed (int* pi = &i[1])
TK>            {
TK>                Test(ref *pi);
TK>            }
TK>        }

TK>        static void Test(ref int t);
TK>

Спасибо еще раз!

TK>Либо, опишите нужный интерфейс руками на C# — тогда, никаких проблем с декларациями не будет

А можно подробнее про это?? Или где почитать??
Re[5]: C# + COM интерфейс
От: Аноним  
Дата: 29.06.09 11:50
Оценка:
Здравствуйте, TK, Вы писали:

TK>Так, передавать-то надо не указатель, а ref:

TK>
TK>        {
TK>            var i = new[] { 1, 2, 3 };
TK>            fixed (int* pi = &i[1])
TK>            {
TK>                Test(ref *pi);
TK>            }
TK>        }

TK>        static void Test(ref int t);
TK>


TK>Либо, опишите нужный интерфейс руками на C# — тогда, никаких проблем с декларациями не будет

Вот опять что то не так делаю. Функция возвращает CRect из библиотеки MFC. Тоесть прототип такой

GetMFCRect(LONG* pRect)
{
.......
    *((CRect*)pRect) = m_currentRect;
.......
}

У себя пытаюсь это дело получить так

            int pointer = new int();
            Rectangle rc;
            IntPtr pIntResult;
            unsafe
            {
                int* p = &pointer;
                _COMobj.GetMFCRect(ref *p);
                pIntResult = new IntPtr(p);
                rc = (Rectangle)Marshal.PtrToStructure(pintResult, typeof(Rectangle));
            }

Вот значения в rc не верные. Что не так в данном случае??
Спасибо!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.