Domanda

Con un metodo di interfaccia COM dichiarato come questo:

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

Per quanto riguarda il marshalling, il server è autorizzato a riallocare l'array conteggiato? ( penso lo è, ma non ne sono più sicuro)

La sua implementazione attuale sostituisce solo gli ID esistenti, ma vorrei implementare una modifica (che non romperebbe il contratto) che potrebbe restituire più articoli senza introdurre una nuova interfaccia.

[modifica] si prega di notare che CACLSID è già un array, contenente un conteggio e un puntatore.

È stato utile?

Soluzione

Non utilizzo COM da molto tempo, ma è anche possibile allocare un nuovo array? In tal caso non dovrebbe essere articoli CACLSID ** ?

Altri suggerimenti

Dovresti dare il conteggio come secondo parametro che indica lo spazio per un numero così elevato di elementi, usando questa libreria COM esegue il marshalling degli elementi

Innanzitutto, se si desidera che Foo accetti un array in, è necessario aggiungere un parametro che dia il conteggio, ad es .:

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

Attenzione: questo codice non è stato compilato, sta solo andando fuori documentazione.

In secondo luogo, non è possibile modificare il comportamento esterno di questo metodo senza modificarne la dichiarazione. Per supportare il ridimensionamento, è necessario essere in grado di riallocare l'array e restituirne l'indirizzo. Puoi utilizzare un SAFEARRAY o dichiarare cItems e articoli come puntatori al tipo originale Foo , ad esempio:

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

Ancora una volta, non compilato, quindi dovrai effettivamente sapere cosa stai facendo se lo usi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top