Tritt der Fehler auch mit installiertem SP und/oder anderen Updates auf?
Oder hast du eine D6-Version ohne irgendwelche Updates?
Der Sinn ist folgender: Um die sog. "Common Controls" (Listview, Toolbar, Tooltipps, Treeview, usw.) nutzen zu können, muss man diese mit dem Befehl
Quelltext
initialisieren. Bei der VCL passiert das meist irgendwie und irgendwo im Hintergrund, so dass das Problem nicht bzw. kaum auftritt. Arbeitet man mit der API, dann muss man sich darum selbst kümmern.
So, nun reicht einerseits beim IP-Control der o.g. Befehl nicht mehr aus, andererseits ist er von Microsoft im PSDK als
obsolete (veraltet) bezeichnet worden. Normalerweise müssen also Anwendungen den Befehl
Quelltext
benutzen. Die Einzelheiten zum Befehl spare ich mir einfach mal. Dafür lege ich den Interessenten Luckies Tutorials ans Herz. Zu sagen ist dazu einfach: wer Programme schreibt, die nur aus einer Form bestehen und keine extra-ordinären Komponenten verwenden, der kommt mit der API meist besser weg und kann sein Programm (ohne irgendwelche Laufzeitbibliotheken, @Hinterwäldler) meist auf ein Zehntel der VCL-Größe schrumpfen. Aber der Nachteil ist eben, dass man sich um alles selbst kümmern muss, was einem die VCL sonst abnimmt.
Wie gesagt: bei Interesse, Luckies Tutorials ansehen!
Borland hat in der Unit "CommCtrl.pas" nun eine eigene Funktion mit diesem Namen deklariert. Das liegt daran, dass "InitCommonControlsEx" unter Win 95 und NT4 nur mit IE3 (und höher) zur Verfügung steht.
Und als Programmierer weißt du ja, was passiert, wenn du eine nicht vorhandene DLL-Funktion statisch laden willst.
Aus dem Grund wird versucht, die Funktion dynamisch zu laden. Aus der DLL wohlgemerkt! Problem: Borland hat´s bei Delphi 5 so formuliert:
Quelltext
1: 2: 3: 4: 5: 6:
| if ComCtl32DLL = 0 then begin ComCtl32DLL := GetModuleHandle(cctrl); if ComCtl32DLL <> 0 then @_InitCommonControlsEx := GetProcAddress(ComCtl32DLL, 'InitCommonControlsEx'); end; |
Wenn also "ComCtl32DLL" Null ist, wird versucht, dass DLL-Handle zu finden:
Quelltext
1:
| ComCtl32DLL := GetModuleHandle(cctrl); |
Tja, wenn die DLL aber nicht geladen ist, passiert nichts, weil Borland IMHO nicht an diese Möglichkeit gedacht hat. Du kannst den Bug selbst ausmerzen, indem du nach der eben genannten Zeile folgendes einfügst:
Quelltext
1:
| if ComCtl32DLL = 0 then ComCtl32DLL := LoadLibrary(cctrl); |
Nur: damit können Besitzer der Standard- oder Personal-Editionen nichts anfangen, weil sie die Sourcen nicht besitzen. Für sie gilt der Work-Around, "InitCommonControls" vorher aufzurufen.
Ja, und mich interessiert nun ganz einfach, welche Delphi-Versionen noch davon betroffen sind. Ich bin bisher davon ausgegangen, dass nur D5 und bestenfalls die alten Versionen vor 5 dieses Problem haben. Dass D6 aber auch damit zu kämpfen hat (zumal Borland den Bug angeblich kennen soll), hat mich schon gewundert. Sieh´s als persönliche Frage an. Ich bin eben neugierig.
Ein spezielles Tutorial habe ich übrigens nicht gemeint. Ich würde einfach nur die Hilfedatei "CommonC.chm" mit einem entsprechenden Hinweis ergänzen wollen, da dieser Bug nun doch verbreiteter zu sein scheint, als ich erst angenommen habe.