COM, IDL, size_is, geht net :(
-
Wir versuchen hier gerade einen COM Server (.exe) zum laufen zu bringen der dual Interfaces mit Arrays verwendet.
Da das ganze schnell gehen muss haben wir dazu VS2005 mit attributed C++ verwendet.
Compilieren tut auch alles brav, bloss funktionieren tut es irgendwie nicht so ganz - er scheint das size_is komplett zu ignorieren. Soll heissen: er marschallt nur jeweils ein Element, egal was wir für eine Grösse angeben.Im generierten IDL File ist das size_is allerdings noch enthalten, nur das automatische Marshalling ... haut eben nicht hin.
Ein konkretes Beispiel was wir probiert haben:
[export] typedef struct tagPropertyVariant { BYTE m_type; VARIANT m_value; } PropertyVariant; // im Interface: HRESULT WriteProperties(unsigned long numberofProperties, [in, size_is(numberofProperties)] const BSTR* propertyNames, [in, size_is(numberofProperties)] const PropertyVariant* propertyValues);numberofProperties wird Clientseitig dabei auf 2 gesetzt, propertyNames und propertyValues zeigen auf je ein Array mit 2 Einträgen. Serverseitig ist numberofProperties immer noch brav 2, das erste Element in den Arrays stimmt auch noch, aber das 2. ist "nicht da".
Was tun? Machen wir irgendetwas falsch, oder wird das vom automatischen Marshaling nicht unterstützt?
-
Ok. Habe jetzt selbst herausgefunden dass Interfaces mit size_is o.ä. anscheinend nicht automation kompatibel sind, und daher auch nicht automatisch gemarshalt werden. Auch doof.
Die Alternative ist SAFEARRAYs zu verwenden, was wir wohl auch machen werden.