Posso carregar mais de um COMCTL32.dll em um processo?
-
13-09-2019 - |
Pergunta
Estou desenvolvendo um controle ActiveX que (estes dias) é utilizado principalmente em WinForms apps.
O controle ActiveX tem um diálogo 'página de propriedades', que pode ser demonstrado por meio de programação usando o método ShowPropertyPages na classe AxHost. Esta é a interface do usuário personalizada que pode ser criado em Visual Studio para editar as propriedades de um controle.
Este diálogo página de propriedades contém um controle ListBox que usa um ImageList para exibir ícones ao lado de itens da lista. Estes ícones são 32 bits bitmaps misturou-alfa. Para que estes sejam exibidos corretamente, versão 6,0 ou acima de COMCTL32.DLL deve ser utilizado.
Infelizmente, quando eu executar o meu WinForms aplicativo, ele carrega e utiliza a versão COMCTL32.DLL 5.xxx . Como resultado, quando o diálogo página de propriedades é exibido os ícones parecem ruins (as áreas semi-transparentes são desenhadas em preto sólido).
A minha pergunta é: existe alguma maneira eu posso certifique-se de usar a versão COMCTL32.dll 6.0+ de dentro página de propriedades UI do controle ActiveX, independentemente do que o processo está usando? Ou posso forçar o processo de host para uso a versão 6.0? (Acho que não, porque estou pensando que o processo de host pode já ter carregado COMCTL32.DLL na memória antes de qualquer código no controle ActiveX.
Esta página cobre alguns cenários para usar Comctl32 6.0 , mas não a situação que eu estou dentro.
Solução
O artigo original MSDN foi me confundindo porque focado em uma série de cenários específicos, nenhum dos quais combinados meu. Na verdade, a tecnologia subjacente que está falando sobre obras em geral.
adicionando um recurso 'manifesto' arquivo xml ao ActiveX DLL, eu posso sinalizar para o sistema side-by-side que eu quero que DLL usar COMCTL32.DLL 6.x. Essa versão é carregado automaticamente. Pretty nice.
Este manifesto precisa ser tipo de recurso RT_MANIFEST , com um ID de recurso de 2 .
Aqui está a evidência de sucesso (duas versões da mesma DLL carregado no mesmo processo!):
(também, os ícones exibidos corretamente na caixa de listagem ;) )
Outras dicas
Se seu aplicativo chama Application.EnableVisualStyles () (normalmente antes de chamar Application.Run () para iniciar um ciclo de mensagem), em seguida, versão 6+ da biblioteca de controles comuns deve ser usado.