2010-04-28 13 views
5

Abbiamo la seguente interfaccia:Il server COM deve chiamare SysFreeString() per un parametro [out]?

[object, uuid("uuidhere"), dual ] 
interface IInterface : IDispatch 
{ 
    [id(1), propget] HRESULT CoolProperty([out, retval] BSTR* result); 
} 

Ora c'è un problema minore. Da un lato il parametro è "out" e quindi qualsiasi valore può essere passato come input, il parametro diventerà valido solo al risultato positivo. D'altra parte, c'è this MSDN article a cui è collegato da molte pagine che sostanzialmente dice (l'ultimo paragrafo) che se una qualsiasi funzione viene passata a BSTR*, deve liberare la stringa prima di assegnare una nuova stringa.

È orribile. Se quell'articolo è corretto significa che tutti i chiamanti devono sicuramente passare BSTR validi (forse BSTR nulli), altrimenti il ​​BSTR passato può essere trapelato. Se il chiamante ha passato un valore casuale e il chiamato tenta di chiamare SysFreeString(), si imbatte in un comportamento non definito, quindi la convenzione è fondamentale.

Allora qual è il punto nell'attributo [out]? Quale sarà la differenza tra [in, out] e [out] in questa situazione?

L'articolo è corretto? Devo liberare il parametro BSTR [out] passato prima di assegnarne uno nuovo?

risposta

4

Dovresti aspettarti che il cliente segua il contratto, onori l'attributo [out] e non superi un BSTR inizializzato che deve essere liberato. Il doppio controllo e l'attesa di un NULL è non ok, il contratto non richiede che il client passi un puntatore a una posizione di memoria inizializzata. Solitamente si ottiene un puntatore a una variabile BSTR allocata nello stack frame. È probabile che contenga spazzatura casuale, solo un programmatore difensivo lo imposterà su NULL.

È altrimenti incompatibile con automazione OLE. Solo [out, retval] e [in, out] sono validi in questo caso, senza dubbio per evitare questa particolare trappola.

3

Il documentation afferma che i puntatori OUT non devono mai essere liberati dal destinatario, quindi, IMHO, si dovrebbe rispettare le specifiche.

Best

Problemi correlati