Programmieren mit C++

Borland C++

32-Bit-Programmierung

Version von CommCtrl32 ermitteln

Welche Unterschiede gibt es bei den Common Control, Implementationenn und wie läßt sich ermitteln, welche Version der ComCtrl32 vorliegt?

Frage

Die Unterschiede in den einzelnen Implementation der Common Controls ergeben sich aus den permanenten Weiterentwicklungen bei Microsoft. Die Basisversion der Common Controls, die in der Datei COMCTL32.DLL enthalten sind, wurde mit Windows 95 ausgeliefert. Hier waren erstmals Standards wie ListView und TreeView enthalten.

Mit dem Internet Explorer 3 führte Microsoft neue Controls sowie Verbesserungen der bestehenden Controls ein. So enthielt die mit IE3 gelieferte Version von COMCTL32.DLL u.a. flache Toolbars oder auch neue Controls wie die Datums-Auswahl.

Der Internet Explorer 4 fügte als Unterstützung flache Laufleisten hinzu und änderte das Verhalten der Toolbar Control, was dazu führte, daß bestehende MFC-Anwendungen nicht mehr korrekt liefen, da die MFC-Klasse CToolBar eine fest codierte Größe für Separatoren enthielt.

Damit eine Anwendung korrekt funktionieren und von den unterschiedlichen Features Gebrauch machen kann, muß zunächst die installierte Version der Common Controls ermittelt werden. Dazu sollten die nachfolgenden Konstanten vor der Deklaration einer von CWinApp abgeleiteten Klasse eingefügt oder via spezieller Header-Datei eingebunden werden.

enum COMCTL32VERSION { COMCTL32_UNKNOWN,  COMCTL32_400, 
                       COMCTL32_470, COMCTL32_471};

Diese Konstanten sind wie nachfolgend zu interpretieren.

Konstante

Version

Lieferant

COMCTL32_UNKNOWN

-.--

unbekannt

COMCTL32_400

4.00

Windows 95

COMCTL32_470

4.70

IE 3

COMCTL32_471

4.71

IE 4

Als nächstes muß die Header-Datei der Anwendung, sowie die von CWinApp abgeleitete Klasse um die Erkennung der Common Control Version erweitert werden. Dazu wird im privaten Abschnitt ein member und im öffentlichen Abschnitt die entsprechende Funktion deklariert.

Lösung

class CMyWinApp : public CWinApp {
     ...
private:
   static COMCTL32VERSION c_nComCtl32Version;
public:
    static COMCTL32VERSION ComCtl32Version();
    ...
};

Die Anwendung selbst sollte bei der Erzeugung zunächst erst einmal unbekannte Versionen initialisieren.

COMCTL32VERSION CMyWinApp::c_nComCtl32Version = COMCTL32_UNKNOWN;

Anschließend kann die Version nach der im folgenden beschriebenen Vorgehensweise ermittelt werden. Die Funktion ComCtl32Version() lädt zunächst die DLL, falls noch nicht geschehen und die Version unbekannt ist.

COMCTL32VERSION CMyWinApp::ComCtl32Version () 
{
  if (c_nComCtl32Version == COMCTL32_UNKNOWN)  
  {
    HMODULE theModule = ::GetModuleHandle("COMCTL32");

Liegt das gültige Handle des Moduls vor, kann der Versionscheck beginnen.

Die Funktion InitCommonControlsEx() ist erst ab 4.7 verfügbar. Kann sie in dem Modul nicht gefunden werden, muß es sich konsequenterweise um Version 4.00 aus Windows 95 handeln.

    if (theModule) {
      FARPROC theProc = ::GetProcAddress(theModule, 
                                         "InitCommonControlsEx");
     if (! theProc) {
       c_nComCtl32Version = COMCTL32_400;

Ansonsten ist zwischen den Versionen 4.70 und 4.71 zu unterscheiden. Hierzu kann auf die folgenden, erst ab 4.71 verfügbaren, Symbole zurückgegriffen werden:

Erweiterung der Fensterklasse

  • DllInstall
  • FlatSB_EnableScrollBar
  • FlatSB_GetScrollInfo
  • FlatSB_GetScrollPos
  • FlatSB_GetScrollProp
  • FlatSB_GetScrollRange
  • FlatSB_SetScrollInfo
  • FlatSB_SetScrollPos
  • FlatSB_SetScrollProp
  • FlatSB_SetScrollRange
  • FlatSB_ShowScrollBar
  • _DrawIndirectImageList
  • _DuplicateImageList
  • InitializeFlatSB
  • UninitializeFlatSB

Für den Test auf Version 4.71 kann jedes der genannten Symbole verwendet werden. Nachfolgend wird „DllInstall“ benutzt. Wird dieses Symbol gefunden, muß es sich um Version 4.71 oder höher handeln, während im negativen Fall Version 4.70 vorliegt, da Version 4.00 bereits ausgeschlossen wurde.

     } else {
        FARPROC theProc = ::GetProcAddress(theModule, 
                                           "DllInstall");
        if (! theProc) {
          c_nComCtl32Version = COMCTL32_470;
        } else {
             c_nComCtl32Version = COMCTL32_471;
       }
     }
   }
  }
  return c_nComCtl32Version;
}

Nachdem die Version der Common Controls einmal ermittelt wurde, kann das Ergebnis in einem statischen Member abgelegt werden, da die DLL sich nicht mehr ändern kann. Solange die Anwendung läuft, bleibt die DLL geladen, sofern die Anwendung nicht selbst über dynamische Bibliotheksverwaltung ein Reload veranlaßt.

In der Anwendung selbst kann dann anschließend, abhängig von der vorgefundenen Version der Common Controls, von den jeweiligen Features Gebrauch gemacht werden, indem die nachfolgende Abfrage integriert und der entsprechende Code eingefügt wird.

Mit IE4 eingeführte Symbole

if (CMyWinApp::ComCtl32Version() >COMCTL_400) {
     // Features ab IE3 oder höher möglich
 }

Man kann sich die Arbeit natürlich auch erleichtern, indem man gleich eine entsprechende von CWinApp abgeleitete Klasse implementiert, die alle grundlegenden Aufgaben einmal erledigt und immer wieder verwendet werden kann.

Versionsab-hängiger Code





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 03:30:55 von textarchiv.alojado.de