Domanda

Sto sviluppando un controllo ActiveX che (al giorno d'oggi) viene utilizzato principalmente nelle app WinForms.

Il controllo ActiveX dispone di una finestra di dialogo "pagina delle proprietà", che può essere visualizzata a livello di codice utilizzando il metodo ShowPropertyPages sulla classe AxHost.Questa è l'interfaccia utente personalizzata che può essere visualizzata in Visual Studio per modificare le proprietà di un controllo.

Questa finestra di dialogo della pagina delle proprietà contiene un controllo ListBox che utilizza un ImageList per visualizzare le icone accanto agli elementi dell'elenco.Queste icone sono bitmap con fusione alfa a 32 bit.Affinché questi vengano visualizzati correttamente, version 6.0 o superiore di COMCTL32.DLL deve essere utilizzato.

Sfortunatamente quando eseguo la mia app WinForms, carica e utilizza la versione COMCTL32.DLL 5.xxx.Di conseguenza, quando viene visualizzata la finestra di dialogo della pagina delle proprietà, le icone hanno un aspetto scadente (le aree semitrasparenti vengono disegnate in nero pieno).

La mia domanda è:esiste un modo per essere sicuro di utilizzare COMCTL32.dll versione 6.0+ dall'interfaccia utente della pagina delle proprietà del controllo ActiveX, indipendentemente da ciò che sta utilizzando il processo?Oppure posso forzare il processo host a utilizzare la versione 6.0?(Penso di no, perché penso che il processo host potrebbe aver già caricato COMCTL32.DLL in memoria prima di qualsiasi codice nel controllo ActiveX.

Questa pagina web copre alcuni scenari per l'utilizzo di COMCTL32 6.0, ma non la situazione in cui mi trovo.

È stato utile?

Soluzione

L'articolo originale di MSDN mi confondeva perché si concentrava su una serie di scenari specifici, nessuno dei quali corrispondeva al mio.In effetti, la tecnologia di base di cui si parla funziona in modo più generale.

Di aggiungendo un file xml "manifesto". risorsa alla DLL ActiveX, posso segnalare al sistema side-by-side che desidero che la DLL utilizzi COMCTL32.DLL 6.x.Quella versione viene quindi caricata automaticamente.Molto carino.

Questo manifest deve essere di tipo risorsa RT_MANIFEST, con un ID risorsa di 2.

Ecco la prova del successo (due versioni della stessa DLL caricate nello stesso processo!):procexp screenshot showing two COMCTL32's loaded in process

(inoltre, le icone vengono visualizzate correttamente nella casella di riepilogo ;))

Altri suggerimenti

Se l'applicazione chiama Application.EnableVisualStyles() (in genere prima di chiamare Application.Run() per avviare un ciclo di messaggi), è necessario utilizzare la versione 6+ della libreria di controlli comuni.

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