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?