Конвертировать / преобразовать SAFEARRAY из IUnknown в итеративный массив указателей интерфейса
У меня есть следующий интерфейс в C # с классом с тем же именем (без I), реализующим его.
[ComVisible(true)]
[Guid("B2B134CC-70A6-43CD-9E1E-B3A3D9992C3E")]
public interface IOrder
{
long GetQuantity();
long GetOrderType();
long GetPositionType();
}
Реализация открытого класса Order: IOrder - это всего три приватных поля и конструктор с необходимыми 3 параметрами.
Где-то еще у меня есть следующий метод, в результате которого я хочу работать внутри неуправляемого кода C ++, передаваемого туда через файлы COM и .tlb / .tlh.I '
public ScOrder[] GetOrders()
{
//constant return value for simplicity
return new Order[] {
new Order(1, 2, 3),
new Order(4, 5, 6)
};
}
Нам уже удалось получить основы работы между неуправляемым кодом C ++ с использованием управляемого кода C #.
Но классовые массивы оказались другой проблемой ...
Я признаю, что для меня COM является новым и жестоко запутанным, а C ++ давно забыт ..., но яЯ разрабатываю обе библиотеки, поэтому яя не сдаюсь; Я хочу, чтобы C ++ DLL работала как прокси между какой-то программой и моим C # кодом.
Пояснение: ям, не используя ни MFC, ни ATL. Я использую #import в коде C ++ для получения сгенерированного интерфейса C # и указателей классов и других вещей COM, которые я не делаюпока не совсем понимаю.
После часа исследований яЯ просто иду сюда и прошу помощи>. <
Ниже приведен код C ++ того, что яЯ пытаюсь достичь.
//this is how the instance of C# gets created, read it from the internets
//this type has the method GetOrders
IProxyPtr iPtr;
CoInitialize(NULL);
iPtr.CreateInstance(CLSID_Proxy);
IOrderPtr* ordArr;
//IOrderPtr is just a pointer to the interface type transferred
//right? So IOrderPtr* should represent the array of those pointers, right?
SAFEARRAY* orders;
iPtr->GetOrders(&orders);
Теперь на этом этапе мне нужно немного магии COM, я непока не понимаю, преобразовать этот SAFEARRAY * в IOrderPtr * или что-то еще, чтобы я мог перебирать весь возвращаемый массив и вызывать методы типа "Порядок"
GetQuantity ()GetOrderType ()GetPositionType ()Так что для первого цикла яполучим значения 1,2,3 и для второго цикла I 'получим значения 4,5,6.
Так как я'Являясь автором библиотек C ++ и C #, я могу просто пропустить все эти сумасшедшие вещи в COM и создать методы для получения количества коллекций и другие методы для получения значения свойства по определенному индексу.
Но это просто некажется хорошим Я подозреваю, что механика того, что я хочу, проста, но все ответы, которые я нашел в Google, всегда что-то упускают.