Конвертировать / преобразовать 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.

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 # кодом.

Clarification: Я не использую ни MFC, ни ATL. Я использую #import в коде C ++ для получения интерфейса, сгенерированных C #, указателей классов и других COM-вещей, которые я пока не совсем понимаю.

После часа исследований я просто иду сюда и прошу помощи & gt;. & Lt;

Ниже приведен код 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 * или что-то еще, чтобы я мог перебрать весь возвращаемый массив и вызвать методы типа & quot; Order & quot;

GetQuantity() GetOrderType() GetPositionType()

Таким образом, для первого цикла я получу значения 1,2,3, а для второго цикла я получу значения 4,5,6.

Поскольку я являюсь автором как библиотек C ++, так и C #, я могу просто пропустить все эти безумные COM-вещи и создать методы для получения количества коллекций и другие методы для получения значения свойства для определенного индекса.

Но это не кажется хорошим. Я подозреваю, что механика того, что я хочу, проста, но все ответы, которые я нашел в Google, всегда что-то упускают.

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

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