Existe uma maneira de ligar ou interceptar chamadas CoGetClassObject e / ou CoCreateInstance?

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

Pergunta

Eu gostaria de interceptar o COM CoCreateInstanceEx e / ou CoGetClassObject funções para substituir uma classe com um calço de teste num teste de unidade. Esta será apenas para um único CLSID; todos os outros podem passar inalterados. Existe uma maneira de fazer isso sem horríveis, hacks mal?

Foi útil?

Solução

Depende do que exatamente você quer.

Se você quiser detectar quem está carregando essa classe ou para descobrir se ele é carregado em tudo que você pode usar Process monitor . Uma chamada para CoGetClassObject() (ou CoCreateInstanceEx()) vai levar a uma chave HKCR\CLSID\{Class of interest id} lida e Process Monitor vai mostrar o que processo e quando faz isso e como bem sucedido é.

Se você quiser substituir uma classe existente com o seu - compilar uma biblioteca com a sua versão de classe com o mesmo ID de classe e altere o caminho para o servidor COM dentro HKCR\CLSID\{Class of interest id} para que sua biblioteca é usado para servir uma classe com esse id . Você pode fazer isso manualmente ou com regsvr32 - primeiro registrar a biblioteca original, em seguida, seu para substituir a classe de interesse registartion. COM O id de classe -> mapeamento biblioteca através desse chave quando um chamadas de consumo CoGetClassObject() ou CoCreateInstanceEx()

.

Outras dicas

Há sempre a função CoTreatAsClass: http://msdn.microsoft.com/en-us /library/ms693452(VS.85).aspx

Mas, como você observou, será uma substituição de todo o sistema da classe, não uma mudança local.

Como alternativa, você pode olhar para enganchar CoCreateInstance como sugerido no post referenciada pelo comentário de Shay Erlichmen.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top