I have the following interface in C# with a class with a same name (without I) implementing it.
[ComVisible(true)]
[Guid("B2B134CC-70A6-43CD-9E1E-B3A3D9992C3E")]
public interface IOrder
{
long GetQuantity();
long GetOrderType();
long GetPositionType();
}
The implementation of the public class Order : IOrder is just three private fields and a constructor with required 3 parameters.
Somewhere else, I have the following method with a result with which I want to work inside a C++ unmanaged code, transferred there via COM and .tlb/.tlh files.
public ScOrder[] GetOrders()
{
//constant return value for simplicity
return new Order[] {
new Order(1, 2, 3),
new Order(4, 5, 6)
};
}
I've already managed to get the basics work between the C++ unmanaged code using the C# managed code.
But class arrays proved to be a different challange...
I admit that for me, the COM is new and brutally confusing and C++ long forgotten ... , but I'm developing both libraries so I'm not giving up; I want the C++ DLL to work as a proxy between some program and my C# code.
Clarification: I'm using neither MFC nor ATL. I use #import in the C++ code for getting the C# generated interface and class pointers and other COM stuff I don't quite understand yet.
After hour of researching, I'm just going here and beg for help >.<
The following is the C++ code of what I'm trying to achieve.
//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);
Now at this point, I need some COM magic I don't yet understand to convert that SAFEARRAY* to IOrderPtr* or something so I can iterate over the whole array returned and call the methods of the type "Order"
- GetQuantity()
- GetOrderType()
- GetPositionType()
So for the first cycle, I'll get values 1,2,3 and for the second cycle, I'll get values 4,5,6.
Since I'm the author of both C++ and C# library, I can just skip all of this COM crazy stuff and make methods to get the collection count and other methods to get the value of property on certain index.
But that just doesn't seem nice. I suspect the mechanics of what I want are easy but all the answers I found on google are always missing something.