Esiste un modo per agganciare o intercettare le chiamate CoGetClassObject e / o CoCreateInstance?
-
05-07-2019 - |
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?
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.