Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Zugriffsverletzung ... in Modul 'comctl32.dll' ... (https://www.delphipraxis.net/158080-zugriffsverletzung-modul-comctl32-dll.html)

Wapiti 4. Feb 2011 14:16

Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Bei Verwendung der Explorer-Nachbau-Komponente TShellListView bzw. TVirtualExplorerListView erhielt ich auf unterschiedlichen Rechnern immer wieder Zugriffsverletzungen beim Aufrufen der Standard-Kontextmenüs von Dateien bei Betätigung der rechten Maustaste. Nach "Wegklicken" der Zugriffsverletzung öffnete sich das Popupmenu dann ganz normal und fehlerfrei.

Nach vielen Versuchen und insbesondere nach ewigem Suchen bin ich durch http://www.swissdelphicenter.ch/de/f...?topic=10339.0 auf die Idee gekommen, dass dies etwas mit dem XPManifest zu tun haben könnte. Also TXPManifest dem Projekt hinzugefügt und die Zugriffsverletzungen waren Geschichte. Auch nach Entfernen der Komponente bleibt das XPManifest im Recourcenbereich der Exe-Datei enthalten (???) und es gibt keine Zugriffsverletzung mehr.

Kann das einer erklären? Ich nehme an, dass dadurch andere Komponenten oder andere Funktionen der comctl32.dll genutzt werden und dies zusätzlich von der Version der DLL abhängig ist.

EWeiss 4. Feb 2011 14:24

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Zitat:

bleibt das XPManifest im Recourcenbereich der Exe-Datei enthalten (???)
Doch wohl nur so lange wie du es als resource einbindest oder?
Oder was bezweckst du mit deiner Frage?

gruss

DeddyH 4. Feb 2011 14:27

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Zitat:

Zitat von Wapiti (Beitrag 1079555)
Auch nach Entfernen der Komponente bleibt das XPManifest im Recourcenbereich der Exe-Datei enthalten (???)

Zumindest das kann ich erklären: wenn man in der IDE lediglich die Komponente entfernt, bleibt die verwendete Unit trotzdem in der uses-Klausel stehen. Da die Unit XPMan nichts anderes tut, als die Mainfest-Ressource einzubinden, bleiben die Laufzeitthemes erhalten. Man kann übrigens auch ganz auf die Komponente verzichten und XPMan händisch in die uses einfügen, der Effekt ist derselbe.

Wapiti 4. Feb 2011 14:30

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Ich habe sie als VCL-Komponente eingebunden und dann wieder gelöscht. Was die so genau im Hintergrund macht ... keine Ahnung.

DeddyH 4. Feb 2011 14:33

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Zitat:

Zitat von XPMan.pas von D2007
Delphi-Quellcode:
type
  TXPManifest = class(TComponent)
  end;

{$R WindowsXP.res}

implementation

end.

Wie man sieht, macht die überhaupt nichts, sondern sorgt nur dafür, dass die Ressource WindowsXP.res eingebunden wird.

Wapiti 4. Feb 2011 14:34

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Stimmt. Aber die eigentliche Frage ist eben: Was passiert die eigentlich bei Delphi bzw. im Windows?

EWeiss 5. Feb 2011 09:07

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Zitat:

Zitat von Wapiti (Beitrag 1079564)
Was passiert die eigentlich bei Delphi bzw. im Windows?

Denke mal du meinst was das Manifest unter Windows bewirkt..

Es ermöglicht dir die Windows Theme in deinem Programm zu übernehmen ohne das du selber etwas programmieren mußt.

Luckie 5. Feb 2011 12:58

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Das ist aber nur die halbe Wahrheit. Mit dem Manifest sagt man Windows auch, dass man bestimmte Versionen von DLLs benötigt und diese geladen werden sollen und es legt fest mit welchen Rechten das Programm gestartet werden soll.

EWeiss 5. Feb 2011 14:09

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Zitat:

Zitat von Luckie (Beitrag 1079687)
Das ist aber nur die halbe Wahrheit. Mit dem Manifest sagt man Windows auch, dass man bestimmte Versionen von DLLs benötigt und diese geladen werden sollen und es legt fest mit welchen Rechten das Programm gestartet werden soll.

Richtig ;)

Wapiti 8. Feb 2011 13:09

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Dann ist es wohl so, dass sich die comctl32.dll irgendwie inkompatibel weiterentwickelt hat und so auf die ältere Delphi-Version gezwungen werden muss. Soweit ich mich erinnere war oder ist so was bei z.B. DirectX verboten und es müssen in solchen Fällen neue Funktionen angelegt werden.

