Используя COM-объект из C ++, который в C # .NET возвращает объект [] - PullRequest
0 голосов
/ 30 августа 2009

У меня есть COM-объект, который я пытаюсь использовать из C ++ (не .NET), и все примеры программ и руководства написаны в предположении использования C # .NET или VB.NET. COM является новым для меня, поэтому я немного перегружен. Я использую #import на TLB, но изо всех сил пытаюсь разобраться с вариантами, которые используются в качестве параметров. У меня есть один конкретный метод, который в соответствии с документами и примерами программ на C # .NET должен возвращать объект []. Затем я должен привести первую запись в этом массиве к ControlEvent, который затем скажет мне, что делать с остальными объектами в массиве. Пример C # .NET выглядит следующим образом:

object [] objEvent = (object []) Ctl.GetEvent();
ControlEvent ev = (ControlEvent) objEvent[0];

В моем случае, GetEvent возвращает мне _variant_t, и мне нужно знать, как преобразовать это в объект [], чтобы я мог продолжить его обработку. Мне не ясно даже, как я выражаю «объект» в C ++. Я вижу документацию _variant_t, показывающую мне миллион вещей, в которые я могу конвертировать вариант, но ни одна из них, кажется, не конвертирует что-либо, что я могу использовать. Я надеюсь на некоторую помощь в преобразовании вышеуказанного кода C # .NET в Visual C ++

Спасибо.

Ответы [ 2 ]

1 голос
/ 30 августа 2009

Я этого не делал, но после прочтения документации для класса _variant_t (и комментариев ниже, которые исправили мой оригинальный пост), я думаю, что вам следует прочитать поле vt экземпляра _variant_t ( на самом деле поле VARTYPE vt экземпляра VARIANT: экземпляр _variant_t напрямую происходит от VARIANT), чтобы увидеть, какой тип он содержит, как описано в справочной документации по структуре VARIANT. Если вы знаете, какой тип вещи содержится в варианте, используйте соответствующий оператор для конкретного типа, чтобы прочитать его.

Вам будет причинен вред, если вы попытаетесь использовать COM, не понимая его (и вам может понадобиться книга, в которой это описано); вам может потребоваться, например, знать об интерфейсе IUnknown и методе AddRef.

1 голос
/ 30 августа 2009

Как правило, вы смотрите на vt член варианта, чтобы увидеть, что это за штука на самом деле. В этом случае я ожидал бы, что это будет массив, так что вы ожидаете, что vartype будет некоторой вариацией VT_ARRAY (обычно это побитовое ИЛИ с типом членов). Затем вы получаете элемент parray, который содержит экземпляр SAFEARRAY, который фактически содержит массив, и используете обычные безопасные функции массива для извлечения данных из массива.

...