2012-12-20 11 views
7

Sto tentando di abilitare i controlli comuni in un'applicazione. Ho seguito i passaggi indicati in this MSDN article, in particolare nella sezione Using ComCtl32.dll Version 6 in an Application That Uses Only Standard Extensions. Ma non riesco a farlo funzionare.Come abilitare i controlli comuni in un'app di Windows

L'unica cosa che sto facendo in modo diverso dall'articolo è che aggiungo le informazioni manifest in Pagine delle proprietà del progetto | Proprietà di configurazione | Linker | File manifesto | Dipendenze addizionali manifest. Questo è ciò che io entro nella casella di testo:

"type = nome 'Win32' = versione 'Microsoft.Windows.Common-Controls' = '6.0.0.0' processorArchitecture = '*' publicKeyToken = '6595b64144ccf1df' language = '*' xmlns = 'http://schemas.microsoft.com/developer/msbuild/2003' ";% (AdditionalManifestDependencies)

Quando controllo il manifest generato (MyApp.exe.intermediate.manifest), sembra corretto.

Aggiungo anche una dipendenza da collegamento a ComCtl32.lib in Proprietà progetto | Proprietà di configurazione | Linker | Input | Dipendenze aggiuntive. Invito anche InitCommonControlsEx all'avvio con la struttura InitCommonControlsEx inizializzato in questo modo:

INITCOMMONCONTROLSEX icex; 
icex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
icex.dwICC = ICC_STANDARD_CLASSES; 

Ma la chiamata a InitCommonControlsEx restituisce sempre false (il che significa che non). Dopo alcune indagini ho scoperto che il codice di errore restituito da GetLastError è ERROR_FILE_NOT_FOUND. Quale potrebbe essere il problema?

UPDATE: Ho notato qualcosa che potrebbe essere correlato al "file non trovato errore". Quando eseguo l'applicazione dal debugger, una delle linee nella finestra di output è:

'MyApp.exe': Loaded 'C: \ Windows \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6002. 18305_none_88f3a38569c2c436 \ comctl32.dll', non riesce a trovare o aprire il file PDB

Tuttavia, ci sono un sacco di linee simili per alcune delle librerie più standard come kernel32.lib, user32.lib, ecc:

'MyApp.exe': caricato 'C: \ Windows \ System32 \ ntdll.dll', Impossibile trovare o aprire il PDB presentare

'MyApp.exe': Loaded 'C: \ Windows \ System32 \ kernel32.dll', Impossibile trovare o aprire il file PDB

'MyApp.exe': Loaded 'C: \ Windows \ System32 \ Msvcrt.dll', Impossibile trovare o aprire il file PDB

'MyApp.exe': Loaded 'C: \ Windows \ System32 \ user32.dll', Impossibile trovare o aprire il file di PDB

Quelle linee appaiono sempre per qualsiasi applicazione e non causano problemi. Potrebbe essere diverso per ComCtl32.dll?

+0

Quindi farò l'ovvia domanda. Funziona * senza * le informazioni manifest aggiunte manualmente? – WhozCraig

+0

@WhozCraig Provato, non ha funzionato. – user1610015

+0

Hai considerato di chiamare InitCommonControls() (non l'Ex verson) come prima riga di WinMain. Non funzionerebbe? O stai cercando di ottenere uno dei nuovi stili visivi? – selbie

risposta

10

OK. Ho fatto alcuni compiti su questo e ho scoperto qualcosa di nuovo da solo. Come alla fine ho ottenuto questo al lavoro era quasi quello che stai cercando di fare:

  1. Vai Progetto/Proprietà/linker/manifest/Ulteriori Dipendenze Manifest
  2. Inserire il testo seguente verbatim (che significa tutte le virgolette singole e doppie esattamente come sotto). Questo è tutto su una sola riga, btw.

    "type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"

  3. salvare le impostazioni di un fare un progetto completo (se non la soluzione) ricostruire per forzare la rigenerazione manifesto e PCH.

Prima di fare questo che segue è stato a mio carico-list:

Loaded 'C: \ Windows \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_ 5.82.7601.17514 _none_ec83dffa859149af \ comctl32.dll'

Dopo mano forcnig la versione manifesta per i controlli comuni, la lista di carico comprende ora questo (e risposte correttamente TRUE per InitCommonControlsEx(), che è il punto di tutto questo, in primo luogo):

Loaded 'C: \ Windows \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_ 6.0.7601.17514 _none_41e6975e2bd6f2b2 \ comctl32.dll'

Nota: è anche possibile farlo con un #pragma in-source, idealmente nell'intestazione stdafx.h, ma preferisco in questo modo.

Spero che aiuti.

+0

Grazie, ora funziona! Quindi l'unica cosa che causava l'errore era l'attributo "xmlns". Non so nemmeno come sia arrivato questo attributo, in quanto ho appena copiato e incollato ciò che c'era nell'articolo di MSDN. Dev'essere stato aggiunto da VS mentre cercavo di ottenere le virgolette giuste. – user1610015

8

No, gli avvisi sui file PDB sono solo lì per dirti che non hai informazioni di debug per le DLL di sistema di Windows. Ottenere un ritorno FALSE da InitializeCommonControlsEx() è ovviamente il problema chiave.

C'è qualcosa di sbagliato nella stringa Dipendenze Manifestanti Aggiuntivi che usi.Ci ho lavorato per un po 'ma non ho trovato il difetto. Spesso è più semplice specificare le opzioni del linker nel codice sorgente. Tutto ha funzionato bene quando ho usato:

#include <CommCtrl.h> 
#pragma comment(lib,"comctl32.lib") 
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

Basta copiare e incollare lo snippet di codice sopra in uno dei file di origine.

Problemi correlati