Das Tolle ist dabei, dass ggf. ein älteres Programm plötzlich nicht mehr funktioniert und angepasst werden muss. Genial.
http://www.mustangpeak.net/download/virtualexplorer.zip

EWeiss 8. Feb 2011 14:02

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Verstehe das Thema nicht so richtig .
Um was geht es dir ?

Hab die Exe getestet kein Absturz und beinhaltet kein Manifest.
Ausgenommen beim Klick auf About (AV read from adress $00000..)

gruss

Wapiti 10. Feb 2011 10:38

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Bei mir kommt die Schutzverletzung auf drei verschiedenen XP-Rechnern, wenn ich mit der rechtem Maustaste auf eine Datei oder einen Ordner klicke bevor das Popup-Menu erscheint. Mit Manifest ist sie dann weg. Sie kommt nicht, wenn ich auf einen Systemordner klicke. Sie kommt auch nicht, wenn ich in den freien Bereich der Dateiliste klicke.

himitsu 10. Feb 2011 11:21

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Jupp, also das Manifest ist einfach nur eine XML-Datei, welche entwerder als Resource in die EXE/DLL reingelinkt oder neben die EXE gelegt wird ( MeineApp.exe.manifest ).

In diesesm Manifest kann man Windows besitmmte Dinge mitteilen, z.B. die Nutzung der neuen comctl32.dll, anstatt der Alten, ob der neue XP-Style genutzt werden soll, dann noch die Dateisystemumleitungen von Vista/Win7, welche COM-DLLs geladen werden sollen (also welche Version davon), welche Rechte (Admin oder nicht) das Programm benötigt usw.

Einige der Möglichkeiten kann man sich in meinem Hier im Forum suchenManifest-Creator und den dort verlinkten MSDN-Einträgen gerne ansehn.

Das alte TXPManifest/XPMan bietet nur die Möglichkeit der neuen ComCtrl32.dll und damit des "neuen" XP-Styles.
Seit Delphi 2010 ( oder 2009? ) kann man auch noch die Admin-Rechte über's Delphi steuern.

EWeiss 10. Feb 2011 14:22

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Sein Problem ist das er einen fehler in der 'comctl32.dll' hat wenn er keine Manifest verwendet.
Das Manifest verhindert also das er die "FALSCHE" comctl32.dll initialisiert davon gibt es mehrere Versionen.
Deshalb kommt er nicht drum herum dieses in sein Projekt mit einzubinden.

Nicht alle comctl32 unterstützen XP-Styles.
Und wenn deine komponente darauf ausgelegt ist kommst du nicht um ein Manifest herum.

gruss

Wapiti 10. Feb 2011 14:38

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Mit dem Manifest sucht er die "neue" mit einer Version größer gleich 6:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
     type="win32"
    name="DelphiApplication"
    version="1.0.0.0"
     processorArchitecture="*"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
</assembly>
während die "normale" (in der system32) die Versionsnummer 5.82.2900.6028 hat. Das Manifest schaltet nun auf den WinSxS-Ordner (Was ist der WinSxS Ordner) um und findet hier nun unter anderen die neuste Version 6.0.2900.6028. Das ist dann soweit mit allen Details klar.

Wo ist nun der Bug? Die Zugriffsverletzung in den Tiefen der comctl32 taucht bei beiden Komponenten bei einem derartigen Konstrukt auf:
Delphi-Quellcode:
Menu := CreatePopupMenu;
try
  CM.QueryContextMenu(Menu, 0, 1, $7FFF, CMF_EXPLORE or CMF_CANRENAME);
danach geht's normal weiter. Das ganze ist jetzt "einfach nur noch interessant". Ob der Delphi-Compiler oder Windows nun das Problem ist, hilft nicht mehr besonders weiter. In anderer Sprachen/Sprachversionen/Konfigurationen funktioniert es wohl, wie man sieht. Und wieviel Leute verwenden schon diesen Methodenaufruf direkt...

EWeiss 10. Feb 2011 15:00

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Von was ist CM abgeleitet dein Handler ?

EDIT:
Was mir noch auffällt
Ein in dieser zeile generierter Fehler
Delphi-Quellcode:
Menu := CreatePopupMenu;
try
  CM.QueryContextMenu(Menu, 0, 1, $7FFF, CMF_EXPLORE or CMF_CANRENAME);
hat nichts mit der comctl32.dll zu tun sondern mit der Shell32.dll

gruss

Wapiti 10. Feb 2011 17:01

AW: Zugriffsverletzung ... in Modul 'comctl32.dll' ...
 
Ist ein Stück aus der ShellCtrls.pas der mitgelieferten Demos.
Delphi-Quellcode:
var
  CM: IContextMenu;
  Menu: HMenu;


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz