2009-03-02 7 views
0

Mit einem Verfahren COM-Schnittstelle deklariert wie folgt aus:kann COM-Server neu zuweisen ([in, out] CACLSID * arg)?

[ object, 
    uuid(....), 
] 
interface IFoo : IUnknown 
{ 
    HRESULT Foo([in, out] CACLSID * items); 
} 

Im Hinblick auf die Rangierung, wird der Server den gezählten Array neu zuzuteilen erlaubt? (I denken es ist, aber ich bin mir nicht mehr sicher)

Die aktuelle Implementierung nur die bestehenden IDs ersetzt, aber ich möchte eine Änderung implementieren (das wäre Vertrag nicht brechen), die mehrere Objekte zurückgeben können, ohne Einführung einer neuen Schnittstelle.

[Bearbeiten] Bitte beachten Sie, dass CACLSID bereits ein Array ist, das eine Zählung und einen Zeiger enthält.

Antwort

1

Ich habe COM nicht für eine sehr lange Zeit gemacht, aber ist es sogar möglich, ein neues Array zuzuordnen? Sollte es in diesem Fall nicht CACLSID ** items sein?

+0

ja, CACLSID = Struktur {unsigned long cElems; CLSID * pElems; } wo pElements mit CoAlloc zugewiesen wird. Also nicht genau "ein neues Array zuweisen", sondern "resize the existing" - was wahrscheinlich genau das ist, warum ich unsicher bin. } – peterchen

+0

Ich bin mir ziemlich sicher, dass Sie nicht die Größe ändern dürfen, wenn Ihre IDL so aussieht Verwenden Sie so genannte offene Arrays, wenn Sie die Größe ändern müssen. Etwas in der Art von: HRESULT Foo ([in] lang cMax, [in, out] lang * pcActual, [in, out, size_is (cMax), length_is (* pcActual)] CLSID * pElemn) –

+0

Wie ich schon sagte habe ich COM schon lange nicht mehr programmiert, aber ich habe meine "Essential COM" von Don Box geöffnet und gefunden :-) –

0

Sie sollten den Grafen als zweiten Parameter geben, die für so viele Anzahl der Elemente den Raum zeigt,

0

zunächst die Elemente dieser COM-Bibliothek Marschälle verwenden, wenn Sie Foo wollen ein in Array zu akzeptieren, sollten Sie hinzufügen ein Paramter, der die Zählung, zB gibt:

HRESULT Foo([in] int cItems, [in, out, size_is(cItems)] CACLSID * items); 

Warnung: dieser Code kompiliert abgehend wurde nicht nur Dokumentation.

Zweitens können Sie das externe Verhalten dieser Methode nicht ändern, ohne seine Deklaration zu ändern. Um die Größenanpassung zu unterstützen, müssen Sie das Array neu zuweisen und seine Adresse zurückgeben können. Sie können ein SAFEARRAY verwenden oder cItems und items als Zeiger auf die ursprüngliche Art kennen Foo nimmt, z.B .:

HRESULT FooMutate([in, out] int *cItems, [in, out, size_is(*cItems)] CACLSID **items); 

Wieder nicht kompiliert, so dass Sie sich tatsächlich erklären, was Sie tun, wenn Sie diese verwenden.