![]() |
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:
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.
// 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 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 |
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.
|
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. |
AW: Showmessage in callback
Zitat:
|
AW: Showmessage in callback
mal schnell was zusammenkopiert...
Delphi-Quellcode:
Das leuchtet mir nicht ein. Die Value wird ja korrekt übertragen und der Statische String wird ja auch nicht angezeigt. :?// Aus der DLL type TVarCallback = procedure(Value: PAnsiChar); [..] var VarUpdateCallback: TVarCallback; [..] if assigned(VarUpdateCallback) then VarUpdateCallback(PAnsiChar(aMsg.NewValue)); [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] |
AW: Showmessage in callback
Zitat:
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. |
AW: Showmessage in callback
Probiere es mal mit einer Messagebox.
|
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 |
AW: Showmessage in callback
Eigentlich auf nichts. Nur eben keine VCL Dialoge verwenden, wie du gesehen hast.
|
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. |
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