Premessa: su COM non sono molto ferrato, per cui prendi con le pinze quello che ti dico.
AddRef/Release lavorano con il reference counter; ogni volta che chiami AddRef il reference counter viene incrementato di 1, ogni volta che richiami Release esso viene diminuito di 1. Quando il reference counter raggiunge lo zero l'oggetto viene distrutto. Di solito quando una funzione ti restituisce un puntatore ad un'interfaccia COM il suo reference counter è già ad 1 (o ad un numero maggiore, a seconda di quanti riferimenti ci sono a questo oggetto), per cui l'unica cosa che devi fare è richiamare Release quando l'oggetto non ti serve più. Se per caso l'oggetto ti dovesse servire in due parti indipendenti del programma puoi chiamare AddRef una volta in modo da incrementare di uno il reference counter e Release in entrambe le parti del programma, così che l'oggetto venga distrutto quando non serve più a nessuno.
4) Per poter espandere le funzioni in futuro senza rompere la compatibilità con il codice esistente.