Конвертировать / преобразовать 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, всегда что-то упускают.

Ответы на вопрос(2)

Ваш ответ на вопрос