Mai-COM-Server Umspeichern ([in, out] CACLSID * arg)?
-
03-07-2019 - |
Frage
Mit einem COM-Interface-Methode wie folgt deklariert:
[ object,
uuid(....),
]
interface IFoo : IUnknown
{
HRESULT Foo([in, out] CACLSID * items);
}
Im Hinblick auf die Rangierung ist der Server der gezählten Array neu zuzuteilen erlaubt? (I denkt es ist, aber ich bin mir nicht mehr sicher)
Die aktuelle Implementierung ersetzt nur die ID der vorhandenen, aber ich möchte eine Änderung implementieren (das wäre Vertrag nicht brechen), die mehr Objekte ohne eine neue Schnittstelle zur Einführung zurückkehren.
[Bearbeiten] Bitte beachten Sie, dass CACLSID ist bereits eine Anordnung, einen Zählwert und einen Zeiger enthält.
Lösung
Ich habe COM nicht für eine sehr lange Zeit getan, aber es ist auch möglich, ein neues Array zuweisen? In diesem Fall sollte es nicht CACLSID ** items
werden?
Andere Tipps
Sie sollten den Grafen als zweiten Parameter geben, die für so viele Anzahl von Elementen des Raumes anzeigt, mit diesem COM-Bibliothek Marschälle die Elemente
Erstens, wenn Sie wollen Foo
ein in Array zu akzeptieren, sollten Sie einen Paramter hinzufügen, die die Zählung gibt, z.
HRESULT Foo([in] int cItems, [in, out, size_is(cItems)] CACLSID * items);
. Achtung: dieser Code kompiliert nicht nur Dokumentation abgehend
Zum anderen können Sie das externe Verhalten dieser Methode verändern, ohne seine Erklärung zu ändern. Zur Unterstützung der Redimensionierung, müssen Sie in der Lage sein das Array neu zu verteilen und übergeben Sie zurück seine Adresse. Sie können eine SAFEARRAY
verwenden oder cItems
erklären und items
als Zeiger auf den ursprünglichen Typ Foo
nimmt, z.
HRESULT FooMutate([in, out] int *cItems, [in, out, size_is(*cItems)] CACLSID **items);
Auch nicht kompiliert, so müssen Sie wirklich wissen, was Sie tun, wenn Sie diese verwenden.