COMCKLib.ICOMClass m_CK = new COMCKLib.ICOMClass();
Object obj = new object();
m_CK.RetKosmoSystems(buttonEdit1.Text , ref obj);
При выполнении метода m_CK.RetKosmoSystems(buttonEdit1.Text , ref obj) возникает сообщение:
Additional Information: Обнаружено недопустимое значение типа VARIANT во время преобразования неуправляемого значения типа VARIANT в управляемый объект. Передача в CLR недопустимого значения типа VARIANT может вызвать неожиданные исключения, а также повреждение или потерю данных.
При нажатии continue выскакиевает исключение:
Exception: Данный метод возвратил тип Variant COM, который не совместим с Interop.
Method: RetKosmoSystems
Full name: COMCKLib.ICOMClass
Module: Interop.COMCKLib.dll
Ответы на форумах в основном сводятся к советам типа попробуй использовать тип Object или используй тип Object , а потом откасть его к тому что надо. Понятно такие ответы не удовлетворят , тем более что ошибка возникает раньше.
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, MaxiMal_TSG, Вы писали:
MM_>>... не могу понять как передавать VARIANT из Com метода (ATL/C++) в C#. MM_>>Com метод ATL: Vi2>
отлично отрабатывает. Так что уже работающую менять не очень хочется. Можно ли решить проблему чисто с шарповской стороны ? Если нет то это большой недостаток , возможно придется менять уже работающий код.
Здравствуйте, MaxiMal_TSG, Вы писали:
MM_>почему, можно подробнее? Клиент на С++
Цитата из файла WTYPES.H:
* VT_SAFEARRAY [T] (use VT_ARRAY in VARIANT)
VT_SAFEARRAY — это такая же полноправная константа как и VT_BSTR (VT_SAFEARRAY = 27, VT_BSTR = 8), т.е. они не могут работать совместно. Причём VT_BSTR+VT_SAFEARRAY = 27+8 = 35, а такого типа хранения в VARIANTе нет.
VT_SAFEARRAY используется только при описании типов в библиотек типов и показывает, что на этом уровне вложенности используется какой-то SAFEARRAY.
MM_>отлично отрабатывает. Так что уже работающую менять не очень хочется. Можно ли решить проблему чисто с шарповской стороны ? Если нет то это большой недостаток , возможно придется менять уже работающий код.
Это происходит потому, что не задействован маршаллинг. Как только он появится, то появятся и проблемы в С++ тоже. Так что менять код придётся в любом случае, т.к. он не правильный с точки зрения СОМ.
Большое спасибо за пояснения.
Попробовал предлагаемый вариант , все сработало.
Понял , что грамотнее будет поменять код клиента на С++ .
Еще раз спасибо!