Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Showmessage in callback (https://www.delphipraxis.net/155466-showmessage-callback.html)

Tonic1024 25. Okt 2010 11:10

Showmessage in callback
 
Ich hab einen alten Code ausgegraben, der unter D7 und W2k immer funktioniert hat und unter D2k9 und Vista nur manchmal geht.

Delphi-Quellcode:
// Zum Testen stark vereinfacht - Fehler tritt aber immernoch auf.
procedure callback(Value: PAnsiChar);
begin
  Form1.Label4.Caption:=Value; // klappt immer
  showmessage('Tadaaa');       // klappt nur selten
end;
Der Callback kommt aus einer DLL und der Wert steht beim debuggen auch in Value. Hab zum testen mal nen Text statisch reingeschrieben. Selber effekt. Die Messagebox geht auf aber ist leer. Manchmal klappts aber auch. Ich löse den callback zum Testen durch einen ButtonClick aus. Klicke ich 10 mal hab ich bestimmt ca 3 mal Text in der Messagebox. Wie gesagt, ob ich Value anzeige oder Statischen Text ist egal. Der Callback ansich funktioniert also. Es muss IMO was an der VCL klemmen.

Der Callback ist nicht Teil der Klassenstruktur also auch bewusst nicht "of object". Ich denke mir, dass der Callback asynchron rein kommt und die VCL da Schwierigkeiten hat. Gibts da nen Trick oder so? Ich kann nix syncen in meinem Mainform, oder doch?

Gruß,

Toni

Luckie 25. Okt 2010 11:15

AW: Showmessage in callback
 
Wie wird die Callback-Funktion aufgerufen aus der DLL? Ich denke, es wird an den unterschiedlichen Speichermanagern von DLL und Exe liegen. Und dass ab und zu ein Text ausgegeben wird, dürfte Zufall sein.

himitsu 25. Okt 2010 11:18

AW: Showmessage in callback
 
Da diese Prozedur ja in der EXE liegt, wird also der Speichermanager der EXE und nicht von der DLL benutzt.
Der PChar sollte auch dafür sorgen, daß die Speichermanager an dieser Stelle auch vonenander abgetrennt sind.


Was aber sein könnte.
Wird diese Callbackprozedur in einem anderem Thread ausgeführt?
Wenn ja, dann mußt du noch synchronisieren, denn die VCL ist nicht threadsicher.

Luckie 25. Okt 2010 11:21

AW: Showmessage in callback
 
Zitat:

Zitat von himitsu (Beitrag 1057646)
Da diese Prozedur ja in der EXE liegt, wird also der Speichermanager der EXE und nicht von der DLL benutzt.

Ja, aber die Daten kommen aus der DLL.

Tonic1024 25. Okt 2010 11:24

AW: Showmessage in callback
 
mal schnell was zusammenkopiert...

Delphi-Quellcode:
 
  // Aus der DLL
type
  TVarCallback = procedure(Value: PAnsiChar);

[..]

var
  VarUpdateCallback: TVarCallback;

[..]

  if assigned(VarUpdateCallback) then
    VarUpdateCallback(PAnsiChar(aMsg.NewValue));
Das leuchtet mir nicht ein. Die Value wird ja korrekt übertragen und der Statische String wird ja auch nicht angezeigt. :?


[Edit]
Also die Callback Prozedur ist nicht Teil des Mainforms, liegt aber in der selben Unit. Die innereien der DLL kenne ich nur so grob. Sie wrappt ein SDK, dass ich zwar bedienen kann aber nicht vollständig verstehe. Der Callback wird duch Netzwerk Messages ausgelöst und da wird sicher was gethreaded. War auch mein erster Gedanke (siehe 1. Beitrag).

Wie sollte ich da vorgehen um das zu testen? MEin mainform hat ja kein Sycnchonize und in der DLL hab ich ja keine Referenz auf die ich syncen könnte.
[/Edit]

himitsu 25. Okt 2010 11:30

AW: Showmessage in callback
 
Zitat:

Zitat von Luckie (Beitrag 1057647)
Ja, aber die Daten kommen aus der DLL.

Ja, die Daten kommen aus der DLL, aber es wird nicht auf deren Speichermanager zugegriffen ... nur auf Speicher, welcher von diesem Manager verwaltet wird und da gibt es keine Probleme, da nicht an der Speicherverwaltung rumgespielt wird.

Ein String als Parameter würde/könnte Probleme bereiten,
da dort Modulübergreifend an der Speicherwerwaltung rumgespielt werden könnte,
aber lesend auf einen PChar zuzugreifen ist da recht harmlos. :-D


Der Zugriff auf dieses kleine Label ist noch kein großer Eingriff, weswegen er gradenoch problemlos ablaufen könnte.
Aber soein rießiger VCL-Dialog würde auf jeden Fall zu Konflikten führen, wenn er nicht im VCL/Haupt-Thread behandelt würde.

Luckie 25. Okt 2010 11:34

AW: Showmessage in callback
 
Probiere es mal mit einer Messagebox.

Tonic1024 25. Okt 2010 11:42

AW: Showmessage in callback
 
Application.MessageBox scheint zuverlässig zu funktionieren. :?

Eigentlich will ich aber gar keine Msg ausgeben. Hab das nur eingebaut um die Funktion zu testen. Nur damit ich das richtig verstehe... Worauf muss ich achten wenn ich jetzt mit diesem callback arbeite?

Toni

Luckie 25. Okt 2010 11:44

AW: Showmessage in callback
 
Eigentlich auf nichts. Nur eben keine VCL Dialoge verwenden, wie du gesehen hast.

Bernhard Geyer 25. Okt 2010 11:47

AW: Showmessage in callback
 
Merke dir den Wert des Callbacks und benachrichtige dich intern durch eine User-Windows-Message.
Damit bist du wieder im Hauptthread der Anwendung und kannst problemlos auf die GUI-Elemente zugreifen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 Uhr.
Seite 1 von 2  1 2      

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