So aktivieren Sie allgemeine Steuerelemente in einer Windows-App

7

Ich versuche, allgemeine Steuerelemente in einer Anwendung zu aktivieren. Ich habe die Schritte in diesem MSDN-Artikel ausgeführt >, speziell der Abschnitt Verwenden der Version ComCtl32.dll 6 in einer Anwendung, die nur Standarderweiterungen verwendet . Aber ich kann es nicht zur Arbeit bringen.

Das einzige, was ich anders als in dem Artikel mache, ist, dass ich die Manifest-Informationen in Projekteigenschaftsseiten | Konfigurationseigenschaften | Linker | Manifestdatei | Zusätzliche Manifestabhängigkeiten . Dies ist, was ich in das Textfeld eingebe:

"type = 'Win32' name = 'Microsoft.Windows.Common-Steuerelemente' version = '6.0.0.0' processorArchitecture = '*' publicKeyToken = '6595b64144ccf1df' language = '*' xmlns = ' Beschreibung '";% (AdditionalManifestDependencies)

Wenn ich das generierte Manifest (MyApp.exe.intermediate.manifest) überprüfe, sieht es korrekt aus.

Ich füge auch eine Verknüpfungsabhängigkeit zu ComCtl32.lib in Projekteigenschaften | hinzu Konfigurationseigenschaften | Linker | Eingabe | Zusätzliche Abhängigkeiten . Ich rufe InitCommonControlsEx beim Start mit der INITCOMMONCONTROLSEX-Struktur auf, die wie folgt initialisiert wird:

%Vor%

Aber der Aufruf von InitCommonControlsEx gibt immer FALSE zurück (was bedeutet, dass es fehlgeschlagen ist). Nach einigen Untersuchungen habe ich herausgefunden, dass der von GetLastError zurückgegebene Fehlercode ERROR_FILE_NOT_FOUND ist. Was könnte das Problem sein?

UPDATE: Ich habe bemerkt, dass etwas mit dem Fehler "Datei nicht gefunden" zu tun hat. Wenn ich die Anwendung vom Debugger aus starte, ist eine der Zeilen im Ausgabefenster:

  

'MyApp.exe': Geladen 'C: \ Windows \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6002.18305_none_88f3a38569c2c436 \ comctl32.dll', kann die PDB-Datei nicht finden oder öffnen

Es gibt jedoch eine Reihe ähnlicher Zeilen für einige der Standardbibliotheken wie kernel32.lib, user32.lib usw.:

  

'MyApp.exe': Geladen 'C: \ Windows \ System32 \ ntdll.dll', Kann die PDB-Datei nicht finden oder öffnen

     

'MyApp.exe': Geladen 'C: \ Windows \ System32 \ kernel32.dll', Kann die PDB-Datei nicht finden oder öffnen

     

'MyApp.exe': Geladen 'C: \ Windows \ System32 \ msvcrt.dll', Kann die PDB-Datei nicht finden oder öffnen

     

'MyApp.exe': Geladen 'C: \ Windows \ System32 \ user32.dll', kann die PDB-Datei nicht finden oder öffnen

Diese Zeilen erscheinen immer für jede Anwendung und es verursacht keine Probleme. Könnte es für ComCtl32.dll anders sein?

    
user1610015 20.12.2012, 17:37
quelle

2 Antworten

10

OK. Ich habe einige Hausaufgaben gemacht und selbst etwas Neues entdeckt. Wie ich das schließlich zum Laufen brachte, war fast was du versuchst zu tun:

  1. Gehen Sie zu Projekt / Eigenschaften / Linker / Manifestdatei / Zusätzliche Manifestabhängigkeiten
  2. Geben Sie den folgenden Text ein wörtlich (dh alle einfachen und doppelten Anführungszeichen wie unten). Das ist alles in einer einzigen Zeile, übrigens.

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

  3. Speichern Sie Ihre Einstellungen und führen Sie ein FULL-Projekt (wenn nicht eine Lösung) durch, um die Manifest- und PCH-Regenerierung zu erzwingen.

Zuvor war folgendes in meiner Ladeliste:

  

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

Nachdem die Manifest-Version für allgemeine Steuerelemente manuell übergeben wurde, enthält die Ladeliste jetzt auch diese (und antwortet richtigerweise auf InitCommonControlsEx() , was der Punkt von allem an erster Stelle ist):

  

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

Hinweis: Sie können dies auch mit einem in-source # pragma tun, idealerweise in Ihrem stdafx.h-Header, aber ich bevorzuge es auf diese Weise.

Ich hoffe, es hilft.

    
WhozCraig 20.12.2012, 19:46
quelle
8

Nein, die Warnungen zu den PDB-Dateien sind nur dazu da, Ihnen zu sagen, dass Sie keine Debugging-Informationen für die Windows-System-DLLs haben. Es ist natürlich das Hauptproblem, eine FALSE-Rückgabe von InitializeCommonControlsEx () zu erhalten.

Mit der von Ihnen verwendeten Zeichenfolge für zusätzliche Manifestabhängigkeiten stimmt etwas nicht. Ich habe eine Weile daran herumgebastelt, konnte aber den Fehler nicht finden. Es ist oft einfacher, Linkeroptionen in Ihrem Quellcode anzugeben. Alles hat gut funktioniert, als ich benutzt habe:

%Vor%

Kopieren Sie einfach das obige Code-Snippet und fügen Sie es in eine Ihrer Quelldateien ein.

    
Hans Passant 20.12.2012 19:43
quelle

Tags und Links