Добрый вечер. Хочу использовать 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 параметром
Здравствуйте, Аноним, Вы писали:
А>если все-такие нужно проверить 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. Просто передача указателя
Здравствуйте, Аноним, Вы писали:
А>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. Тоесть прототип такой