Esiste un modo per agganciare o intercettare le chiamate CoGetClassObject e / o CoCreateInstance?

StackOverflow https://stackoverflow.com/questions/1604913

Domanda

Vorrei intercettare la COM CoCreateInstanceEx e / o CoGetClassObject per sostituire una classe con uno spessore di prova in un test unitario. Questo sarà solo per un singolo CLSID; tutti gli altri possono passare invariati. C'è un modo per farlo senza orribili hack malvagi?

È stato utile?

Soluzione

Dipende da cosa vuoi esattamente.

Se vuoi rilevare chi sta caricando quella classe o per scoprire se è stata caricata, puoi usare Process Monitor . Una chiamata a CoGetClassObject () (o CoCreateInstanceEx () ) comporterà la lettura di una chiave HKCR \ CLSID \ {Class of interest id} e Process Monitor ti mostrerà quale processo, quando lo fa e quanto ha successo.

Se vuoi sostituire una classe esistente con la tua - compila una libreria con la tua versione di classe con lo stesso ID di classe e modifica il percorso al server COM all'interno di HKCR \ CLSID \ {ID di classe di interesse} in modo che la tua libreria venga utilizzata per servire una classe con quell'id. Puoi farlo manualmente o con regsvr32: prima registra la libreria originale, poi la tua per sovrascrivere la classe di registrazione degli interessi. COM fa class id - > mappatura della libreria tramite quella chiave quando un consumatore chiama CoGetClassObject () o CoCreateInstanceEx () .

Altri suggerimenti

C'è sempre la funzione CoTreatAsClass : http://msdn.microsoft.com/en-us /library/ms693452(VS.85).aspx

Ma, come hai notato, sarà una sostituzione a livello di sistema della classe, non una modifica locale.

In alternativa, potresti esaminare l'adesione di CoCreateInstance come suggerito nel post a cui fa riferimento il commento di Shay Erlichmen.

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