VCL-Style Probleme in der DLL

8

Ich habe eine DLL mit einer Form entwickelt. Ich habe einen Stil mit dem folgenden Code festgelegt.

%Vor%

Wenn ich diese DLL lade und function1 aufruft, öffnet sich dieses Formular. Das Formular wird geöffnet, wobei Stil angewendet wird.

Jetzt bekomme ich eine Zugriffsverletzung, wenn ich dieses Fenster minimiere. Alles inklusive Maximieren & amp; Wiederherstellung funktioniert gut. Auch die ganze Funktionalität funktioniert gut.

Ich denke, es verarbeitet keine Nachricht, die durch das Minimize-Ereignis dieses Formulars generiert wurde. Bitte um Rat.

Hinweis: Wenn ich den Stil lösche, funktioniert alles einwandfrei.

%Vor%

UPDATE: SSCCE

Project1.EXE (mit einem Formular Unit1.pas / dfm)

%Vor%

Erstellen Sie eine DLL Project2.dll mit Einheit2 als jede Form und Einheit3, die dieses Formular aufrufen wird. Fügen Sie dieser DLL einen Stil (zB AnyStyle1) als Ressource hinzu.

%Vor%

unit3.pas

%Vor%

Drücken Sie nun den Minimieren Knopf des Unit2 Fensters. Sie erhalten eine Zugriffsverletzung.

    
Dev 29.08.2013, 04:18
quelle

2 Antworten

5

Der Grund für die Zugriffsverletzung liegt darin, dass vcl-Stile in Delphi XE2 anscheinend nicht mit VCL-Stilen in einer DLL entworfen wurden. Der AV wird in den WM_SIZE -Handler des Formularstil-Hooks geworfen:

%Vor%

Der Style-Hook testet, ob die Nachricht im Hauptformular bearbeitet wird, aber in einer DLL gibt es kein Hauptformular. Der Zugriff auf das Handle der nicht zugewiesenen Referenz verursacht die Ausnahme.


Die folgende Problemumgehung führt einen Abkömmlingsart-Hook ein, um dies zu verhindern, umgeht die Prüfung für das Hauptformular und lässt die Verarbeitung der Nachricht bei TWinControl weiterlaufen.

Dies ist die gesamte, modifizierte 'unit3' in der DLL:

%Vor%

Beachten Sie auch die Möglichkeit, weiterhin Probleme wie diese zu begegnen, wenn Sie Stile in einer DLL verwenden möchten.

    
Sertac Akyuz 29.08.2013, 19:58
quelle
0

Sie sollten bouth dll und exe in der gleichen Version von RAD Studio mit aktivierten "Runtime-Paketen" kompilieren. Nur in diesem Fall funktioniert form in dll einwandfrei.

    
Torbins 29.08.2013 08:58
quelle

Tags und Links