2009-05-05 17 views
5

Capisco che CoCreateInstance trovi il server COM per l'id della classe data, crea l'istanza dell'oggetto per quell'id e recupera un'interfaccia da tale istanza dell'oggetto. CoGetClassObject() trova il server COM per l'id della classe, crea un'istanza della classe factory per quell'id della classe e recupera quell'interfaccia factory class che può essere quindi utilizzata per creare oggetti reali.Qual è la differenza tra CoCreateInstance() e CoGetClassObject() durante la creazione di oggetti sulla stessa macchina?

In quale altro modo queste funzioni differiscono se utilizzate per creare oggetti sulla stessa macchina? Funzionano allo stesso modo ma causano l'invocazione di codice diverso nello stesso server COM?

risposta

8

CoGetClassObject restituisce essenzialmente un puntatore a una fabbrica per un'interfaccia particolare. Sotto il cofano, CoCreateInstance utilizza CoGetClassObject. Il vantaggio di chiamare CoGetClassObject è che consente di creare una volta sola la classe factory se si desidera creare molte istanze di un particolare oggetto.

La sezione MSDN su CoGetClassObject presenta una breve discussione su come è possibile usufruire di questa funzionalità.

+0

L'ho letto, ma non vedo alcun vantaggio, ad eccezione del fatto che CoGetClassObject() è potenzialmente più veloce e l'oggetto factory di classe è in grado di mantenere lo stato tra le chiamate CreateInstance(). – sharptooth

+1

@sharptooth, questo è praticamente il succo. Non c'è molto vantaggio, motivo per cui raramente lo vedi usato. – JaredPar

+0

C'è una possibilità che ci sia qualche altra sottile differenza come l'ordine di ricerca delle dipendenze? Queste funzioni funzionano allo stesso modo ma chiamano codice diverso nello stesso server COM? – sharptooth

1

Uno scenario in aggiunta a quello che ha detto JaredPar - CoGetClassObject si restituisce una class factory (chiamate DllGetClassObject funzione della DLL esportate in caso di server di inproc). La classe di produzione viene utilizzata per istanziare la coclea. CoCreateInstance chiama internamente CoGetClassObject, ottiene il factory di classe richiesto e quindi lo utilizza per creare un'istanza della coclasse richiesta. Quando si chiama CoCreateInstance, non è possibile ritardare la creazione della coclasse. Ci sono momenti in cui la creazione di coclasse potrebbe essere costosa e si vorrebbe ritardarne la creazione, ma avere comunque accesso alla fabbrica di classi in modo da poter istanziare la coclasse su richiesta.

Problemi correlati