c ++ - Hvordan kan jeg holde styr på ActiveX-kontroller skabt af en proces?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne holde styr på de ActiveX-kontroller, der er skabt af en eller anden proces. For at forenkle problemet, vil jeg først kun overvåge den aktuelle proces. Jeg vil gerne gøre dette, så jeg kan kontrollere, om en ActiveX-kontrol understøtter IOleWindow, og i bekræftende fald, om en given HWND tilhører den aktive ActiveX-kontrol (så jeg kan kortlægge HWND'er til ActiveX-kontroller). [8]


Har nogen erfaring med dette? Min første ide var at bruge API-hooking til at overvåge CoCreateInstance-invokationer, men jeg læste, at dette ikke virker i alle tilfælde. Nogle Google-undersøgelser afslørede http://www.pocketsoap.com/sf/activation.html, som fortæller om at installere en custom class factory - hvordan ville det virke? [9] [10]

Bedste reference


Du kan finde, at du kan finde ud af, hvad du skal vide ved hjælp af API'erne til automatisering af brugergrænsefladen og Active Accessibility:



  • http://msdn.microsoft.com/en-us/library/dd317978 (VS.85) .aspx



Hvis du er sikker på, at du skal gøre dette, skal du være opmærksom på følgende. CoCreateInstance er i det væsentlige en bekvemmelighedsfunktion, som ombryder CoGetClassObject og IClassObject::CreateInstance. [11]


Hvis du skal bruge den teknik, skal du derfor koble CoGetClassObject, da processen kan bruge den direkte.


Og selvfølgelig er der ingen lov, der siger, at ethvert bibliotek eller DLL ikke kan levere sine egne bekvemmelighedsfunktioner, som omgå COM-registreringsdatabasen helt. Registreringsdatabasen selv er en bekvemmelighed - hvis du ved, hvor DLL'en er, kan du bruge LoadLibrary GetProcAddress for at finde DllGetClassObject og hente klasseobjektet uden at involvere COM biblioteker, og faktisk uden at DLL'en bliver registreret overhovedet.

Andre referencer 1


Jeg endte med at hænge CoCreateInstance og CoGetClassObject til at spore alle COM objekter, der oprettes.