Convierta / emita SAFEARRAY de IUnknowns a una matriz iterable de punteros de interfaz

Tengo la siguiente interfaz en C # con una clase con un mismo nombre (sin I) implementándola.

[ComVisible(true)]
[Guid("B2B134CC-70A6-43CD-9E1E-B3A3D9992C3E")]
public interface IOrder
{
    long GetQuantity();
    long GetOrderType();
    long GetPositionType();
}

La implementación de la clase pública Orden: IOrder es solo tres campos privados y un constructor con 3 parámetros requeridos.

En otro lugar, tengo el siguiente método con un resultado con el que quiero trabajar dentro de un código no administrado de C ++, transferido allí a través de los archivos COM y .tlb / .tlh.

public ScOrder[] GetOrders()
{
    //constant return value for simplicity
    return new Order[] {    
        new Order(1, 2, 3),
        new Order(4, 5, 6)
    };
}

Ya me las arreglé para obtener el trabajo básico entre el código no administrado de C ++ usando el código administrado de C #.

Pero los arreglos de clase demostraron ser un desafío diferente ...

Admito que para mí, el COM es nuevo y brutalmente confuso y C ++ hace mucho que se olvida ... pero estoy desarrollando ambas bibliotecas, así que no me rindo; Quiero que la DLL de C ++ funcione como un proxy entre algún programa y mi código C #.

Aclaración: No estoy usando MFC ni ATL. Utilizo #import en el código C ++ para obtener la interfaz generada en C # y los punteros de clase y otras cosas de COM que aún no entiendo.

Después de una hora de investigación, solo voy y le suplico ayuda. <

El siguiente es el código C ++ de lo que estoy tratando de lograr.

//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);

Ahora, en este punto, necesito algo de magia COM que aún no comprendo para convertir SAFEARRAY * en IOrderPtr * o algo así, así que puedo iterar sobre toda la matriz devuelta y llamar a los métodos del tipo "Orden"

GetQuantity ()GetOrderType ()GetPositionType ()

Entonces, para el primer ciclo, obtendré valores 1,2,3 y para el segundo ciclo, obtendré valores 4,5,6.

Ya que soy el autor de la biblioteca de C ++ y C #, solo puedo omitir todas estas cosas de COM y hacer métodos para obtener el recuento de la colección y otros métodos para obtener el valor de la propiedad en cierto índice.

Pero eso simplemente no parece agradable. Sospecho que la mecánica de lo que quiero es fácil, pero todas las respuestas que encontré en Google siempre faltan algo.

Respuestas a la pregunta(2)

Su respuesta a la pregunta